From 6ae7fef5b94275e50cc1dcd48c4ecf3b70d7f9d9 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Tue, 28 Jul 2009 15:06:42 -0700 Subject: [PATCH] Update global_page_state() support for 2.6.29 kernels. Basically everything we need to monitor the global memory state of the system is now cleanly available via global_page_state(). The problem is that this interface is still fairly recent, and there has been one change in the page state enum which we need to handle. These changes basically boil down to the following: - If global_page_state() is available we should use it. Several autoconf checks have been added to detect the correct enum names. - If global_page_state() is not available check to see if get_zone_counts() symbol is available and use that. - If the get_zone_counts() symbol is not exported we have no choice be to dynamically aquire it at load time. This is an absolute last resort for old kernel which we don't want to patch to cleanly export the symbol. --- config/spl-build.m4 | 205 +++++-- configure | 1138 +++++++++++++++++++++++++++++++++---- include/sys/vmsystm.h | 21 +- module/spl/spl-kmem.c | 85 ++- module/splat/splat-kmem.c | 45 +- spl_config.h.in | 25 +- 6 files changed, 1324 insertions(+), 195 deletions(-) diff --git a/config/spl-build.m4 b/config/spl-build.m4 index 79fcd2548..51f7ea376 100644 --- a/config/spl-build.m4 +++ b/config/spl-build.m4 @@ -59,9 +59,11 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [ SPL_AC_NEXT_ONLINE_PGDAT SPL_AC_NEXT_ZONE SPL_AC_PGDAT_LIST - SPL_AC_GET_ZONE_COUNTS SPL_AC_GLOBAL_PAGE_STATE - SPL_AC_ZONE_STAT_ITEM_FIA + SPL_AC_ZONE_STAT_ITEM_FREE + SPL_AC_ZONE_STAT_ITEM_INACTIVE + SPL_AC_ZONE_STAT_ITEM_ACTIVE + SPL_AC_GET_ZONE_COUNTS SPL_AC_2ARGS_VFS_UNLINK SPL_AC_4ARGS_VFS_RENAME SPL_AC_CRED_STRUCT @@ -1005,22 +1007,6 @@ AC_DEFUN([SPL_AC_PGDAT_LIST], [ []) ]) -dnl # -dnl # Proposed API change, -dnl # This symbol is not available in stock kernels. You may build a -dnl # custom kernel with the *-spl-export-symbols.patch which will export -dnl # these symbols for use. If your already rolling a custom kernel for -dnl # your environment this is recommended. -dnl # -AC_DEFUN([SPL_AC_GET_ZONE_COUNTS], [ - SPL_CHECK_SYMBOL_EXPORT( - [get_zone_counts], - [], - [AC_DEFINE(HAVE_GET_ZONE_COUNTS, 1, - [get_zone_counts() is available])], - []) -]) - dnl # dnl # 2.6.18 API change, dnl # First introduced global_page_state() support as an inline. @@ -1028,10 +1014,10 @@ dnl # AC_DEFUN([SPL_AC_GLOBAL_PAGE_STATE], [ AC_MSG_CHECKING([whether global_page_state() is available]) SPL_LINUX_TRY_COMPILE([ - #include + #include ],[ unsigned long state; - state = global_page_state(NR_FREE_PAGES); + state = global_page_state(0); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_GLOBAL_PAGE_STATE, 1, @@ -1042,28 +1028,183 @@ AC_DEFUN([SPL_AC_GLOBAL_PAGE_STATE], [ ]) dnl # -dnl # 2.6.21 API change, -dnl # Public global zone stats now include free/inactive/active page -dnl # counts. This replaced the priviate get_zone_counts() interface. +dnl # 2.6.21 API change (plus subsequent naming convention changes), +dnl # Public global zone stats now include a free page count. However +dnl # the enumerated names of the counters have changed since this API +dnl # was introduced. We need to deduce the corrent name to use. This +dnl # replaces the priviate get_zone_counts() interface. dnl # -AC_DEFUN([SPL_AC_ZONE_STAT_ITEM_FIA], [ - AC_MSG_CHECKING([whether free/inactive/active page state is available]) +dnl # NR_FREE_PAGES was available from 2.6.21 to current kernels, which +dnl # is 2.6.30 as of when this was written. +dnl # +AC_DEFUN([SPL_AC_ZONE_STAT_ITEM_FREE], [ + AC_MSG_CHECKING([whether page state NR_FREE_PAGES is available]) SPL_LINUX_TRY_COMPILE([ - #include + #include ],[ - enum zone_stat_item i1, i2, i3; - i1 = NR_FREE_PAGES; - i2 = NR_INACTIVE; - i3 = NR_ACTIVE; + enum zone_stat_item zsi; + zsi = NR_FREE_PAGES; ],[ AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_ZONE_STAT_ITEM_FIA, 1, - [free/inactive/active page state is available]) + AC_DEFINE(HAVE_ZONE_STAT_ITEM_NR_FREE_PAGES, 1, + [Page state NR_FREE_PAGES is available]) ],[ AC_MSG_RESULT(no) ]) ]) +dnl # +dnl # 2.6.21 API change (plus subsequent naming convention changes), +dnl # Public global zone stats now include an inactive page count. However +dnl # the enumerated names of the counters have changed since this API +dnl # was introduced. We need to deduce the corrent name to use. This +dnl # replaces the priviate get_zone_counts() interface. +dnl # +dnl # NR_INACTIVE was available from 2.6.21 to 2.6.27 and included both +dnl # anonymous and file inactive pages. As of 2.6.28 it was split in +dnl # to NR_INACTIVE_ANON and NR_INACTIVE_FILE. +dnl # +AC_DEFUN([SPL_AC_ZONE_STAT_ITEM_INACTIVE], [ + AC_MSG_CHECKING([whether page state NR_INACTIVE is available]) + SPL_LINUX_TRY_COMPILE([ + #include + ],[ + enum zone_stat_item zsi; + zsi = NR_INACTIVE; + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_ZONE_STAT_ITEM_NR_INACTIVE, 1, + [Page state NR_INACTIVE is available]) + ],[ + AC_MSG_RESULT(no) + ]) + + AC_MSG_CHECKING([whether page state NR_INACTIVE_ANON is available]) + SPL_LINUX_TRY_COMPILE([ + #include + ],[ + enum zone_stat_item zsi; + zsi = NR_INACTIVE_ANON; + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_ZONE_STAT_ITEM_NR_INACTIVE_ANON, 1, + [Page state NR_INACTIVE_ANON is available]) + ],[ + AC_MSG_RESULT(no) + ]) + + AC_MSG_CHECKING([whether page state NR_INACTIVE_FILE is available]) + SPL_LINUX_TRY_COMPILE([ + #include + ],[ + enum zone_stat_item zsi; + zsi = NR_INACTIVE_FILE; + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_ZONE_STAT_ITEM_NR_INACTIVE_FILE, 1, + [Page state NR_INACTIVE_FILE is available]) + ],[ + AC_MSG_RESULT(no) + ]) +]) + +dnl # +dnl # 2.6.21 API change (plus subsequent naming convention changes), +dnl # Public global zone stats now include an active page count. However +dnl # the enumerated names of the counters have changed since this API +dnl # was introduced. We need to deduce the corrent name to use. This +dnl # replaces the priviate get_zone_counts() interface. +dnl # +dnl # NR_ACTIVE was available from 2.6.21 to 2.6.27 and included both +dnl # anonymous and file active pages. As of 2.6.28 it was split in +dnl # to NR_ACTIVE_ANON and NR_ACTIVE_FILE. +dnl # +AC_DEFUN([SPL_AC_ZONE_STAT_ITEM_ACTIVE], [ + AC_MSG_CHECKING([whether page state NR_ACTIVE is available]) + SPL_LINUX_TRY_COMPILE([ + #include + ],[ + enum zone_stat_item zsi; + zsi = NR_ACTIVE; + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_ZONE_STAT_ITEM_NR_ACTIVE, 1, + [Page state NR_ACTIVE is available]) + ],[ + AC_MSG_RESULT(no) + ]) + + AC_MSG_CHECKING([whether page state NR_ACTIVE_ANON is available]) + SPL_LINUX_TRY_COMPILE([ + #include + ],[ + enum zone_stat_item zsi; + zsi = NR_ACTIVE_ANON; + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_ZONE_STAT_ITEM_NR_ACTIVE_ANON, 1, + [Page state NR_ACTIVE_ANON is available]) + ],[ + AC_MSG_RESULT(no) + ]) + + AC_MSG_CHECKING([whether page state NR_ACTIVE_FILE is available]) + SPL_LINUX_TRY_COMPILE([ + #include + ],[ + enum zone_stat_item zsi; + zsi = NR_ACTIVE_FILE; + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_ZONE_STAT_ITEM_NR_ACTIVE_FILE, 1, + [Page state NR_ACTIVE_FILE is available]) + ],[ + AC_MSG_RESULT(no) + ]) +]) + +dnl # +dnl # Proposed API change for legacy kernels. +dnl # This symbol is not available in older kernels. For kernels post +dnl # 2.6.21 the global_page_state() API is used to get free/inactive/active +dnl # page state information. This symbol is only used in legacy kernels +dnl # any only as a last resort. +dnl +AC_DEFUN([SPL_AC_GET_ZONE_COUNTS], [ + AC_MSG_CHECKING([whether symbol get_zone_counts is needed]) + SPL_LINUX_TRY_COMPILE([ + ],[ + #if !defined(HAVE_ZONE_STAT_ITEM_NR_FREE_PAGES) + #error "global_page_state needs NR_FREE_PAGES" + #endif + + #if !defined(HAVE_ZONE_STAT_ITEM_NR_ACTIVE) && \ + !defined(HAVE_ZONE_STAT_ITEM_NR_ACTIVE_ANON) && \ + !defined(HAVE_ZONE_STAT_ITEM_NR_ACTIVE_FILE) + #error "global_page_state needs NR_ACTIVE*" + #endif + + #if !defined(HAVE_ZONE_STAT_ITEM_NR_INACTIVE) && \ + !defined(HAVE_ZONE_STAT_ITEM_NR_INACTIVE_ANON) && \ + !defined(HAVE_ZONE_STAT_ITEM_NR_INACTIVE_FILE) + #error "global_page_state needs NR_INACTIVE*" + #endif + ],[ + AC_MSG_RESULT(no) + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(NEED_GET_ZONE_COUNTS, 1, + [get_zone_counts() is needed]) + + SPL_CHECK_SYMBOL_EXPORT( + [get_zone_counts], + [], + [AC_DEFINE(HAVE_GET_ZONE_COUNTS, 1, + [get_zone_counts() is available])], + []) + ]) +]) + dnl # dnl # SLES API change, never adopted in mainline, dnl # Third 'struct vfsmount *' argument removed. diff --git a/configure b/configure index a342d73a2..3ed6af191 100755 --- a/configure +++ b/configure @@ -21040,47 +21040,6 @@ _ACEOF - echo "$as_me:$LINENO: checking whether symbol get_zone_counts is exported" >&5 -echo $ECHO_N "checking whether symbol get_zone_counts is exported... $ECHO_C" >&6 - grep -q -E '[[:space:]]get_zone_counts[[:space:]]' \ - $LINUX_OBJ/Module*.symvers 2>/dev/null - rc=$? - if test $rc -ne 0; then - export=0 - for file in ; do - grep -q -E "EXPORT_SYMBOL.*(get_zone_counts)" \ - "$LINUX_OBJ/$file" 2>/dev/null - rc=$? - if test $rc -eq 0; then - export=1 - break; - fi - done - if test $export -eq 0; then - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - - else - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -cat >>confdefs.h <<\_ACEOF -#define HAVE_GET_ZONE_COUNTS 1 -_ACEOF - - fi - else - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -cat >>confdefs.h <<\_ACEOF -#define HAVE_GET_ZONE_COUNTS 1 -_ACEOF - - fi - - - echo "$as_me:$LINENO: checking whether global_page_state() is available" >&5 echo $ECHO_N "checking whether global_page_state() is available... $ECHO_C" >&6 @@ -21093,14 +21052,14 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ - #include + #include int main (void) { unsigned long state; - state = global_page_state(NR_FREE_PAGES); + state = global_page_state(0); ; return 0; @@ -21147,8 +21106,8 @@ fi - echo "$as_me:$LINENO: checking whether free/inactive/active page state is available" >&5 -echo $ECHO_N "checking whether free/inactive/active page state is available... $ECHO_C" >&6 + echo "$as_me:$LINENO: checking whether page state NR_FREE_PAGES is available" >&5 +echo $ECHO_N "checking whether page state NR_FREE_PAGES is available... $ECHO_C" >&6 cat >conftest.c <<_ACEOF @@ -21159,16 +21118,14 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ - #include + #include int main (void) { - enum zone_stat_item i1, i2, i3; - i1 = NR_FREE_PAGES; - i2 = NR_INACTIVE; - i3 = NR_ACTIVE; + enum zone_stat_item zsi; + zsi = NR_FREE_PAGES; ; return 0; @@ -21195,7 +21152,7 @@ _ACEOF echo "${ECHO_T}yes" >&6 cat >>confdefs.h <<\_ACEOF -#define HAVE_ZONE_STAT_ITEM_FIA 1 +#define HAVE_ZONE_STAT_ITEM_NR_FREE_PAGES 1 _ACEOF @@ -21208,6 +21165,516 @@ echo "${ECHO_T}no" >&6 +fi + + rm -Rf build + + + + + echo "$as_me:$LINENO: checking whether page state NR_INACTIVE is available" >&5 +echo $ECHO_N "checking whether page state NR_INACTIVE is available... $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) +{ + + enum zone_stat_item zsi; + zsi = NR_INACTIVE; + + ; + 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_ZONE_STAT_ITEM_NR_INACTIVE 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 page state NR_INACTIVE_ANON is available" >&5 +echo $ECHO_N "checking whether page state NR_INACTIVE_ANON is available... $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) +{ + + enum zone_stat_item zsi; + zsi = NR_INACTIVE_ANON; + + ; + 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_ZONE_STAT_ITEM_NR_INACTIVE_ANON 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 page state NR_INACTIVE_FILE is available" >&5 +echo $ECHO_N "checking whether page state NR_INACTIVE_FILE is available... $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) +{ + + enum zone_stat_item zsi; + zsi = NR_INACTIVE_FILE; + + ; + 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_ZONE_STAT_ITEM_NR_INACTIVE_FILE 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 page state NR_ACTIVE is available" >&5 +echo $ECHO_N "checking whether page state NR_ACTIVE is available... $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) +{ + + enum zone_stat_item zsi; + zsi = NR_ACTIVE; + + ; + 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_ZONE_STAT_ITEM_NR_ACTIVE 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 page state NR_ACTIVE_ANON is available" >&5 +echo $ECHO_N "checking whether page state NR_ACTIVE_ANON is available... $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) +{ + + enum zone_stat_item zsi; + zsi = NR_ACTIVE_ANON; + + ; + 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_ZONE_STAT_ITEM_NR_ACTIVE_ANON 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 page state NR_ACTIVE_FILE is available" >&5 +echo $ECHO_N "checking whether page state NR_ACTIVE_FILE is available... $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) +{ + + enum zone_stat_item zsi; + zsi = NR_ACTIVE_FILE; + + ; + 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_ZONE_STAT_ITEM_NR_ACTIVE_FILE 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 symbol get_zone_counts is needed" >&5 +echo $ECHO_N "checking whether symbol get_zone_counts is needed... $ECHO_C" >&6 + + +cat >conftest.c <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + + +int +main (void) +{ + + #if !defined(HAVE_ZONE_STAT_ITEM_NR_FREE_PAGES) + #error "global_page_state needs NR_FREE_PAGES" + #endif + + #if !defined(HAVE_ZONE_STAT_ITEM_NR_ACTIVE) && \ + !defined(HAVE_ZONE_STAT_ITEM_NR_ACTIVE_ANON) && \ + !defined(HAVE_ZONE_STAT_ITEM_NR_ACTIVE_FILE) + #error "global_page_state needs NR_ACTIVE*" + #endif + + #if !defined(HAVE_ZONE_STAT_ITEM_NR_INACTIVE) && \ + !defined(HAVE_ZONE_STAT_ITEM_NR_INACTIVE_ANON) && \ + !defined(HAVE_ZONE_STAT_ITEM_NR_INACTIVE_FILE) + #error "global_page_state needs NR_INACTIVE*" + #endif + + ; + 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: no" >&5 +echo "${ECHO_T}no" >&6 + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define NEED_GET_ZONE_COUNTS 1 +_ACEOF + + + echo "$as_me:$LINENO: checking whether symbol get_zone_counts is exported" >&5 +echo $ECHO_N "checking whether symbol get_zone_counts is exported... $ECHO_C" >&6 + grep -q -E '[[:space:]]get_zone_counts[[:space:]]' \ + $LINUX_OBJ/Module*.symvers 2>/dev/null + rc=$? + if test $rc -ne 0; then + export=0 + for file in ; do + grep -q -E "EXPORT_SYMBOL.*(get_zone_counts)" \ + "$LINUX_OBJ/$file" 2>/dev/null + rc=$? + if test $rc -eq 0; then + export=1 + break; + fi + done + if test $export -eq 0; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + + else + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_GET_ZONE_COUNTS 1 +_ACEOF + + fi + else + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_GET_ZONE_COUNTS 1 +_ACEOF + + fi + + + + fi rm -Rf build @@ -23540,47 +24007,6 @@ _ACEOF - echo "$as_me:$LINENO: checking whether symbol get_zone_counts is exported" >&5 -echo $ECHO_N "checking whether symbol get_zone_counts is exported... $ECHO_C" >&6 - grep -q -E '[[:space:]]get_zone_counts[[:space:]]' \ - $LINUX_OBJ/Module*.symvers 2>/dev/null - rc=$? - if test $rc -ne 0; then - export=0 - for file in ; do - grep -q -E "EXPORT_SYMBOL.*(get_zone_counts)" \ - "$LINUX_OBJ/$file" 2>/dev/null - rc=$? - if test $rc -eq 0; then - export=1 - break; - fi - done - if test $export -eq 0; then - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - - else - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -cat >>confdefs.h <<\_ACEOF -#define HAVE_GET_ZONE_COUNTS 1 -_ACEOF - - fi - else - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -cat >>confdefs.h <<\_ACEOF -#define HAVE_GET_ZONE_COUNTS 1 -_ACEOF - - fi - - - echo "$as_me:$LINENO: checking whether global_page_state() is available" >&5 echo $ECHO_N "checking whether global_page_state() is available... $ECHO_C" >&6 @@ -23593,14 +24019,14 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ - #include + #include int main (void) { unsigned long state; - state = global_page_state(NR_FREE_PAGES); + state = global_page_state(0); ; return 0; @@ -23647,8 +24073,8 @@ fi - echo "$as_me:$LINENO: checking whether free/inactive/active page state is available" >&5 -echo $ECHO_N "checking whether free/inactive/active page state is available... $ECHO_C" >&6 + echo "$as_me:$LINENO: checking whether page state NR_FREE_PAGES is available" >&5 +echo $ECHO_N "checking whether page state NR_FREE_PAGES is available... $ECHO_C" >&6 cat >conftest.c <<_ACEOF @@ -23659,16 +24085,14 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ - #include + #include int main (void) { - enum zone_stat_item i1, i2, i3; - i1 = NR_FREE_PAGES; - i2 = NR_INACTIVE; - i3 = NR_ACTIVE; + enum zone_stat_item zsi; + zsi = NR_FREE_PAGES; ; return 0; @@ -23695,7 +24119,7 @@ _ACEOF echo "${ECHO_T}yes" >&6 cat >>confdefs.h <<\_ACEOF -#define HAVE_ZONE_STAT_ITEM_FIA 1 +#define HAVE_ZONE_STAT_ITEM_NR_FREE_PAGES 1 _ACEOF @@ -23708,6 +24132,516 @@ echo "${ECHO_T}no" >&6 +fi + + rm -Rf build + + + + + echo "$as_me:$LINENO: checking whether page state NR_INACTIVE is available" >&5 +echo $ECHO_N "checking whether page state NR_INACTIVE is available... $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) +{ + + enum zone_stat_item zsi; + zsi = NR_INACTIVE; + + ; + 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_ZONE_STAT_ITEM_NR_INACTIVE 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 page state NR_INACTIVE_ANON is available" >&5 +echo $ECHO_N "checking whether page state NR_INACTIVE_ANON is available... $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) +{ + + enum zone_stat_item zsi; + zsi = NR_INACTIVE_ANON; + + ; + 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_ZONE_STAT_ITEM_NR_INACTIVE_ANON 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 page state NR_INACTIVE_FILE is available" >&5 +echo $ECHO_N "checking whether page state NR_INACTIVE_FILE is available... $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) +{ + + enum zone_stat_item zsi; + zsi = NR_INACTIVE_FILE; + + ; + 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_ZONE_STAT_ITEM_NR_INACTIVE_FILE 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 page state NR_ACTIVE is available" >&5 +echo $ECHO_N "checking whether page state NR_ACTIVE is available... $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) +{ + + enum zone_stat_item zsi; + zsi = NR_ACTIVE; + + ; + 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_ZONE_STAT_ITEM_NR_ACTIVE 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 page state NR_ACTIVE_ANON is available" >&5 +echo $ECHO_N "checking whether page state NR_ACTIVE_ANON is available... $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) +{ + + enum zone_stat_item zsi; + zsi = NR_ACTIVE_ANON; + + ; + 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_ZONE_STAT_ITEM_NR_ACTIVE_ANON 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 page state NR_ACTIVE_FILE is available" >&5 +echo $ECHO_N "checking whether page state NR_ACTIVE_FILE is available... $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) +{ + + enum zone_stat_item zsi; + zsi = NR_ACTIVE_FILE; + + ; + 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_ZONE_STAT_ITEM_NR_ACTIVE_FILE 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 symbol get_zone_counts is needed" >&5 +echo $ECHO_N "checking whether symbol get_zone_counts is needed... $ECHO_C" >&6 + + +cat >conftest.c <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + + +int +main (void) +{ + + #if !defined(HAVE_ZONE_STAT_ITEM_NR_FREE_PAGES) + #error "global_page_state needs NR_FREE_PAGES" + #endif + + #if !defined(HAVE_ZONE_STAT_ITEM_NR_ACTIVE) && \ + !defined(HAVE_ZONE_STAT_ITEM_NR_ACTIVE_ANON) && \ + !defined(HAVE_ZONE_STAT_ITEM_NR_ACTIVE_FILE) + #error "global_page_state needs NR_ACTIVE*" + #endif + + #if !defined(HAVE_ZONE_STAT_ITEM_NR_INACTIVE) && \ + !defined(HAVE_ZONE_STAT_ITEM_NR_INACTIVE_ANON) && \ + !defined(HAVE_ZONE_STAT_ITEM_NR_INACTIVE_FILE) + #error "global_page_state needs NR_INACTIVE*" + #endif + + ; + 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: no" >&5 +echo "${ECHO_T}no" >&6 + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define NEED_GET_ZONE_COUNTS 1 +_ACEOF + + + echo "$as_me:$LINENO: checking whether symbol get_zone_counts is exported" >&5 +echo $ECHO_N "checking whether symbol get_zone_counts is exported... $ECHO_C" >&6 + grep -q -E '[[:space:]]get_zone_counts[[:space:]]' \ + $LINUX_OBJ/Module*.symvers 2>/dev/null + rc=$? + if test $rc -ne 0; then + export=0 + for file in ; do + grep -q -E "EXPORT_SYMBOL.*(get_zone_counts)" \ + "$LINUX_OBJ/$file" 2>/dev/null + rc=$? + if test $rc -eq 0; then + export=1 + break; + fi + done + if test $export -eq 0; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + + else + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_GET_ZONE_COUNTS 1 +_ACEOF + + fi + else + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_GET_ZONE_COUNTS 1 +_ACEOF + + fi + + + + fi rm -Rf build diff --git a/include/sys/vmsystm.h b/include/sys/vmsystm.h index 75365fde0..1c367d7cd 100644 --- a/include/sys/vmsystm.h +++ b/include/sys/vmsystm.h @@ -123,22 +123,21 @@ extern struct pglist_data *pgdat_list_addr; #endif /* HAVE_PGDAT_HELPERS */ /* Source linux/mm/vmstat.c */ -#ifndef HAVE_ZONE_STAT_ITEM_FIA -# ifndef HAVE_GET_ZONE_COUNTS +#if defined(NEED_GET_ZONE_COUNTS) && !defined(HAVE_GET_ZONE_COUNTS) typedef void (*get_zone_counts_t)(unsigned long *, unsigned long *, unsigned long *); extern get_zone_counts_t get_zone_counts_fn; # define get_zone_counts(a,i,f) get_zone_counts_fn(a,i,f) -# endif /* HAVE_GET_ZONE_COUNTS */ +#endif /* NEED_GET_ZONE_COUNTS && !HAVE_GET_ZONE_COUNTS */ -extern unsigned long spl_global_page_state(int); -/* Defines designed to simulate enum but large enough to ensure no overlap */ -# define NR_FREE_PAGES 0x8001 -# define NR_INACTIVE 0x8002 -# define NR_ACTIVE 0x8003 -#else -#define spl_global_page_state(item) global_page_state(item) -#endif /* HAVE_ZONE_STAT_ITEM_FIA */ +typedef enum spl_zone_stat_item { + SPL_NR_FREE_PAGES, + SPL_NR_INACTIVE, + SPL_NR_ACTIVE, + SPL_NR_ZONE_STAT_ITEMS +} spl_zone_stat_item_t; + +extern unsigned long spl_global_page_state(spl_zone_stat_item_t); #define xcopyin(from, to, size) copy_from_user(to, from, size) #define xcopyout(from, to, size) copy_to_user(to, from, size) diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c index 4edd3d7e1..b1124f706 100644 --- a/module/spl/spl-kmem.c +++ b/module/spl/spl-kmem.c @@ -109,49 +109,82 @@ EXPORT_SYMBOL(pgdat_list_addr); #endif /* HAVE_PGDAT_HELPERS */ -#ifndef HAVE_ZONE_STAT_ITEM_FIA +#ifdef NEED_GET_ZONE_COUNTS # ifndef HAVE_GET_ZONE_COUNTS get_zone_counts_t get_zone_counts_fn = SYMBOL_POISON; EXPORT_SYMBOL(get_zone_counts_fn); # endif /* HAVE_GET_ZONE_COUNTS */ unsigned long -spl_global_page_state(int item) +spl_global_page_state(spl_zone_stat_item_t item) { unsigned long active; unsigned long inactive; unsigned long free; - if (item == NR_FREE_PAGES) { - get_zone_counts(&active, &inactive, &free); - return free; + get_zone_counts(&active, &inactive, &free); + switch (item) { + case SPL_NR_FREE_PAGES: return free; + case SPL_NR_INACTIVE: return inactive; + case SPL_NR_ACTIVE: return active; + default: ASSERT(0); /* Unsupported */ } - if (item == NR_INACTIVE) { - get_zone_counts(&active, &inactive, &free); - return inactive; - } - - if (item == NR_ACTIVE) { - get_zone_counts(&active, &inactive, &free); - return active; - } - -# ifdef HAVE_GLOBAL_PAGE_STATE - return global_page_state((enum zone_stat_item)item); -# else - return 0; /* Unsupported */ -# endif /* HAVE_GLOBAL_PAGE_STATE */ + return 0; } +#else +# ifdef HAVE_GLOBAL_PAGE_STATE +unsigned long +spl_global_page_state(spl_zone_stat_item_t item) +{ + unsigned long pages = 0; + + switch (item) { + case SPL_NR_FREE_PAGES: +# ifdef HAVE_ZONE_STAT_ITEM_NR_FREE_PAGES + pages += global_page_state(NR_FREE_PAGES); +# endif + break; + case SPL_NR_INACTIVE: +# ifdef HAVE_ZONE_STAT_ITEM_NR_INACTIVE + pages += global_page_state(NR_INACTIVE); +# endif +# ifdef HAVE_ZONE_STAT_ITEM_NR_INACTIVE_ANON + pages += global_page_state(NR_INACTIVE_ANON); +# endif +# ifdef HAVE_ZONE_STAT_ITEM_NR_INACTIVE_FILE + pages += global_page_state(NR_INACTIVE_FILE); +# endif + break; + case SPL_NR_ACTIVE: +# ifdef HAVE_ZONE_STAT_ITEM_NR_ACTIVE + pages += global_page_state(NR_ACTIVE); +# endif +# ifdef HAVE_ZONE_STAT_ITEM_NR_ACTIVE_ANON + pages += global_page_state(NR_ACTIVE_ANON); +# endif +# ifdef HAVE_ZONE_STAT_ITEM_NR_ACTIVE_FILE + pages += global_page_state(NR_ACTIVE_FILE); +# endif + break; + default: + ASSERT(0); /* Unsupported */ + } + + return pages; +} +# else +# error "Both global_page_state() and get_zone_counts() unavailable" +# endif /* HAVE_GLOBAL_PAGE_STATE */ +#endif /* NEED_GET_ZONE_COUNTS */ EXPORT_SYMBOL(spl_global_page_state); -#endif /* HAVE_ZONE_STAT_ITEM_FIA */ pgcnt_t spl_kmem_availrmem(void) { /* The amount of easily available memory */ - return (spl_global_page_state(NR_FREE_PAGES) + - spl_global_page_state(NR_INACTIVE)); + return (spl_global_page_state(SPL_NR_FREE_PAGES) + + spl_global_page_state(SPL_NR_INACTIVE)); } EXPORT_SYMBOL(spl_kmem_availrmem); @@ -1856,16 +1889,14 @@ spl_kmem_init_kallsyms_lookup(void) # endif /* HAVE_PGDAT_LIST */ #endif /* HAVE_PGDAT_HELPERS */ -#ifndef HAVE_ZONE_STAT_ITEM_FIA -# ifndef HAVE_GET_ZONE_COUNTS +#if defined(NEED_GET_ZONE_COUNTS) && !defined(HAVE_GET_ZONE_COUNTS) get_zone_counts_fn = (get_zone_counts_t) spl_kallsyms_lookup_name("get_zone_counts"); if (!get_zone_counts_fn) { printk(KERN_ERR "Error: Unknown symbol get_zone_counts\n"); return -EFAULT; } -# endif /* HAVE_GET_ZONE_COUNTS */ -#endif /* HAVE_ZONE_STAT_ITEM_FIA */ +#endif /* NEED_GET_ZONE_COUNTS && !HAVE_GET_ZONE_COUNTS */ /* * It is now safe to initialize the global tunings which rely on diff --git a/module/splat/splat-kmem.c b/module/splat/splat-kmem.c index b021750ad..1007f7855 100644 --- a/module/splat/splat-kmem.c +++ b/module/splat/splat-kmem.c @@ -1045,16 +1045,17 @@ splat_kmem_test11(struct file *file, void *arg) static int splat_kmem_test12(struct file *file, void *arg) { - ssize_t alloc1, free1, total1; - ssize_t alloc2, free2, total2; + size_t alloc1, free1, total1; + size_t alloc2, free2, total2; int size = 8*1024*1024; void *ptr; alloc1 = vmem_size(NULL, VMEM_ALLOC); free1 = vmem_size(NULL, VMEM_FREE); total1 = vmem_size(NULL, VMEM_ALLOC | VMEM_FREE); - splat_vprint(file, SPLAT_KMEM_TEST12_NAME, "Vmem alloc=%d free=%d " - "total=%d\n", (int)alloc1, (int)free1, (int)total1); + splat_vprint(file, SPLAT_KMEM_TEST12_NAME, "Vmem alloc=%lu " + "free=%lu total=%lu\n", (unsigned long)alloc1, + (unsigned long)free1, (unsigned long)total1); splat_vprint(file, SPLAT_KMEM_TEST12_NAME, "Alloc %d bytes\n", size); ptr = vmem_alloc(size, KM_SLEEP); @@ -1067,42 +1068,44 @@ splat_kmem_test12(struct file *file, void *arg) alloc2 = vmem_size(NULL, VMEM_ALLOC); free2 = vmem_size(NULL, VMEM_FREE); total2 = vmem_size(NULL, VMEM_ALLOC | VMEM_FREE); - splat_vprint(file, SPLAT_KMEM_TEST12_NAME, "Vmem alloc=%d free=%d " - "total=%d\n", (int)alloc2, (int)free2, (int)total2); + splat_vprint(file, SPLAT_KMEM_TEST12_NAME, "Vmem alloc=%lu " + "free=%lu total=%lu\n", (unsigned long)alloc2, + (unsigned long)free2, (unsigned long)total2); splat_vprint(file, SPLAT_KMEM_TEST12_NAME, "Free %d bytes\n", size); vmem_free(ptr, size); if (alloc2 < (alloc1 + size - (size / 100)) || alloc2 > (alloc1 + size + (size / 100))) { - splat_vprint(file, SPLAT_KMEM_TEST12_NAME, - "Failed VMEM_ALLOC size: %d != %d+%d (+/- 1%%)\n", - (int)alloc2, (int)alloc1, size); + splat_vprint(file, SPLAT_KMEM_TEST12_NAME, "Failed " + "VMEM_ALLOC size: %lu != %lu+%d (+/- 1%%)\n", + (unsigned long)alloc2,(unsigned long)alloc1,size); return -ERANGE; } if (free2 < (free1 - size - (size / 100)) || free2 > (free1 - size + (size / 100))) { - splat_vprint(file, SPLAT_KMEM_TEST12_NAME, - "Failed VMEM_FREE size: %d != %d-%d (+/- 1%%)\n", - (int)free2, (int)free1, size); + splat_vprint(file, SPLAT_KMEM_TEST12_NAME, "Failed " + "VMEM_FREE size: %lu != %lu-%d (+/- 1%%)\n", + (unsigned long)free2, (unsigned long)free1, size); return -ERANGE; } if (total1 != total2) { - splat_vprint(file, SPLAT_KMEM_TEST12_NAME, - "Failed VMEM_ALLOC | VMEM_FREE not constant: " - "%d != %d\n", (int)total2, (int)total1); + splat_vprint(file, SPLAT_KMEM_TEST12_NAME, "Failed " + "VMEM_ALLOC | VMEM_FREE not constant: " + "%lu != %lu\n", (unsigned long)total2, + (unsigned long)total1); return -ERANGE; } splat_vprint(file, SPLAT_KMEM_TEST12_NAME, - "VMEM_ALLOC within tolerance: ~%d%% (%d/%d)\n", - (int)(((alloc1 + size) - alloc2) * 100 / size), - (int)((alloc1 + size) - alloc2), size); + "VMEM_ALLOC within tolerance: ~%ld%% (%ld/%d)\n", + (long)abs(alloc1 + (long)size - alloc2) * 100 / (long)size, + (long)abs(alloc1 + (long)size - alloc2), size); splat_vprint(file, SPLAT_KMEM_TEST12_NAME, - "VMEM_FREE within tolerance: ~%d%% (%d/%d)\n", - (int)(((free1 - size) - free2) * 100 / size), - (int)((free1 - size) - free2), size); + "VMEM_FREE within tolerance: ~%ld%% (%ld/%d)\n", + (long)abs((free1 - (long)size) - free2) * 100 / (long)size, + (long)abs((free1 - (long)size) - free2), size); return 0; } diff --git a/spl_config.h.in b/spl_config.h.in index 582a47603..c4097d80f 100644 --- a/spl_config.h.in +++ b/spl_config.h.in @@ -159,8 +159,29 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H -/* free/inactive/active page state is available */ -#undef HAVE_ZONE_STAT_ITEM_FIA +/* Page state NR_ACTIVE is available */ +#undef HAVE_ZONE_STAT_ITEM_NR_ACTIVE + +/* Page state NR_ACTIVE_ANON is available */ +#undef HAVE_ZONE_STAT_ITEM_NR_ACTIVE_ANON + +/* Page state NR_ACTIVE_FILE is available */ +#undef HAVE_ZONE_STAT_ITEM_NR_ACTIVE_FILE + +/* Page state NR_FREE_PAGES is available */ +#undef HAVE_ZONE_STAT_ITEM_NR_FREE_PAGES + +/* Page state NR_INACTIVE is available */ +#undef HAVE_ZONE_STAT_ITEM_NR_INACTIVE + +/* Page state NR_INACTIVE_ANON is available */ +#undef HAVE_ZONE_STAT_ITEM_NR_INACTIVE_ANON + +/* Page state NR_INACTIVE_FILE is available */ +#undef HAVE_ZONE_STAT_ITEM_NR_INACTIVE_FILE + +/* get_zone_counts() is needed */ +#undef NEED_GET_ZONE_COUNTS /* Name of package */ #undef PACKAGE