]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Merge branch 'kallsyms'
authorBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 4 Mar 2009 18:19:41 +0000 (10:19 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 4 Mar 2009 18:19:41 +0000 (10:19 -0800)
14 files changed:
config/spl-build.m4
configure
configure.ac
include/linux/kallsyms_compat.h [new file with mode: 0644]
include/sys/kmem.h
include/sys/types.h
include/sys/vmsystm.h
module/spl/spl-generic.c
module/spl/spl-kmem.c
module/spl/spl-proc.c
patches/16kstack-x86_64.patch [deleted file]
patches/rhel5-spl-export-symbols.patch [new file with mode: 0644]
patches/task-curr-export.patch [deleted file]
spl_config.h.in

index 5ee615bf8dbd50eaa53a29fb78accf02f7146b18..a90fb617023add8d89437662eaba542e9ecacdeb 100644 (file)
@@ -221,8 +221,8 @@ AC_DEFUN([SPL_LINUX_COMPILE_IFELSE], [
 m4_ifvaln([$1], [SPL_LINUX_CONFTEST([$1])])dnl
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-dnl AS_IF([AC_TRY_COMMAND(cp conftest.c build && make [$2] CC="$CC" -f $PWD/build/Makefile LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM SUBDIRS=$PWD/build) >/dev/null && AC_TRY_COMMAND([$3])],
-AS_IF([AC_TRY_COMMAND(cp conftest.c build && make [$2] CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build) >/dev/null && AC_TRY_COMMAND([$3])],
+dnl AS_IF([AC_TRY_COMMAND(cp conftest.c build && make [$2] CC="$CC" -f $PWD/build/Makefile LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM SUBDIRS=$PWD/build) >/dev/null && AC_TRY_COMMAND([$3])],
+AS_IF([AC_TRY_COMMAND(cp conftest.c build && make [$2] CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build) >/dev/null && AC_TRY_COMMAND([$3])],
         [$4],
         [_AC_MSG_LOG_CONFTEST
 m4_ifvaln([$5],[$5])dnl])dnl
@@ -268,12 +268,12 @@ dnl # check symbol exported or not
 dnl #
 AC_DEFUN([SPL_CHECK_SYMBOL_EXPORT],
        [AC_MSG_CHECKING([whether symbol $1 is exported])
-       grep -q -E '[[[:space:]]]$1[[[:space:]]]' $LINUX/Module.symvers 2>/dev/null
+       grep -q -E '[[[:space:]]]$1[[[:space:]]]' $LINUX_OBJ/Module.symvers 2>/dev/null
        rc=$?
        if test $rc -ne 0; then
                export=0
                for file in $2; do
-                       grep -q -E "EXPORT_SYMBOL.*($1)" "$LINUX/$file" 2>/dev/null
+                       grep -q -E "EXPORT_SYMBOL.*($1)" "$LINUX_OBJ/$file" 2>/dev/null
                        rc=$?
                        if test $rc -eq 0; then
                                export=1
@@ -707,7 +707,32 @@ AC_DEFUN([SPL_AC_3ARGS_ON_EACH_CPU], [
 ])
 
 dnl #
-dnl # Distro specific first_online_pgdat() symbol export.
+dnl # 2.6.18 API change,
+dnl # kallsyms_lookup_name no longer exported
+dnl #
+AC_DEFUN([SPL_AC_KALLSYMS_LOOKUP_NAME], [
+       SPL_CHECK_SYMBOL_EXPORT(
+               [kallsyms_lookup_name],
+               [],
+               [AC_DEFINE(HAVE_KALLSYMS_LOOKUP_NAME, 1,
+               [kallsyms_lookup_name() is available])],
+               [])
+])
+
+dnl #
+dnl # Symbol only available in custom kernels
+dnl #
+AC_DEFUN([SPL_AC_GET_VMALLOC_INFO], [
+       SPL_CHECK_SYMBOL_EXPORT(
+               [get_vmalloc_info],
+               [],
+               [AC_DEFINE(HAVE_GET_VMALLOC_INFO, 1,
+               [get_vmalloc_info() is available])],
+               [])
+])
+
+dnl #
+dnl # Symbol only available in custom kernels
 dnl #
 AC_DEFUN([SPL_AC_FIRST_ONLINE_PGDAT], [
        SPL_CHECK_SYMBOL_EXPORT(
@@ -719,7 +744,7 @@ AC_DEFUN([SPL_AC_FIRST_ONLINE_PGDAT], [
 ])
 
 dnl #
-dnl # Distro specific next_online_pgdat() symbol export.
+dnl # Symbol only available in custom kernels
 dnl #
 AC_DEFUN([SPL_AC_NEXT_ONLINE_PGDAT], [
        SPL_CHECK_SYMBOL_EXPORT(
@@ -731,7 +756,7 @@ AC_DEFUN([SPL_AC_NEXT_ONLINE_PGDAT], [
 ])
 
 dnl #
-dnl # Distro specific next_zone() symbol export.
+dnl # Symbol only available in custom kernels
 dnl #
 AC_DEFUN([SPL_AC_NEXT_ZONE], [
        SPL_CHECK_SYMBOL_EXPORT(
@@ -743,7 +768,7 @@ AC_DEFUN([SPL_AC_NEXT_ZONE], [
 ])
 
 dnl #
-dnl # Distro specific get_zone_counts() symbol export.
+dnl # Symbol only available in custom kernels
 dnl #
 AC_DEFUN([SPL_AC_GET_ZONE_COUNTS], [
        SPL_CHECK_SYMBOL_EXPORT(
index b0d5b8e58641c64b7e1d0730b9e2b793ae2a47cc..d436b8a7c9c684dacf708dd49adbd3d47af782e0 100755 (executable)
--- a/configure
+++ b/configure
@@ -19201,7 +19201,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -19261,7 +19261,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -19322,7 +19322,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -19382,7 +19382,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -19443,7 +19443,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -19506,7 +19506,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -19541,12 +19541,12 @@ rm -f build/conftest.o build/conftest.mod.c build/conftest.mod.o build/conftest.
 
        echo "$as_me:$LINENO: checking whether symbol task_curr is exported" >&5
 echo $ECHO_N "checking whether symbol task_curr is exported... $ECHO_C" >&6
-       grep -q -E '[[:space:]]task_curr[[:space:]]' $LINUX/Module.symvers 2>/dev/null
+       grep -q -E '[[:space:]]task_curr[[:space:]]' $LINUX_OBJ/Module.symvers 2>/dev/null
        rc=$?
        if test $rc -ne 0; then
                export=0
                for file in kernel/sched.c; do
-                       grep -q -E "EXPORT_SYMBOL.*(task_curr)" "$LINUX/$file" 2>/dev/null
+                       grep -q -E "EXPORT_SYMBOL.*(task_curr)" "$LINUX_OBJ/$file" 2>/dev/null
                        rc=$?
                        if test $rc -eq 0; then
                                export=1
@@ -19607,7 +19607,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -19667,7 +19667,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -19702,12 +19702,12 @@ rm -f build/conftest.o build/conftest.mod.c build/conftest.mod.o build/conftest.
 
        echo "$as_me:$LINENO: checking whether symbol device_create is exported" >&5
 echo $ECHO_N "checking whether symbol device_create is exported... $ECHO_C" >&6
-       grep -q -E '[[:space:]]device_create[[:space:]]' $LINUX/Module.symvers 2>/dev/null
+       grep -q -E '[[:space:]]device_create[[:space:]]' $LINUX_OBJ/Module.symvers 2>/dev/null
        rc=$?
        if test $rc -ne 0; then
                export=0
                for file in drivers/base/core.c; do
-                       grep -q -E "EXPORT_SYMBOL.*(device_create)" "$LINUX/$file" 2>/dev/null
+                       grep -q -E "EXPORT_SYMBOL.*(device_create)" "$LINUX_OBJ/$file" 2>/dev/null
                        rc=$?
                        if test $rc -eq 0; then
                                export=1
@@ -19741,12 +19741,12 @@ _ACEOF
 
        echo "$as_me:$LINENO: checking whether symbol class_device_create is exported" >&5
 echo $ECHO_N "checking whether symbol class_device_create is exported... $ECHO_C" >&6
-       grep -q -E '[[:space:]]class_device_create[[:space:]]' $LINUX/Module.symvers 2>/dev/null
+       grep -q -E '[[:space:]]class_device_create[[:space:]]' $LINUX_OBJ/Module.symvers 2>/dev/null
        rc=$?
        if test $rc -ne 0; then
                export=0
                for file in drivers/base/class.c; do
-                       grep -q -E "EXPORT_SYMBOL.*(class_device_create)" "$LINUX/$file" 2>/dev/null
+                       grep -q -E "EXPORT_SYMBOL.*(class_device_create)" "$LINUX_OBJ/$file" 2>/dev/null
                        rc=$?
                        if test $rc -eq 0; then
                                export=1
@@ -19780,12 +19780,12 @@ _ACEOF
 
        echo "$as_me:$LINENO: checking whether symbol set_normalized_timespec is exported" >&5
 echo $ECHO_N "checking whether symbol set_normalized_timespec is exported... $ECHO_C" >&6
-       grep -q -E '[[:space:]]set_normalized_timespec[[:space:]]' $LINUX/Module.symvers 2>/dev/null
+       grep -q -E '[[:space:]]set_normalized_timespec[[:space:]]' $LINUX_OBJ/Module.symvers 2>/dev/null
        rc=$?
        if test $rc -ne 0; then
                export=0
                for file in kernel/time.c; do
-                       grep -q -E "EXPORT_SYMBOL.*(set_normalized_timespec)" "$LINUX/$file" 2>/dev/null
+                       grep -q -E "EXPORT_SYMBOL.*(set_normalized_timespec)" "$LINUX_OBJ/$file" 2>/dev/null
                        rc=$?
                        if test $rc -eq 0; then
                                export=1
@@ -19845,7 +19845,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -19907,7 +19907,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -19968,7 +19968,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -20029,7 +20029,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -20098,7 +20098,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -20159,7 +20159,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -20223,7 +20223,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -20258,12 +20258,12 @@ rm -f build/conftest.o build/conftest.mod.c build/conftest.mod.o build/conftest.
 
        echo "$as_me:$LINENO: checking whether symbol monotonic_clock is exported" >&5
 echo $ECHO_N "checking whether symbol monotonic_clock is exported... $ECHO_C" >&6
-       grep -q -E '[[:space:]]monotonic_clock[[:space:]]' $LINUX/Module.symvers 2>/dev/null
+       grep -q -E '[[:space:]]monotonic_clock[[: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.*(monotonic_clock)" "$LINUX/$file" 2>/dev/null
+                       grep -q -E "EXPORT_SYMBOL.*(monotonic_clock)" "$LINUX_OBJ/$file" 2>/dev/null
                        rc=$?
                        if test $rc -eq 0; then
                                export=1
@@ -20325,7 +20325,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -20387,7 +20387,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -20448,7 +20448,7 @@ _ACEOF
 
 rm -f build/conftest.o build/conftest.mod.c build/conftest.ko build/Makefile
 echo "obj-m := conftest.o" >build/Makefile
-if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+if { ac_try='cp conftest.c build && make modules CC="$CC" LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -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=$?
@@ -20481,14 +20481,92 @@ rm -f build/conftest.o build/conftest.mod.c build/conftest.mod.o build/conftest.
 
 
 
+       echo "$as_me:$LINENO: checking whether symbol kallsyms_lookup_name is exported" >&5
+echo $ECHO_N "checking whether symbol kallsyms_lookup_name is exported... $ECHO_C" >&6
+       grep -q -E '[[:space:]]kallsyms_lookup_name[[: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.*(kallsyms_lookup_name)" "$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_KALLSYMS_LOOKUP_NAME 1
+_ACEOF
+
+               fi
+       else
+               echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_KALLSYMS_LOOKUP_NAME 1
+_ACEOF
+
+       fi
+
+
+
+       echo "$as_me:$LINENO: checking whether symbol get_vmalloc_info is exported" >&5
+echo $ECHO_N "checking whether symbol get_vmalloc_info is exported... $ECHO_C" >&6
+       grep -q -E '[[:space:]]get_vmalloc_info[[: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_vmalloc_info)" "$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_VMALLOC_INFO 1
+_ACEOF
+
+               fi
+       else
+               echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_GET_VMALLOC_INFO 1
+_ACEOF
+
+       fi
+
+
+
        echo "$as_me:$LINENO: checking whether symbol first_online_pgdat is exported" >&5
 echo $ECHO_N "checking whether symbol first_online_pgdat is exported... $ECHO_C" >&6
-       grep -q -E '[[:space:]]first_online_pgdat[[:space:]]' $LINUX/Module.symvers 2>/dev/null
+       grep -q -E '[[:space:]]first_online_pgdat[[: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.*(first_online_pgdat)" "$LINUX/$file" 2>/dev/null
+                       grep -q -E "EXPORT_SYMBOL.*(first_online_pgdat)" "$LINUX_OBJ/$file" 2>/dev/null
                        rc=$?
                        if test $rc -eq 0; then
                                export=1
@@ -20522,12 +20600,12 @@ _ACEOF
 
        echo "$as_me:$LINENO: checking whether symbol next_online_pgdat is exported" >&5
 echo $ECHO_N "checking whether symbol next_online_pgdat is exported... $ECHO_C" >&6
-       grep -q -E '[[:space:]]next_online_pgdat[[:space:]]' $LINUX/Module.symvers 2>/dev/null
+       grep -q -E '[[:space:]]next_online_pgdat[[: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.*(next_online_pgdat)" "$LINUX/$file" 2>/dev/null
+                       grep -q -E "EXPORT_SYMBOL.*(next_online_pgdat)" "$LINUX_OBJ/$file" 2>/dev/null
                        rc=$?
                        if test $rc -eq 0; then
                                export=1
@@ -20561,12 +20639,12 @@ _ACEOF
 
        echo "$as_me:$LINENO: checking whether symbol next_zone is exported" >&5
 echo $ECHO_N "checking whether symbol next_zone is exported... $ECHO_C" >&6
-       grep -q -E '[[:space:]]next_zone[[:space:]]' $LINUX/Module.symvers 2>/dev/null
+       grep -q -E '[[:space:]]next_zone[[: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.*(next_zone)" "$LINUX/$file" 2>/dev/null
+                       grep -q -E "EXPORT_SYMBOL.*(next_zone)" "$LINUX_OBJ/$file" 2>/dev/null
                        rc=$?
                        if test $rc -eq 0; then
                                export=1
@@ -20600,12 +20678,12 @@ _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/Module.symvers 2>/dev/null
+       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/$file" 2>/dev/null
+                       grep -q -E "EXPORT_SYMBOL.*(get_zone_counts)" "$LINUX_OBJ/$file" 2>/dev/null
                        rc=$?
                        if test $rc -eq 0; then
                                export=1
index 5329a11577fed6e718136a3eda337642195ddbb6..7a5d52b6830092cd9c96e475929166fa19fb2afb 100644 (file)
@@ -69,6 +69,8 @@ SPL_AC_MONOTONIC_CLOCK
 SPL_AC_INODE_I_MUTEX
 SPL_AC_DIV64_64
 SPL_AC_3ARGS_ON_EACH_CPU
+SPL_AC_KALLSYMS_LOOKUP_NAME
+SPL_AC_GET_VMALLOC_INFO
 SPL_AC_FIRST_ONLINE_PGDAT
 SPL_AC_NEXT_ONLINE_PGDAT
 SPL_AC_NEXT_ZONE
diff --git a/include/linux/kallsyms_compat.h b/include/linux/kallsyms_compat.h
new file mode 100644 (file)
index 0000000..82abed4
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef _SPL_KALLSYMS_COMPAT_H
+#define _SPL_KALLSYMS_COMPAT_H
+
+#ifdef HAVE_KALLSYMS_LOOKUP_NAME
+
+#include <linux/kallsyms.h>
+#define spl_kallsyms_lookup_name(name) kallsyms_lookup_name(name)
+
+#else
+
+typedef unsigned long (*kallsyms_lookup_name_t)(const char *);
+extern kallsyms_lookup_name_t spl_kallsyms_lookup_name_fn;
+#define spl_kallsyms_lookup_name(name) spl_kallsyms_lookup_name_fn(name)
+
+#endif /* HAVE_KALLSYMS_LOOKUP_NAME */
+
+#endif /* _SPL_KALLSYMS_COMPAT_H */
index 318cf5ee88cc3cae825c598d3391673bc0f40504..caba9104fcde57d4d22e04243b2c6d2f0ecc434d 100644 (file)
@@ -325,6 +325,7 @@ extern void spl_kmem_cache_free(spl_kmem_cache_t *skc, void *obj);
 extern void spl_kmem_cache_reap_now(spl_kmem_cache_t *skc);
 extern void spl_kmem_reap(void);
 
+int spl_kmem_init_kallsyms_lookup(void);
 int spl_kmem_init(void);
 void spl_kmem_fini(void);
 
index 0b5cae641eb9ecd9902f4df3884c1832a35f12f2..699efe648b14445693b71c1b3630882b9366cf77 100644 (file)
@@ -16,6 +16,7 @@ extern "C" {
 #include <linux/bitops_compat.h>
 #include <linux/smp_compat.h>
 #include <linux/workqueue_compat.h>
+#include <linux/kallsyms_compat.h>
 
 #ifndef HAVE_UINTPTR_T
 typedef unsigned long                  uintptr_t;
index c75d447d942d30abacf781f5618db5d9526123d7..929c790d08134b3f6a6dc0634fbebc2d6245f8aa 100644 (file)
@@ -57,12 +57,71 @@ extern vmem_t *heap_arena;          /* primary kernel heap arena */
 extern vmem_t *zio_alloc_arena;                /* arena for zio caches */
 extern vmem_t *zio_arena;              /* arena for allocating zio memory */
 
-#define VMEM_ALLOC                     0x01
-#define VMEM_FREE                      0x02
-
 extern pgcnt_t spl_kmem_availrmem(void);
 extern size_t vmem_size(vmem_t *vmp, int typemask);
 
+/*
+ * The following symbols are available for use within the kernel
+ * itself, and they used to be available in older kernels.  But it
+ * looks like they have been removed perhaps due to lack of use.
+ * For our purposes we need them to access the global memory state
+ * of the system, which is even available to user space process
+ * in /proc/meminfo.  It's odd to me that there is no kernel API
+ * to get the same information, minimally the proc handler for
+ * the above mentioned /proc/meminfo file would make use of it.
+ */
+
+/* Source linux/fs/proc/mmu.c */
+#ifndef HAVE_GET_VMALLOC_INFO
+#ifdef CONFIG_MMU
+
+struct vmalloc_info {
+       unsigned long used;
+       unsigned long largest_chunk;
+};
+
+typedef void (*get_vmalloc_info_t)(struct vmalloc_info *);
+extern get_vmalloc_info_t get_vmalloc_info_fn;
+
+# define VMEM_ALLOC            0x01
+# define VMEM_FREE             0x02
+# define VMALLOC_TOTAL         (VMALLOC_END - VMALLOC_START)
+# define get_vmalloc_info(vmi) get_vmalloc_info_fn(vmi)
+#else
+# error "CONFIG_MMU must be defined"
+#endif /* CONFIG_MMU */
+#endif /* HAVE_GET_VMALLOC_INFO */
+
+/* Source linux/mm/mmzone.c */
+#ifndef HAVE_FIRST_ONLINE_PGDAT
+typedef struct pglist_data *(*first_online_pgdat_t)(void);
+extern first_online_pgdat_t first_online_pgdat_fn;
+#define first_online_pgdat()   first_online_pgdat_fn()
+#endif /* HAVE_FIRST_ONLINE_PGDAT */
+
+/* Source linux/mm/mmzone.c */
+#ifndef HAVE_NEXT_ONLINE_PGDAT
+typedef struct pglist_data *(*next_online_pgdat_t)(struct pglist_data *);
+extern next_online_pgdat_t next_online_pgdat_fn;
+#define next_online_pgdat(pgd) next_online_pgdat_fn(pgd)
+#endif /* HAVE_NEXT_ONLINE_PGDAT */
+
+/* Source linux/mm/mmzone.c */
+#ifndef HAVE_NEXT_ZONE
+typedef struct zone *(*next_zone_t)(struct zone *);
+extern next_zone_t next_zone_fn;
+#define next_zone(zone)                next_zone_fn(zone)
+#endif /* HAVE_NEXT_ZONE */
+
+/* Source linux/mm/vmstat.c */
+#ifndef 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 */
+
+
 #define xcopyin(from, to, size)                copy_from_user(to, from, size)
 #define xcopyout(from, to, size)       copy_to_user(to, from, size)
 
index 96a14c62e1fab9b63ecc29e4f98e91a96c7db266..c23abf6ff78b5c4f8ff829e325307b9a032914ea 100644 (file)
@@ -54,6 +54,10 @@ EXPORT_SYMBOL(hw_serial);
 int p0 = 0;
 EXPORT_SYMBOL(p0);
 
+#ifndef HAVE_KALLSYMS_LOOKUP_NAME
+kallsyms_lookup_name_t spl_kallsyms_lookup_name_fn = NULL;
+#endif
+
 int
 highbit(unsigned long i)
 {
@@ -269,6 +273,42 @@ zone_get_hostid(void *zone)
 }
 EXPORT_SYMBOL(zone_get_hostid);
 
+#ifdef HAVE_KALLSYMS_LOOKUP_NAME
+#define set_kallsyms_lookup_name()     (0)
+#else
+/*
+ * Because kallsyms_lookup_name() is no longer exported in the
+ * mainline kernel we are forced to resort to somewhat drastic
+ * measures.  This function replaces the functionality by performing
+ * an upcall to user space where /proc/kallsyms is consulted for
+ * the requested address.
+ */
+#define GET_KALLSYMS_ADDR_CMD                                          \
+       "awk '{ if ( $3 == \"kallsyms_lookup_name\") { print $1 } }' "  \
+       "/proc/kallsyms >/proc/sys/kernel/spl/kallsyms_lookup_name"
+
+static int
+set_kallsyms_lookup_name(void)
+{
+       char sh_path[] = "/bin/sh";
+       char *argv[] = { sh_path,
+                        "-c",
+                        GET_KALLSYMS_ADDR_CMD,
+                        NULL };
+       char *envp[] = { "HOME=/",
+                        "TERM=linux",
+                        "PATH=/sbin:/usr/sbin:/bin:/usr/bin",
+                        NULL };
+       int rc;
+
+       rc = call_usermodehelper(sh_path, argv, envp, 1);
+       if (rc)
+               return rc;
+
+       return spl_kmem_init_kallsyms_lookup();
+}
+#endif
+
 static int __init spl_init(void)
 {
        int rc = 0;
@@ -297,6 +337,9 @@ static int __init spl_init(void)
        if ((rc = set_hostid()))
                GOTO(out7, rc = -EADDRNOTAVAIL);
 
+       if ((rc = set_kallsyms_lookup_name()))
+               GOTO(out7, rc = -EADDRNOTAVAIL);
+
        printk("SPL: Loaded Solaris Porting Layer v%s\n", VERSION);
        RETURN(rc);
 out7:
index 18613e799c2df30eda3968af14e156702a1ac599..b8b006610d3cb4653a43b90c4d3bac20f1ad67f1 100644 (file)
@@ -79,85 +79,29 @@ EXPORT_SYMBOL(zio_alloc_arena);
 vmem_t *zio_arena = NULL;
 EXPORT_SYMBOL(zio_arena);
 
+#ifndef HAVE_GET_VMALLOC_INFO
+get_vmalloc_info_t get_vmalloc_info_fn = NULL;
+EXPORT_SYMBOL(get_vmalloc_info_fn);
+#endif /* HAVE_GET_VMALLOC_INFO */
+
 #ifndef HAVE_FIRST_ONLINE_PGDAT
-struct pglist_data *
-first_online_pgdat(void)
-{
-       return NODE_DATA(first_online_node);
-}
-EXPORT_SYMBOL(first_online_pgdat);
+first_online_pgdat_t first_online_pgdat_fn = NULL;
+EXPORT_SYMBOL(first_online_pgdat_fn);
 #endif /* HAVE_FIRST_ONLINE_PGDAT */
 
 #ifndef HAVE_NEXT_ONLINE_PGDAT
-struct pglist_data *
-next_online_pgdat(struct pglist_data *pgdat)
-{
-       int nid = next_online_node(pgdat->node_id);
-
-       if (nid == MAX_NUMNODES)
-               return NULL;
-
-       return NODE_DATA(nid);
-}
-EXPORT_SYMBOL(next_online_pgdat);
+next_online_pgdat_t next_online_pgdat_fn = NULL;
+EXPORT_SYMBOL(next_online_pgdat_fn);
 #endif /* HAVE_NEXT_ONLINE_PGDAT */
 
 #ifndef HAVE_NEXT_ZONE
-struct zone *
-next_zone(struct zone *zone)
-{
-       pg_data_t *pgdat = zone->zone_pgdat;
-
-       if (zone < pgdat->node_zones + MAX_NR_ZONES - 1)
-       zone++;
-       else {
-               pgdat = next_online_pgdat(pgdat);
-               if (pgdat)
-                       zone = pgdat->node_zones;
-               else
-                       zone = NULL;
-       }
-       return zone;
-}
-EXPORT_SYMBOL(next_zone);
+next_zone_t next_zone_fn = NULL;
+EXPORT_SYMBOL(next_zone_fn);
 #endif /* HAVE_NEXT_ZONE */
 
 #ifndef HAVE_GET_ZONE_COUNTS
-void
-__get_zone_counts(unsigned long *active, unsigned long *inactive,
-                  unsigned long *free, struct pglist_data *pgdat)
-{
-       struct zone *zones = pgdat->node_zones;
-       int i;
-
-       *active = 0;
-       *inactive = 0;
-       *free = 0;
-       for (i = 0; i < MAX_NR_ZONES; i++) {
-               *active += zones[i].nr_active;
-               *inactive += zones[i].nr_inactive;
-               *free += zones[i].free_pages;
-       }
-}
-
-void
-get_zone_counts(unsigned long *active, unsigned long *inactive,
-                unsigned long *free)
-{
-       struct pglist_data *pgdat;
-
-       *active = 0;
-       *inactive = 0;
-       *free = 0;
-       for_each_online_pgdat(pgdat) {
-               unsigned long l, m, n;
-               __get_zone_counts(&l, &m, &n, pgdat);
-               *active += l;
-               *inactive += m;
-               *free += n;
-       }
-}
-EXPORT_SYMBOL(get_zone_counts);
+get_zone_counts_t get_zone_counts_fn = NULL;
+EXPORT_SYMBOL(get_zone_counts_fn);
 #endif /* HAVE_GET_ZONE_COUNTS */
 
 pgcnt_t
@@ -177,11 +121,20 @@ EXPORT_SYMBOL(spl_kmem_availrmem);
 size_t
 vmem_size(vmem_t *vmp, int typemask)
 {
-       /* Arena's unsupported */
+        struct vmalloc_info vmi;
+       size_t size = 0;
+
        ASSERT(vmp == NULL);
        ASSERT(typemask & (VMEM_ALLOC | VMEM_FREE));
 
-       return 0;
+       get_vmalloc_info(&vmi);
+       if (typemask & VMEM_ALLOC)
+               size += (size_t)vmi.used;
+
+       if (typemask & VMEM_FREE)
+               size += (size_t)(VMALLOC_TOTAL - vmi.used);
+
+       return size;
 }
 EXPORT_SYMBOL(vmem_size);
 
@@ -1812,6 +1765,57 @@ spl_kmem_init_globals(void)
        swapfs_reserve = MIN(4*1024*1024 / PAGE_SIZE, physmem / 16);
 }
 
+/*
+ * Called at module init when it is safe to use spl_kallsyms_lookup_name()
+ */
+int
+spl_kmem_init_kallsyms_lookup(void)
+{
+#ifndef HAVE_GET_VMALLOC_INFO
+       get_vmalloc_info_fn = (get_vmalloc_info_t)
+               spl_kallsyms_lookup_name("get_vmalloc_info");
+       if (!get_vmalloc_info_fn)
+               return -EFAULT;
+#endif /* HAVE_GET_VMALLOC_INFO */
+
+#ifndef HAVE_FIRST_ONLINE_PGDAT
+       first_online_pgdat_fn = (first_online_pgdat_t)
+               spl_kallsyms_lookup_name("first_online_pgdat");
+       if (!first_online_pgdat_fn)
+               return -EFAULT;
+#endif /* HAVE_FIRST_ONLINE_PGDAT */
+
+#ifndef HAVE_NEXT_ONLINE_PGDAT
+       next_online_pgdat_fn = (next_online_pgdat_t)
+               spl_kallsyms_lookup_name("next_online_pgdat");
+       if (!next_online_pgdat_fn)
+               return -EFAULT;
+#endif /* HAVE_NEXT_ONLINE_PGDAT */
+
+#ifndef HAVE_NEXT_ZONE
+       next_zone_fn = (next_zone_t)
+               spl_kallsyms_lookup_name("next_zone");
+       if (!next_zone_fn)
+               return -EFAULT;
+#endif /* HAVE_NEXT_ZONE */
+
+#ifndef HAVE_GET_ZONE_COUNTS
+       get_zone_counts_fn = (get_zone_counts_t)
+               spl_kallsyms_lookup_name("get_zone_counts");
+       if (!get_zone_counts_fn)
+               return -EFAULT;
+#endif /* HAVE_GET_ZONE_COUNTS */
+
+       /*
+        * It is now safe to initialize the global tunings which rely on
+        * the use of the for_each_zone() macro.  This macro in turns
+        * depends on the *_pgdat symbols which are now available.
+        */
+       spl_kmem_init_globals();
+
+       return 0;
+}
+
 int
 spl_kmem_init(void)
 {
@@ -1820,7 +1824,6 @@ spl_kmem_init(void)
 
        init_rwsem(&spl_kmem_cache_sem);
        INIT_LIST_HEAD(&spl_kmem_cache_list);
-       spl_kmem_init_globals();
 
 #ifdef HAVE_SET_SHRINKER
        spl_kmem_cache_shrinker = set_shrinker(KMC_DEFAULT_SEEKS,
index 90c89ce31ba44234b17a320a1fd2ff792c5a8da3..d0ce231943766bfe51fb9f2bcf77430326fb4494 100644 (file)
@@ -68,6 +68,7 @@ struct proc_dir_entry *proc_spl_kstat = NULL;
 #define CTL_VERSION            CTL_UNNUMBERED /* Version */
 #define CTL_HOSTID             CTL_UNNUMBERED /* Host id by /usr/bin/hostid */
 #define CTL_HW_SERIAL          CTL_UNNUMBERED /* HW serial number by hostid */
+#define CTL_KALLSYMS           CTL_UNNUMBERED /* kallsyms_lookup_name addr */
 
 #define CTL_DEBUG_SUBSYS       CTL_UNNUMBERED /* Debug subsystem */
 #define CTL_DEBUG_MASK         CTL_UNNUMBERED /* Debug mask */
@@ -123,6 +124,7 @@ enum {
        CTL_VERSION = 1,                /* Version */
        CTL_HOSTID,                     /* Host id reported by /usr/bin/hostid */
        CTL_HW_SERIAL,                  /* Hardware serial number from hostid */
+       CTL_KALLSYMS,                   /* Address of kallsyms_lookup_name */
 
        CTL_DEBUG_SUBSYS,               /* Debug subsystem */
        CTL_DEBUG_MASK,                 /* Debug mask */
@@ -489,6 +491,51 @@ proc_dohostid(struct ctl_table *table, int write, struct file *filp,
         RETURN(rc);
 }
 
+#ifndef HAVE_KALLSYMS_LOOKUP_NAME
+static int
+proc_dokallsyms_lookup_name(struct ctl_table *table, int write,
+                           struct file *filp, void __user *buffer,
+                           size_t *lenp, loff_t *ppos) {
+        int len, rc = 0;
+        char *end, str[32];
+       ENTRY;
+
+        if (write) {
+               /* This may only be set once at module load time */
+               if (spl_kallsyms_lookup_name_fn)
+                       RETURN(-EEXIST);
+
+               /* We can't use proc_doulongvec_minmax() in the write
+                * case hear because the address while a hex value has no
+                * leading 0x which confuses the helper function. */
+                rc = proc_copyin_string(str, sizeof(str), buffer, *lenp);
+                if (rc < 0)
+                        RETURN(rc);
+
+                spl_kallsyms_lookup_name_fn =
+                       (kallsyms_lookup_name_t)simple_strtoul(str, &end, 16);
+               if (str == end)
+                       RETURN(-EINVAL);
+
+                *ppos += *lenp;
+        } else {
+                len = snprintf(str, sizeof(str), "%lx",
+                              (unsigned long)spl_kallsyms_lookup_name_fn);
+                if (*ppos >= len)
+                        rc = 0;
+                else
+                        rc = proc_copyout_string(buffer,*lenp,str+*ppos,"\n");
+
+                if (rc >= 0) {
+                        *lenp = rc;
+                        *ppos += rc;
+                }
+        }
+
+        RETURN(rc);
+}
+#endif /* HAVE_KALLSYMS_LOOKUP_NAME */
+
 static int
 proc_doavailrmem(struct ctl_table *table, int write, struct file *filp,
                  void __user *buffer, size_t *lenp, loff_t *ppos)
@@ -1018,6 +1065,16 @@ static struct ctl_table spl_table[] = {
                 .mode     = 0444,
                 .proc_handler = &proc_dostring,
         },
+#ifndef HAVE_KALLSYMS_LOOKUP_NAME
+        {
+                .ctl_name = CTL_KALLSYMS,
+                .procname = "kallsyms_lookup_name",
+                .data     = &spl_kallsyms_lookup_name_fn,
+                .maxlen   = sizeof(unsigned long),
+                .mode     = 0644,
+                .proc_handler = &proc_dokallsyms_lookup_name,
+        },
+#endif
        {
                .ctl_name = CTL_SPL_DEBUG,
                .procname = "debug",
diff --git a/patches/16kstack-x86_64.patch b/patches/16kstack-x86_64.patch
deleted file mode 100644 (file)
index 330cedd..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-Index: linux+rh+chaos/include/asm-x86_64/page.h
-===================================================================
---- linux+rh+chaos.orig/include/asm-x86_64/page.h
-+++ linux+rh+chaos/include/asm-x86_64/page.h
-@@ -10,7 +10,7 @@
- #define PAGE_MASK     (~(PAGE_SIZE-1))
- #define PHYSICAL_PAGE_MASK    (~(PAGE_SIZE-1) & __PHYSICAL_MASK)
--#define THREAD_ORDER 1 
-+#define THREAD_ORDER 2 
- #define THREAD_SIZE  (PAGE_SIZE << THREAD_ORDER)
- #define CURRENT_MASK (~(THREAD_SIZE-1))
diff --git a/patches/rhel5-spl-export-symbols.patch b/patches/rhel5-spl-export-symbols.patch
new file mode 100644 (file)
index 0000000..772242c
--- /dev/null
@@ -0,0 +1,91 @@
+Index: linux+rh+chaos/kernel/sched.c
+===================================================================
+--- linux+rh+chaos.orig/kernel/sched.c
++++ linux+rh+chaos/kernel/sched.c
+@@ -1034,10 +1034,11 @@ static inline void resched_task(struct t
+  * task_curr - is this task currently executing on a CPU?
+  * @p: the task in question.
+  */
+-inline int task_curr(const struct task_struct *p)
++int task_curr(const struct task_struct *p)
+ {
+       return cpu_curr(task_cpu(p)) == p;
+ }
++EXPORT_SYMBOL(task_curr); /* Request export upstream */
+ /* Used instead of source_load when we know the type == 0 */
+ unsigned long weighted_cpuload(const int cpu)
+Index: linux+rh+chaos/kernel/time.c
+===================================================================
+--- linux+rh+chaos.orig/kernel/time.c
++++ linux+rh+chaos/kernel/time.c
+@@ -605,6 +605,7 @@ void set_normalized_timespec(struct time
+       ts->tv_sec = sec;
+       ts->tv_nsec = nsec;
+ }
++EXPORT_SYMBOL(set_normalized_timespec); /* Exported as of 2.6.26 */
+ /**
+  * ns_to_timespec - Convert nanoseconds to timespec
+Index: linux+rh+chaos/kernel/kallsyms.c
+===================================================================
+--- linux+rh+chaos.orig/kernel/kallsyms.c
++++ linux+rh+chaos/kernel/kallsyms.c
+@@ -154,6 +154,7 @@ unsigned long kallsyms_lookup_name(const
+       }
+       return module_kallsyms_lookup_name(name);
+ }
++EXPORT_SYMBOL(kallsyms_lookup_name); /* Exported prior to 2.6.19 */
+ /*
+  * Lookup an address
+Index: linux+rh+chaos/fs/proc/mmu.c
+===================================================================
+--- linux+rh+chaos.orig/fs/proc/mmu.c
++++ linux+rh+chaos/fs/proc/mmu.c
+@@ -75,3 +75,4 @@ void get_vmalloc_info(struct vmalloc_inf
+               read_unlock(&vmlist_lock);
+       }
+ }
++EXPORT_SYMBOL(get_vmalloc_info); /* Request clean upstream API for this */
+Index: linux+rh+chaos/mm/mmzone.c
+===================================================================
+--- linux+rh+chaos.orig/mm/mmzone.c
++++ linux+rh+chaos/mm/mmzone.c
+@@ -14,7 +14,7 @@ struct pglist_data *first_online_pgdat(v
+       return NODE_DATA(first_online_node);
+ }
+-EXPORT_UNUSED_SYMBOL(first_online_pgdat);  /*  June 2006  */
++EXPORT_SYMBOL(first_online_pgdat);  /* Exported prior to 2.6.18 */
+ struct pglist_data *next_online_pgdat(struct pglist_data *pgdat)
+ {
+@@ -24,7 +24,7 @@ struct pglist_data *next_online_pgdat(st
+               return NULL;
+       return NODE_DATA(nid);
+ }
+-EXPORT_UNUSED_SYMBOL(next_online_pgdat);  /*  June 2006  */
++EXPORT_SYMBOL(next_online_pgdat);  /* Exported prior to 2.6.18 */
+ /*
+@@ -45,5 +45,5 @@ struct zone *next_zone(struct zone *zone
+       }
+       return zone;
+ }
+-EXPORT_UNUSED_SYMBOL(next_zone);  /*  June 2006  */
++EXPORT_SYMBOL(next_zone);  /* Exported prior to 2.6.18 */
+Index: linux+rh+chaos/mm/vmstat.c
+===================================================================
+--- linux+rh+chaos.orig/mm/vmstat.c
++++ linux+rh+chaos/mm/vmstat.c
+@@ -45,6 +45,7 @@ void get_zone_counts(unsigned long *acti
+               *free += n;
+       }
+ }
++EXPORT_SYMBOL(get_zone_counts); /* Request clean upstream API for this */
+ #ifdef CONFIG_VM_EVENT_COUNTERS
+ DEFINE_PER_CPU(struct vm_event_state, vm_event_states) = {{0}};
diff --git a/patches/task-curr-export.patch b/patches/task-curr-export.patch
deleted file mode 100644 (file)
index 53007d2..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Index: linux+rh+chaos/kernel/sched.c
-===================================================================
---- linux+rh+chaos.orig/kernel/sched.c
-+++ linux+rh+chaos/kernel/sched.c
-@@ -1038,6 +1038,7 @@ inline int task_curr(const struct task_s
- {
-       return cpu_curr(task_cpu(p)) == p;
- }
-+EXPORT_SYMBOL(task_curr);
- /* Used instead of source_load when we know the type == 0 */
- unsigned long weighted_cpuload(const int cpu)
index 1b7c8abab2e457c1c14fcc89619857ef4e05d6ae..7e677708afb234c50565156f2811f10ed8054bc8 100644 (file)
@@ -51,6 +51,9 @@
 /* fls64() is available */
 #undef HAVE_FLS64
 
+/* get_vmalloc_info() is available */
+#undef HAVE_GET_VMALLOC_INFO
+
 /* get_zone_counts() is available */
 #undef HAVE_GET_ZONE_COUNTS
 
@@ -63,6 +66,9 @@
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
+/* kallsyms_lookup_name() is available */
+#undef HAVE_KALLSYMS_LOOKUP_NAME
+
 /* kmalloc_node() is available */
 #undef HAVE_KMALLOC_NODE