diff --git a/config/spl-build.m4 b/config/spl-build.m4 index 5ee615bf8d..a90fb61702 100644 --- a/config/spl-build.m4 +++ b/config/spl-build.m4 @@ -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( diff --git a/configure b/configure index b0d5b8e586..d436b8a7c9 100755 --- 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 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 + 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.*(first_online_pgdat)" "$LINUX/$file" 2>/dev/null + 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_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_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 diff --git a/configure.ac b/configure.ac index 5329a11577..7a5d52b683 100644 --- a/configure.ac +++ b/configure.ac @@ -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 index 0000000000..82abed41d0 --- /dev/null +++ b/include/linux/kallsyms_compat.h @@ -0,0 +1,17 @@ +#ifndef _SPL_KALLSYMS_COMPAT_H +#define _SPL_KALLSYMS_COMPAT_H + +#ifdef HAVE_KALLSYMS_LOOKUP_NAME + +#include +#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 */ diff --git a/include/sys/kmem.h b/include/sys/kmem.h index 318cf5ee88..caba9104fc 100644 --- a/include/sys/kmem.h +++ b/include/sys/kmem.h @@ -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); diff --git a/include/sys/types.h b/include/sys/types.h index 0b5cae641e..699efe648b 100644 --- a/include/sys/types.h +++ b/include/sys/types.h @@ -16,6 +16,7 @@ extern "C" { #include #include #include +#include #ifndef HAVE_UINTPTR_T typedef unsigned long uintptr_t; diff --git a/include/sys/vmsystm.h b/include/sys/vmsystm.h index 75ae8a9914..7876fc72b9 100644 --- a/include/sys/vmsystm.h +++ b/include/sys/vmsystm.h @@ -58,12 +58,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) diff --git a/module/spl/spl-generic.c b/module/spl/spl-generic.c index 96a14c62e1..c23abf6ff7 100644 --- a/module/spl/spl-generic.c +++ b/module/spl/spl-generic.c @@ -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: diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c index 18613e799c..b8b006610d 100644 --- a/module/spl/spl-kmem.c +++ b/module/spl/spl-kmem.c @@ -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, diff --git a/module/spl/spl-proc.c b/module/spl/spl-proc.c index 90c89ce31b..d0ce231943 100644 --- a/module/spl/spl-proc.c +++ b/module/spl/spl-proc.c @@ -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 index 330cedddf0..0000000000 --- a/patches/16kstack-x86_64.patch +++ /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 index 0000000000..772242cf44 --- /dev/null +++ b/patches/rhel5-spl-export-symbols.patch @@ -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 index 53007d2ba5..0000000000 --- a/patches/task-curr-export.patch +++ /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) diff --git a/spl_config.h.in b/spl_config.h.in index 1b7c8abab2..7e677708af 100644 --- a/spl_config.h.in +++ b/spl_config.h.in @@ -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 header file. */ #undef HAVE_INTTYPES_H +/* kallsyms_lookup_name() is available */ +#undef HAVE_KALLSYMS_LOOKUP_NAME + /* kmalloc_node() is available */ #undef HAVE_KMALLOC_NODE