From d04c8a563c09d6449d5663aa2b57840653defae5 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Fri, 4 Dec 2009 15:54:12 -0800 Subject: [PATCH] Atomic64 compatibility for 32-bit systems without kernel support. This patch is another step towards updating the code to handle the 32-bit kernels which I have not been regularly testing. This changes do not really impact the common case I'm expected which is the latest kernel running on an x86_64 arch. Until the linux-2.6.31 kernel the x86 arch did not have support for 64-bit atomic operations. Additionally, the new atomic_compat.h support for this case was wrong because it embedded a spinlock in the atomic variable which must always and only be 64-bits total. To handle these 32-bit issues we now simply fall back to the --enable-atomic-spinlock implementation if the kernel does not provide the 64-bit atomic funcs. The second issue this patch addresses is the DEBUG_KMEM assumption that there will always be atomic64 funcs available. On 32-bit archs this may not be true, and actually that's just fine. In that case the kernel will will never be able to allocate more the 32-bits worth anyway. So just check if atomic64 funcs are available, if they are not it means this is a 32-bit machine and we can safely use atomic_t's instead. --- config/spl-build.m4 | 107 +++++----- configure | 406 ++++++++++++++++++++--------------- include/Makefile.am | 1 - include/Makefile.in | 6 +- include/asm/Makefile.in | 414 ------------------------------------ include/asm/atomic_compat.h | 99 --------- include/sys/atomic.h | 9 +- include/sys/kmem.h | 30 ++- module/spl/spl-kmem.c | 92 ++++---- module/spl/spl-proc.c | 20 +- 10 files changed, 396 insertions(+), 788 deletions(-) delete mode 100644 include/asm/Makefile.in delete mode 100644 include/asm/atomic_compat.h diff --git a/config/spl-build.m4 b/config/spl-build.m4 index 8e0eca6d20..9fa7bc8118 100644 --- a/config/spl-build.m4 +++ b/config/spl-build.m4 @@ -25,10 +25,9 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [ SPL_AC_DEBUG_KMEM SPL_AC_DEBUG_KMEM_TRACKING SPL_AC_ATOMIC_SPINLOCK - SPL_AC_TYPE_UINTPTR_T - SPL_AC_TYPE_ATOMIC64_T SPL_AC_TYPE_ATOMIC64_CMPXCHG SPL_AC_TYPE_ATOMIC64_XCHG + SPL_AC_TYPE_UINTPTR_T SPL_AC_3ARGS_INIT_WORK SPL_AC_2ARGS_REGISTER_SYSCTL SPL_AC_SET_SHRINKER @@ -285,27 +284,6 @@ AC_DEFUN([SPL_AC_DEBUG_KMEM_TRACKING], [ AC_MSG_RESULT([$enable_debug_kmem_tracking]) ]) -dnl # -dnl # Use the atomic implemenation based on global spinlocks. This -dnl # should never be needed, however it has been left in place as -dnl # a fallback option in case problems are observed with directly -dnl # mapping to the native Linux atomic operations. -dnl # -AC_DEFUN([SPL_AC_ATOMIC_SPINLOCK], [ - AC_ARG_ENABLE([atomic-spinlocks], - [AS_HELP_STRING([--enable-atomic-spinlocks], - [Atomic types use spinlocks @<:@default=no@:>@])], - [], - [enable_atomic_spinlocks=no]) - - AS_IF([test "x$enable_atomic_spinlocks" = xyes], - [AC_DEFINE([ATOMIC_SPINLOCK], [1], - [Atomic types use spinlocks])]) - - AC_MSG_CHECKING([whether atomic types use spinlocks]) - AC_MSG_RESULT([$enable_atomic_spinlocks]) -]) - dnl # dnl # SPL_LINUX_CONFTEST dnl # @@ -433,41 +411,55 @@ AC_DEFUN([SPL_CHECK_HEADER], ]) dnl # -dnl # 2.6.24 API change, -dnl # check if uintptr_t typedef is defined +dnl # Use the atomic implemenation based on global spinlocks. This +dnl # should only be needed by 32-bit kernels which do not provide +dnl # the atomic64_* API. It may be optionally enabled as a fallback +dnl # if problems are observed with the direct mapping to the native +dnl # Linux atomic operations. You may not disable atomic spinlocks +dnl # if you kernel does not an atomic64_* API. dnl # -AC_DEFUN([SPL_AC_TYPE_UINTPTR_T], - [AC_MSG_CHECKING([whether kernel defines uintptr_t]) - SPL_LINUX_TRY_COMPILE([ - #include - ],[ - uintptr_t *ptr; - ],[ - AC_MSG_RESULT([yes]) - AC_DEFINE(HAVE_UINTPTR_T, 1, - [kernel defines uintptr_t]) - ],[ - AC_MSG_RESULT([no]) - ]) -]) +AC_DEFUN([SPL_AC_ATOMIC_SPINLOCK], [ + AC_ARG_ENABLE([atomic-spinlocks], + [AS_HELP_STRING([--enable-atomic-spinlocks], + [Atomic types use spinlocks @<:@default=check@:>@])], + [], + [enable_atomic_spinlocks=check]) -dnl # -dnl # 2.6.x API change, -dnl # check if atomic64_t typedef is defined -dnl # -AC_DEFUN([SPL_AC_TYPE_ATOMIC64_T], - [AC_MSG_CHECKING([whether kernel defines atomic64_t]) SPL_LINUX_TRY_COMPILE([ #include ],[ atomic64_t *ptr; ],[ - AC_MSG_RESULT([yes]) + have_atomic64_t=yes AC_DEFINE(HAVE_ATOMIC64_T, 1, - [kernel defines atomic64_t]) + [kernel defines atomic64_t]) ],[ - AC_MSG_RESULT([no]) + have_atomic64_t=no ]) + + AS_IF([test "x$enable_atomic_spinlocks" = xcheck], [ + AS_IF([test "x$have_atomic64_t" = xyes], [ + enable_atomic_spinlocks=no + ],[ + enable_atomic_spinlocks=yes + ]) + ]) + + AS_IF([test "x$enable_atomic_spinlocks" = xyes], [ + AC_DEFINE([ATOMIC_SPINLOCK], [1], + [Atomic types use spinlocks]) + ],[ + AS_IF([test "x$have_atomic64_t" = xno], [ + AC_MSG_FAILURE( + [--disable-atomic-spinlocks given but required atomic64 support is unavailable]) + ]) + ]) + + AC_MSG_CHECKING([whether atomic types use spinlocks]) + AC_MSG_RESULT([$enable_atomic_spinlocks]) + + AC_MSG_CHECKING([whether kernel defines atomic64_t]) + AC_MSG_RESULT([$have_atomic64_t]) ]) dnl # @@ -508,6 +500,25 @@ AC_DEFUN([SPL_AC_TYPE_ATOMIC64_XCHG], ]) ]) +dnl # +dnl # 2.6.24 API change, +dnl # check if uintptr_t typedef is defined +dnl # +AC_DEFUN([SPL_AC_TYPE_UINTPTR_T], + [AC_MSG_CHECKING([whether kernel defines uintptr_t]) + SPL_LINUX_TRY_COMPILE([ + #include + ],[ + uintptr_t *ptr; + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_UINTPTR_T, 1, + [kernel defines uintptr_t]) + ],[ + AC_MSG_RESULT([no]) + ]) +]) + dnl # dnl # 2.6.20 API change, dnl # INIT_WORK use 2 args and not store data inside diff --git a/configure b/configure index 8f644abf45..192a08442f 100755 --- a/configure +++ b/configure @@ -1039,7 +1039,7 @@ Optional Features: --enable-debug-kmem-tracking Enable detailed kmem tracking [default=no] --enable-atomic-spinlocks - Atomic types use spinlocks [default=no] + Atomic types use spinlocks [default=check] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -19160,89 +19160,9 @@ if test "${enable_atomic_spinlocks+set}" = set; then enableval="$enable_atomic_spinlocks" else - enable_atomic_spinlocks=no + enable_atomic_spinlocks=check fi; - if test "x$enable_atomic_spinlocks" = xyes; then - -cat >>confdefs.h <<\_ACEOF -#define ATOMIC_SPINLOCK 1 -_ACEOF - -fi - - - echo "$as_me:$LINENO: checking whether atomic types use spinlocks" >&5 -echo $ECHO_N "checking whether atomic types use spinlocks... $ECHO_C" >&6 - echo "$as_me:$LINENO: result: $enable_atomic_spinlocks" >&5 -echo "${ECHO_T}$enable_atomic_spinlocks" >&6 - - echo "$as_me:$LINENO: checking whether kernel defines uintptr_t" >&5 -echo $ECHO_N "checking whether kernel defines uintptr_t... $ECHO_C" >&6 - - -cat >conftest.c <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - - #include - -int -main (void) -{ - - uintptr_t *ptr; - - ; - return 0; -} - -_ACEOF - - - rm -Rf build && mkdir -p build - echo "obj-m := conftest.o" >build/Makefile - if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -cat >>confdefs.h <<\_ACEOF -#define HAVE_UINTPTR_T 1 -_ACEOF - - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - - - -fi - - rm -Rf build - - - - echo "$as_me:$LINENO: checking whether kernel defines atomic64_t" >&5 -echo $ECHO_N "checking whether kernel defines atomic64_t... $ECHO_C" >&6 cat >conftest.c <<_ACEOF @@ -19282,8 +19202,7 @@ _ACEOF echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + have_atomic64_t=yes cat >>confdefs.h <<\_ACEOF #define HAVE_ATOMIC64_T 1 @@ -19294,8 +19213,7 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + have_atomic64_t=no @@ -19305,6 +19223,56 @@ fi + if test "x$enable_atomic_spinlocks" = xcheck; then + + if test "x$have_atomic64_t" = xyes; then + + enable_atomic_spinlocks=no + +else + + enable_atomic_spinlocks=yes + +fi + + +fi + + + if test "x$enable_atomic_spinlocks" = xyes; then + + +cat >>confdefs.h <<\_ACEOF +#define ATOMIC_SPINLOCK 1 +_ACEOF + + +else + + if test "x$have_atomic64_t" = xno; then + + { { echo "$as_me:$LINENO: error: --disable-atomic-spinlocks given but required atomic64 support is unavailable +See \`config.log' for more details." >&5 +echo "$as_me: error: --disable-atomic-spinlocks given but required atomic64 support is unavailable +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +fi + + +fi + + + echo "$as_me:$LINENO: checking whether atomic types use spinlocks" >&5 +echo $ECHO_N "checking whether atomic types use spinlocks... $ECHO_C" >&6 + echo "$as_me:$LINENO: result: $enable_atomic_spinlocks" >&5 +echo "${ECHO_T}$enable_atomic_spinlocks" >&6 + + echo "$as_me:$LINENO: checking whether kernel defines atomic64_t" >&5 +echo $ECHO_N "checking whether kernel defines atomic64_t... $ECHO_C" >&6 + echo "$as_me:$LINENO: result: $have_atomic64_t" >&5 +echo "${ECHO_T}$have_atomic64_t" >&6 + echo "$as_me:$LINENO: checking whether kernel defines atomic64_cmpxchg" >&5 echo $ECHO_N "checking whether kernel defines atomic64_cmpxchg... $ECHO_C" >&6 @@ -19427,6 +19395,70 @@ echo "${ECHO_T}no" >&6 +fi + + rm -Rf build + + + + echo "$as_me:$LINENO: checking whether kernel defines uintptr_t" >&5 +echo $ECHO_N "checking whether kernel defines uintptr_t... $ECHO_C" >&6 + + +cat >conftest.c <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + + #include + +int +main (void) +{ + + uintptr_t *ptr; + + ; + return 0; +} + +_ACEOF + + + rm -Rf build && mkdir -p build + echo "obj-m := conftest.o" >build/Makefile + if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_UINTPTR_T 1 +_ACEOF + + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + + + fi rm -Rf build @@ -22409,89 +22441,9 @@ if test "${enable_atomic_spinlocks+set}" = set; then enableval="$enable_atomic_spinlocks" else - enable_atomic_spinlocks=no + enable_atomic_spinlocks=check fi; - if test "x$enable_atomic_spinlocks" = xyes; then - -cat >>confdefs.h <<\_ACEOF -#define ATOMIC_SPINLOCK 1 -_ACEOF - -fi - - - echo "$as_me:$LINENO: checking whether atomic types use spinlocks" >&5 -echo $ECHO_N "checking whether atomic types use spinlocks... $ECHO_C" >&6 - echo "$as_me:$LINENO: result: $enable_atomic_spinlocks" >&5 -echo "${ECHO_T}$enable_atomic_spinlocks" >&6 - - echo "$as_me:$LINENO: checking whether kernel defines uintptr_t" >&5 -echo $ECHO_N "checking whether kernel defines uintptr_t... $ECHO_C" >&6 - - -cat >conftest.c <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - - #include - -int -main (void) -{ - - uintptr_t *ptr; - - ; - return 0; -} - -_ACEOF - - - rm -Rf build && mkdir -p build - echo "obj-m := conftest.o" >build/Makefile - if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -cat >>confdefs.h <<\_ACEOF -#define HAVE_UINTPTR_T 1 -_ACEOF - - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - - - -fi - - rm -Rf build - - - - echo "$as_me:$LINENO: checking whether kernel defines atomic64_t" >&5 -echo $ECHO_N "checking whether kernel defines atomic64_t... $ECHO_C" >&6 cat >conftest.c <<_ACEOF @@ -22531,8 +22483,7 @@ _ACEOF echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + have_atomic64_t=yes cat >>confdefs.h <<\_ACEOF #define HAVE_ATOMIC64_T 1 @@ -22543,8 +22494,7 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + have_atomic64_t=no @@ -22554,6 +22504,56 @@ fi + if test "x$enable_atomic_spinlocks" = xcheck; then + + if test "x$have_atomic64_t" = xyes; then + + enable_atomic_spinlocks=no + +else + + enable_atomic_spinlocks=yes + +fi + + +fi + + + if test "x$enable_atomic_spinlocks" = xyes; then + + +cat >>confdefs.h <<\_ACEOF +#define ATOMIC_SPINLOCK 1 +_ACEOF + + +else + + if test "x$have_atomic64_t" = xno; then + + { { echo "$as_me:$LINENO: error: --disable-atomic-spinlocks given but required atomic64 support is unavailable +See \`config.log' for more details." >&5 +echo "$as_me: error: --disable-atomic-spinlocks given but required atomic64 support is unavailable +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +fi + + +fi + + + echo "$as_me:$LINENO: checking whether atomic types use spinlocks" >&5 +echo $ECHO_N "checking whether atomic types use spinlocks... $ECHO_C" >&6 + echo "$as_me:$LINENO: result: $enable_atomic_spinlocks" >&5 +echo "${ECHO_T}$enable_atomic_spinlocks" >&6 + + echo "$as_me:$LINENO: checking whether kernel defines atomic64_t" >&5 +echo $ECHO_N "checking whether kernel defines atomic64_t... $ECHO_C" >&6 + echo "$as_me:$LINENO: result: $have_atomic64_t" >&5 +echo "${ECHO_T}$have_atomic64_t" >&6 + echo "$as_me:$LINENO: checking whether kernel defines atomic64_cmpxchg" >&5 echo $ECHO_N "checking whether kernel defines atomic64_cmpxchg... $ECHO_C" >&6 @@ -22676,6 +22676,70 @@ echo "${ECHO_T}no" >&6 +fi + + rm -Rf build + + + + echo "$as_me:$LINENO: checking whether kernel defines uintptr_t" >&5 +echo $ECHO_N "checking whether kernel defines uintptr_t... $ECHO_C" >&6 + + +cat >conftest.c <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + + #include + +int +main (void) +{ + + uintptr_t *ptr; + + ; + return 0; +} + +_ACEOF + + + rm -Rf build && mkdir -p build + echo "obj-m := conftest.o" >build/Makefile + if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_UINTPTR_T 1 +_ACEOF + + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + + + fi rm -Rf build diff --git a/include/Makefile.am b/include/Makefile.am index 3388ce8d95..6ed7cdad8a 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -3,7 +3,6 @@ # location. We do not want to be using $includedir for this. # Installation is handled by the custom install-data-local rule. noinst_HEADERS = *.h -noinst_HEADERS += asm/*.h noinst_HEADERS += fs/*.h noinst_HEADERS += linux/*.h noinst_HEADERS += rpc/*.h diff --git a/include/Makefile.in b/include/Makefile.in index 50785f69f9..0aba5a0b8d 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -184,8 +184,8 @@ target_vendor = @target_vendor@ # noinst_HEADERS because they are not installed in the usual include # location. We do not want to be using $includedir for this. # Installation is handled by the custom install-data-local rule. -noinst_HEADERS = *.h asm/*.h fs/*.h linux/*.h rpc/*.h sharefs/*.h \ - sys/fm/*.h sys/fs/*.h sys/sysevent/*.h sys/*.h util/*.h vm/*.h +noinst_HEADERS = *.h fs/*.h linux/*.h rpc/*.h sharefs/*.h sys/fm/*.h \ + sys/fs/*.h sys/sysevent/*.h sys/*.h util/*.h vm/*.h all: all-am .SUFFIXES: @@ -278,7 +278,7 @@ distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/asm $(distdir)/fs $(distdir)/linux $(distdir)/rpc $(distdir)/sharefs $(distdir)/sys $(distdir)/sys/fm $(distdir)/sys/fs $(distdir)/sys/sysevent $(distdir)/util $(distdir)/vm + $(mkdir_p) $(distdir)/fs $(distdir)/linux $(distdir)/rpc $(distdir)/sharefs $(distdir)/sys $(distdir)/sys/fm $(distdir)/sys/fs $(distdir)/sys/sysevent $(distdir)/util $(distdir)/vm @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ diff --git a/include/asm/Makefile.in b/include/asm/Makefile.in deleted file mode 100644 index fb8283de27..0000000000 --- a/include/asm/Makefile.in +++ /dev/null @@ -1,414 +0,0 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = include/asm -DIST_COMMON = $(nobase_include_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/config/spl-build.m4 \ - $(top_srcdir)/config/spl-meta.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/spl_config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; -am__installdirs = "$(DESTDIR)$(includedir)" -nobase_includeHEADERS_INSTALL = $(install_sh_DATA) -HEADERS = $(nobase_include_HEADERS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KERNELCFLAGS = @KERNELCFLAGS@ -KERNELCPPFLAGS = @KERNELCPPFLAGS@ -KERNELMAKE_PARAMS = @KERNELMAKE_PARAMS@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LINUX = @LINUX@ -LINUX_OBJ = @LINUX_OBJ@ -LINUX_VERSION = @LINUX_VERSION@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ -MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ -MAKEINFO = @MAKEINFO@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SPL_META_ALIAS = @SPL_META_ALIAS@ -SPL_META_AUTHOR = @SPL_META_AUTHOR@ -SPL_META_DATA = @SPL_META_DATA@ -SPL_META_LT_AGE = @SPL_META_LT_AGE@ -SPL_META_LT_CURRENT = @SPL_META_LT_CURRENT@ -SPL_META_LT_REVISION = @SPL_META_LT_REVISION@ -SPL_META_NAME = @SPL_META_NAME@ -SPL_META_RELEASE = @SPL_META_RELEASE@ -SPL_META_VERSION = @SPL_META_VERSION@ -STRIP = @STRIP@ -VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -nobase_include_HEADERS = *.h -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/asm/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu include/asm/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-nobase_includeHEADERS: $(nobase_include_HEADERS) - @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)" - @$(am__vpath_adj_setup) \ - list='$(nobase_include_HEADERS)'; for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - $(am__vpath_adj) \ - echo " $(nobase_includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ - $(nobase_includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ - done - -uninstall-nobase_includeHEADERS: - @$(NORMAL_UNINSTALL) - @$(am__vpath_adj_setup) \ - list='$(nobase_include_HEADERS)'; for p in $$list; do \ - $(am__vpath_adj) \ - echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ - rm -f "$(DESTDIR)$(includedir)/$$f"; \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(HEADERS) -installdirs: - for dir in "$(DESTDIR)$(includedir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: install-nobase_includeHEADERS - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am uninstall-nobase_includeHEADERS - -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libtool ctags distclean distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-nobase_includeHEADERS \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-info-am \ - uninstall-nobase_includeHEADERS - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/include/asm/atomic_compat.h b/include/asm/atomic_compat.h deleted file mode 100644 index 5eaccd7e76..0000000000 --- a/include/asm/atomic_compat.h +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef _SPL_ATOMIC_COMPAT_H -#define _SPL_ATOMIC_COMPAT_H - -#include -#include - -#ifndef HAVE_ATOMIC64_T -#include - -typedef struct { - spinlock_t lock; - __s64 val; -} atomic64_t; - -#define ATOMIC64_INIT(i) { .lock = SPIN_LOCK_UNLOCKED, .val = (i) } - -static inline void atomic64_add(__s64 i, atomic64_t *v) -{ - unsigned long flags; - - spin_lock_irqsave(&v->lock, flags); - v->val += i; - spin_unlock_irqrestore(&v->lock, flags); -} - -static inline void atomic64_sub(__s64 i, atomic64_t *v) -{ - unsigned long flags; - - spin_lock_irqsave(&v->lock, flags); - v->val -= i; - spin_unlock_irqrestore(&v->lock, flags); -} - -#define atomic64_inc(v) (atomic64_add(1, (v))) -#define atomic64_dec(v) (atomic64_sub(1, (v))) - -static inline __s64 atomic64_add_return(__s64 i, atomic64_t *v) -{ - unsigned long flags; - __s64 ret; - - spin_lock_irqsave(&v->lock, flags); - v->val += i; - ret = v->val; - spin_unlock_irqrestore(&v->lock, flags); - - return ret; -} - -static inline __s64 atomic64_sub_return(__s64 i, atomic64_t *v) -{ - unsigned long flags; - __s64 ret; - - spin_lock_irqsave(&v->lock, flags); - v->val -= i; - ret = v->val; - spin_unlock_irqrestore(&v->lock, flags); - - return ret; -} - -#define atomic64_inc_return(v) (atomic64_add_return(1, (v))) -#define atomic64_dec_return(v) (atomic64_sub_return(1, (v))) - -static inline __s64 atomic64_read(atomic64_t *v) -{ - unsigned long flags; - __s64 r; - - spin_lock_irqsave(&v->lock, flags); - r = v->val; - spin_unlock_irqrestore(&v->lock, flags); - - return r; -} - -static inline void atomic64_set(atomic64_t *v, __s64 i) -{ - unsigned long flags; - - spin_lock_irqsave(&v->lock, flags); - v->val = i; - spin_unlock_irqrestore(&v->lock, flags); -} - -#endif /* HAVE_ATOMIC64_T */ - -#ifndef HAVE_ATOMIC64_CMPXCHG -#define atomic64_cmpxchg(v, o, n) (cmpxchg(&((v)->counter), (o), (n))) -#endif - -#ifndef HAVE_ATOMIC64_XCHG -#define atomic64_xchg(v, n) (xchg(&((v)->counter), n)) -#endif - -#endif /* _SPL_ATOMIC_COMPAT_H */ - diff --git a/include/sys/atomic.h b/include/sys/atomic.h index 7a741de175..f522781fc8 100644 --- a/include/sys/atomic.h +++ b/include/sys/atomic.h @@ -30,7 +30,14 @@ #include #include #include -#include + +#ifndef HAVE_ATOMIC64_CMPXCHG +#define atomic64_cmpxchg(v, o, n) (cmpxchg(&((v)->counter), (o), (n))) +#endif + +#ifndef HAVE_ATOMIC64_XCHG +#define atomic64_xchg(v, n) (xchg(&((v)->counter), n)) +#endif /* * Two approaches to atomic operations are implemented each with its diff --git a/include/sys/kmem.h b/include/sys/kmem.h index fdeba70d1f..f40d0813d7 100644 --- a/include/sys/kmem.h +++ b/include/sys/kmem.h @@ -41,7 +41,7 @@ extern "C" { #include #include #include -#include +#include #include #include #include @@ -109,12 +109,40 @@ kmalloc_node_nofail(size_t size, gfp_t flags, int node) #endif /* HAVE_KMALLOC_NODE */ #ifdef DEBUG_KMEM +# ifdef HAVE_ATOMIC64_T extern atomic64_t kmem_alloc_used; extern unsigned long long kmem_alloc_max; extern atomic64_t vmem_alloc_used; extern unsigned long long vmem_alloc_max; +# define kmem_alloc_used_add(size) atomic64_add(size, &kmem_alloc_used) +# define kmem_alloc_used_sub(size) atomic64_sub(size, &kmem_alloc_used) +# define kmem_alloc_used_read() atomic64_read(&kmem_alloc_used) +# define kmem_alloc_used_set(size) atomic64_set(&kmem_alloc_used, size) +# define vmem_alloc_used_add(size) atomic64_add(size, &vmem_alloc_used) +# define vmem_alloc_used_sub(size) atomic64_sub(size, &vmem_alloc_used) +# define vmem_alloc_used_read() atomic64_read(&vmem_alloc_used) +# define vmem_alloc_used_set(size) atomic64_set(&vmem_alloc_used, size) + +# else + +extern atomic_t kmem_alloc_used; +extern unsigned long long kmem_alloc_max; +extern atomic_t vmem_alloc_used; +extern unsigned long long vmem_alloc_max; + +# define kmem_alloc_used_add(size) atomic_add(size, &kmem_alloc_used) +# define kmem_alloc_used_sub(size) atomic_sub(size, &kmem_alloc_used) +# define kmem_alloc_used_read() atomic_read(&kmem_alloc_used) +# define kmem_alloc_used_set(size) atomic_set(&kmem_alloc_used, size) +# define vmem_alloc_used_add(size) atomic_add(size, &vmem_alloc_used) +# define vmem_alloc_used_sub(size) atomic_sub(size, &vmem_alloc_used) +# define vmem_alloc_used_read() atomic_read(&vmem_alloc_used) +# define vmem_alloc_used_set(size) atomic_set(&vmem_alloc_used, size) + +# endif /* _LP64 */ + # define kmem_alloc(size, flags) __kmem_alloc((size), (flags), 0, 0) # define kmem_zalloc(size, flags) __kmem_alloc((size), ((flags) | \ __GFP_ZERO), 0, 0) diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c index b86a8ad82f..64498ee5d7 100644 --- a/module/spl/spl-kmem.c +++ b/module/spl/spl-kmem.c @@ -215,11 +215,19 @@ EXPORT_SYMBOL(vmem_size); * report any memory leaked when the module is unloaded. */ #ifdef DEBUG_KMEM + /* Shim layer memory accounting */ +# ifdef HAVE_ATOMIC64_T atomic64_t kmem_alloc_used = ATOMIC64_INIT(0); unsigned long long kmem_alloc_max = 0; atomic64_t vmem_alloc_used = ATOMIC64_INIT(0); unsigned long long vmem_alloc_max = 0; +# else +atomic_t kmem_alloc_used = ATOMIC_INIT(0); +unsigned long long kmem_alloc_max = 0; +atomic_t vmem_alloc_used = ATOMIC_INIT(0); +unsigned long long vmem_alloc_max = 0; +# endif /* _LP64 */ int kmem_warning_flag = 1; EXPORT_SYMBOL(kmem_alloc_used); @@ -392,7 +400,7 @@ kmem_alloc_track(size_t size, int flags, const char *func, int line, if (unlikely((size) > (PAGE_SIZE * 2)) && kmem_warning_flag) CWARN("Large kmem_alloc(%llu, 0x%x) (%lld/%llu)\n", (unsigned long long) size, flags, - atomic64_read(&kmem_alloc_used), kmem_alloc_max); + kmem_alloc_used_read(), kmem_alloc_max); /* We use kstrdup() below because the string pointed to by * __FUNCTION__ might not be available by the time we want @@ -402,7 +410,7 @@ kmem_alloc_track(size_t size, int flags, const char *func, int line, kfree(dptr); CWARN("kstrdup() failed in kmem_alloc(%llu, 0x%x) " "(%lld/%llu)\n", (unsigned long long) size, flags, - atomic64_read(&kmem_alloc_used), kmem_alloc_max); + kmem_alloc_used_read(), kmem_alloc_max); goto out; } @@ -421,15 +429,13 @@ kmem_alloc_track(size_t size, int flags, const char *func, int line, kfree(dptr); CWARN("kmem_alloc(%llu, 0x%x) failed (%lld/%llu)\n", (unsigned long long) size, flags, - atomic64_read(&kmem_alloc_used), kmem_alloc_max); + kmem_alloc_used_read(), kmem_alloc_max); goto out; } - atomic64_add(size, &kmem_alloc_used); - if (unlikely(atomic64_read(&kmem_alloc_used) > - kmem_alloc_max)) - kmem_alloc_max = - atomic64_read(&kmem_alloc_used); + kmem_alloc_used_add(size); + if (unlikely(kmem_alloc_used_read() > kmem_alloc_max)) + kmem_alloc_max = kmem_alloc_used_read(); INIT_HLIST_NODE(&dptr->kd_hlist); INIT_LIST_HEAD(&dptr->kd_list); @@ -446,7 +452,7 @@ kmem_alloc_track(size_t size, int flags, const char *func, int line, CDEBUG_LIMIT(D_INFO, "kmem_alloc(%llu, 0x%x) = %p " "(%lld/%llu)\n", (unsigned long long) size, flags, - ptr, atomic64_read(&kmem_alloc_used), + ptr, kmem_alloc_used_read(), kmem_alloc_max); } out: @@ -472,10 +478,9 @@ kmem_free_track(void *ptr, size_t size) "kd_func = %s, kd_line = %d\n", (unsigned long long) dptr->kd_size, (unsigned long long) size, dptr->kd_func, dptr->kd_line); - atomic64_sub(size, &kmem_alloc_used); - + kmem_alloc_used_sub(size); CDEBUG_LIMIT(D_INFO, "kmem_free(%p, %llu) (%lld/%llu)\n", ptr, - (unsigned long long) size, atomic64_read(&kmem_alloc_used), + (unsigned long long) size, kmem_alloc_used_read(), kmem_alloc_max); kfree(dptr->kd_func); @@ -513,7 +518,7 @@ vmem_alloc_track(size_t size, int flags, const char *func, int line) kfree(dptr); CWARN("kstrdup() failed in vmem_alloc(%llu, 0x%x) " "(%lld/%llu)\n", (unsigned long long) size, flags, - atomic64_read(&vmem_alloc_used), vmem_alloc_max); + vmem_alloc_used_read(), vmem_alloc_max); goto out; } @@ -525,18 +530,16 @@ vmem_alloc_track(size_t size, int flags, const char *func, int line) kfree(dptr); CWARN("vmem_alloc(%llu, 0x%x) failed (%lld/%llu)\n", (unsigned long long) size, flags, - atomic64_read(&vmem_alloc_used), vmem_alloc_max); + vmem_alloc_used_read(), vmem_alloc_max); goto out; } if (flags & __GFP_ZERO) memset(ptr, 0, size); - atomic64_add(size, &vmem_alloc_used); - if (unlikely(atomic64_read(&vmem_alloc_used) > - vmem_alloc_max)) - vmem_alloc_max = - atomic64_read(&vmem_alloc_used); + vmem_alloc_used_add(size); + if (unlikely(vmem_alloc_used_read() > vmem_alloc_max)) + vmem_alloc_max = vmem_alloc_used_read(); INIT_HLIST_NODE(&dptr->kd_hlist); INIT_LIST_HEAD(&dptr->kd_list); @@ -553,7 +556,7 @@ vmem_alloc_track(size_t size, int flags, const char *func, int line) CDEBUG_LIMIT(D_INFO, "vmem_alloc(%llu, 0x%x) = %p " "(%lld/%llu)\n", (unsigned long long) size, flags, - ptr, atomic64_read(&vmem_alloc_used), + ptr, vmem_alloc_used_read(), vmem_alloc_max); } out: @@ -578,9 +581,9 @@ vmem_free_track(void *ptr, size_t size) "kd_func = %s, kd_line = %d\n", (unsigned long long) dptr->kd_size, (unsigned long long) size, dptr->kd_func, dptr->kd_line); - atomic64_sub(size, &vmem_alloc_used); + vmem_alloc_used_sub(size); CDEBUG_LIMIT(D_INFO, "vmem_free(%p, %llu) (%lld/%llu)\n", ptr, - (unsigned long long) size, atomic64_read(&vmem_alloc_used), + (unsigned long long) size, vmem_alloc_used_read(), vmem_alloc_max); kfree(dptr->kd_func); @@ -609,7 +612,7 @@ kmem_alloc_debug(size_t size, int flags, const char *func, int line, if (unlikely(size > (PAGE_SIZE * 2)) && kmem_warning_flag) CWARN("Large kmem_alloc(%llu, 0x%x) (%lld/%llu)\n", (unsigned long long) size, flags, - atomic64_read(&kmem_alloc_used), kmem_alloc_max); + kmem_alloc_used_read(), kmem_alloc_max); /* Use the correct allocator */ if (node_alloc) { @@ -624,15 +627,15 @@ kmem_alloc_debug(size_t size, int flags, const char *func, int line, if (ptr == NULL) { CWARN("kmem_alloc(%llu, 0x%x) failed (%lld/%llu)\n", (unsigned long long) size, flags, - atomic64_read(&kmem_alloc_used), kmem_alloc_max); + kmem_alloc_used_read(), kmem_alloc_max); } else { - atomic64_add(size, &kmem_alloc_used); - if (unlikely(atomic64_read(&kmem_alloc_used) > kmem_alloc_max)) - kmem_alloc_max = atomic64_read(&kmem_alloc_used); + kmem_alloc_used_add(size); + if (unlikely(kmem_alloc_used_read() > kmem_alloc_max)) + kmem_alloc_max = kmem_alloc_used_read(); CDEBUG_LIMIT(D_INFO, "kmem_alloc(%llu, 0x%x) = %p " "(%lld/%llu)\n", (unsigned long long) size, flags, ptr, - atomic64_read(&kmem_alloc_used), kmem_alloc_max); + kmem_alloc_used_read(), kmem_alloc_max); } RETURN(ptr); } @@ -646,10 +649,9 @@ kmem_free_debug(void *ptr, size_t size) ASSERTF(ptr || size > 0, "ptr: %p, size: %llu", ptr, (unsigned long long) size); - atomic64_sub(size, &kmem_alloc_used); - + kmem_alloc_used_sub(size); CDEBUG_LIMIT(D_INFO, "kmem_free(%p, %llu) (%lld/%llu)\n", ptr, - (unsigned long long) size, atomic64_read(&kmem_alloc_used), + (unsigned long long) size, kmem_alloc_used_read(), kmem_alloc_max); memset(ptr, 0x5a, size); @@ -672,19 +674,18 @@ vmem_alloc_debug(size_t size, int flags, const char *func, int line) if (ptr == NULL) { CWARN("vmem_alloc(%llu, 0x%x) failed (%lld/%llu)\n", (unsigned long long) size, flags, - atomic64_read(&vmem_alloc_used), vmem_alloc_max); + vmem_alloc_used_read(), vmem_alloc_max); } else { if (flags & __GFP_ZERO) memset(ptr, 0, size); - atomic64_add(size, &vmem_alloc_used); - - if (unlikely(atomic64_read(&vmem_alloc_used) > vmem_alloc_max)) - vmem_alloc_max = atomic64_read(&vmem_alloc_used); + vmem_alloc_used_add(size); + if (unlikely(vmem_alloc_used_read() > vmem_alloc_max)) + vmem_alloc_max = vmem_alloc_used_read(); CDEBUG_LIMIT(D_INFO, "vmem_alloc(%llu, 0x%x) = %p " "(%lld/%llu)\n", (unsigned long long) size, flags, ptr, - atomic64_read(&vmem_alloc_used), vmem_alloc_max); + vmem_alloc_used_read(), vmem_alloc_max); } RETURN(ptr); @@ -699,10 +700,9 @@ vmem_free_debug(void *ptr, size_t size) ASSERTF(ptr || size > 0, "ptr: %p, size: %llu", ptr, (unsigned long long) size); - atomic64_sub(size, &vmem_alloc_used); - + vmem_alloc_used_sub(size); CDEBUG_LIMIT(D_INFO, "vmem_free(%p, %llu) (%lld/%llu)\n", ptr, - (unsigned long long) size, atomic64_read(&vmem_alloc_used), + (unsigned long long) size, vmem_alloc_used_read(), vmem_alloc_max); memset(ptr, 0x5a, size); @@ -1969,8 +1969,8 @@ spl_kmem_init(void) #endif #ifdef DEBUG_KMEM - atomic64_set(&kmem_alloc_used, 0); - atomic64_set(&vmem_alloc_used, 0); + kmem_alloc_used_set(0); + vmem_alloc_used_set(0); spl_kmem_init_tracking(&kmem_list, &kmem_lock, KMEM_TABLE_SIZE); spl_kmem_init_tracking(&vmem_list, &vmem_lock, VMEM_TABLE_SIZE); @@ -1986,14 +1986,14 @@ spl_kmem_fini(void) * allocation size and the first few bytes of what's located * at that address to aid in debugging. Performance is not * a serious concern here since it is module unload time. */ - if (atomic64_read(&kmem_alloc_used) != 0) + if (kmem_alloc_used_read() != 0) CWARN("kmem leaked %ld/%ld bytes\n", - atomic64_read(&kmem_alloc_used), kmem_alloc_max); + kmem_alloc_used_read(), kmem_alloc_max); - if (atomic64_read(&vmem_alloc_used) != 0) + if (vmem_alloc_used_read() != 0) CWARN("vmem leaked %ld/%ld bytes\n", - atomic64_read(&vmem_alloc_used), vmem_alloc_max); + vmem_alloc_used_read(), vmem_alloc_max); spl_kmem_fini_tracking(&kmem_list, &kmem_lock); spl_kmem_fini_tracking(&vmem_list, &vmem_lock); diff --git a/module/spl/spl-proc.c b/module/spl/spl-proc.c index 08bcac6259..dcd686c9e4 100644 --- a/module/spl/spl-proc.c +++ b/module/spl/spl-proc.c @@ -409,8 +409,8 @@ proc_console_backoff(struct ctl_table *table, int write, struct file *filp, #ifdef DEBUG_KMEM static int -proc_doatomic64(struct ctl_table *table, int write, struct file *filp, - void __user *buffer, size_t *lenp, loff_t *ppos) +proc_domemused(struct ctl_table *table, int write, struct file *filp, + void __user *buffer, size_t *lenp, loff_t *ppos) { int rc = 0; unsigned long min = 0, max = ~0, val; @@ -425,7 +425,11 @@ proc_doatomic64(struct ctl_table *table, int write, struct file *filp, if (write) { *ppos += *lenp; } else { +# ifdef HAVE_ATOMIC64_T val = atomic64_read((atomic64_t *)table->data); +# else + val = atomic_read((atomic_t *)table->data); +# endif /* HAVE_ATOMIC64_T */ rc = proc_doulongvec_minmax(&dummy, write, filp, buffer, lenp, ppos); } @@ -861,9 +865,13 @@ static struct ctl_table spl_kmem_table[] = { .ctl_name = CTL_KMEM_KMEMUSED, .procname = "kmem_used", .data = &kmem_alloc_used, +# ifdef HAVE_ATOMIC64_T .maxlen = sizeof(atomic64_t), +# else + .maxlen = sizeof(atomic_t), +# endif /* HAVE_ATOMIC64_T */ .mode = 0444, - .proc_handler = &proc_doatomic64, + .proc_handler = &proc_domemused, }, { .ctl_name = CTL_KMEM_KMEMMAX, @@ -879,9 +887,13 @@ static struct ctl_table spl_kmem_table[] = { .ctl_name = CTL_KMEM_VMEMUSED, .procname = "vmem_used", .data = &vmem_alloc_used, +# ifdef HAVE_ATOMIC64_T .maxlen = sizeof(atomic64_t), +# else + .maxlen = sizeof(atomic_t), +# endif /* HAVE_ATOMIC64_T */ .mode = 0444, - .proc_handler = &proc_doatomic64, + .proc_handler = &proc_domemused, }, { .ctl_name = CTL_KMEM_VMEMMAX,