mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 19:19:32 +03:00
Breaking the world for a little bit. If anyone is going to continue
working on this branch for the next few days I suggested you work off of the 0.3.1 tag. The following changes are fairly extensive and are designed to make the SPL compatible with all kernels in the range of 2.6.18-2.6.25. There were 13 relevant API changes between these releases and I have added the needed autoconf tests to check for them. However, this has not all been tested extensively. I'll sort of the breakage on Fedora Core 9 and RHEL5 this week. SPL_AC_TYPE_UINTPTR_T SPL_AC_TYPE_KMEM_CACHE_T SPL_AC_KMEM_CACHE_DESTROY_INT SPL_AC_ATOMIC_PANIC_NOTIFIER SPL_AC_3ARGS_INIT_WORK SPL_AC_2ARGS_REGISTER_SYSCTL SPL_AC_KMEM_CACHE_T SPL_AC_KMEM_CACHE_CREATE_DTOR SPL_AC_3ARG_KMEM_CACHE_CREATE_CTOR SPL_AC_SET_SHRINKER SPL_AC_PATH_IN_NAMEIDATA SPL_AC_TASK_CURR SPL_AC_CTL_UNNUMBERED git-svn-id: https://outreach.scidac.gov/svn/spl/trunk@119 7e1ea52c-4ff2-0310-8f11-9dd32ca42a1c
This commit is contained in:
parent
65a045dace
commit
57d862349b
@ -1,3 +1,8 @@
|
|||||||
|
2008-05-25 Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
|
||||||
|
* configure.ac, autoconf/* : Initial pass at resolving
|
||||||
|
API changes introduced by kernels newer than 2.6.18.
|
||||||
|
|
||||||
2008-05-21 Brian Behlendorf <behlendorf1@llnl.gov>
|
2008-05-21 Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
|
||||||
* : Tag spl-0.3.1
|
* : Tag spl-0.3.1
|
||||||
|
541
autoconf/spl-build.m4
Normal file
541
autoconf/spl-build.m4
Normal file
@ -0,0 +1,541 @@
|
|||||||
|
AC_DEFUN([SPL_AC_KERNEL], [
|
||||||
|
ver=`uname -r`
|
||||||
|
|
||||||
|
AC_ARG_WITH([linux],
|
||||||
|
AS_HELP_STRING([--with-linux=PATH],
|
||||||
|
[Path to kernel source]),
|
||||||
|
[kernelsrc="$withval"; kernelbuild="$withval"])
|
||||||
|
|
||||||
|
AC_ARG_WITH([linux-obj],
|
||||||
|
AS_HELP_STRING([--with-linux-obj=PATH],
|
||||||
|
[Path to kernel build objects]),
|
||||||
|
[kernelbuild="$withval"])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([kernel source directory])
|
||||||
|
if test -z "$kernelsrc"; then
|
||||||
|
kernelbuild=
|
||||||
|
sourcelink=/lib/modules/${ver}/source
|
||||||
|
buildlink=/lib/modules/${ver}/build
|
||||||
|
|
||||||
|
if test -e $sourcelink; then
|
||||||
|
kernelsrc=`(cd $sourcelink; /bin/pwd)`
|
||||||
|
fi
|
||||||
|
if test -e $buildlink; then
|
||||||
|
kernelbuild=`(cd $buildlink; /bin/pwd)`
|
||||||
|
fi
|
||||||
|
if test -z "$kernelsrc"; then
|
||||||
|
kernelsrc=$kernelbuild
|
||||||
|
fi
|
||||||
|
if test -z "$kernelsrc" -o -z "$kernelbuild"; then
|
||||||
|
AC_MSG_RESULT([Not found])
|
||||||
|
AC_MSG_ERROR([
|
||||||
|
*** Please specify the location of the kernel source
|
||||||
|
*** with the '--with-kernel=PATH' option])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_MSG_RESULT([$kernelsrc])
|
||||||
|
AC_MSG_CHECKING([kernel build directory])
|
||||||
|
AC_MSG_RESULT([$kernelbuild])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([kernel source version])
|
||||||
|
if test -r $kernelbuild/include/linux/version.h &&
|
||||||
|
fgrep -q UTS_RELEASE $kernelbuild/include/linux/version.h; then
|
||||||
|
|
||||||
|
kernsrcver=`(echo "#include <linux/version.h>";
|
||||||
|
echo "kernsrcver=UTS_RELEASE") |
|
||||||
|
cpp -I $kernelbuild/include |
|
||||||
|
grep "^kernsrcver=" | cut -d \" -f 2`
|
||||||
|
|
||||||
|
elif test -r $kernelbuild/include/linux/utsrelease.h &&
|
||||||
|
fgrep -q UTS_RELEASE $kernelbuild/include/linux/utsrelease.h; then
|
||||||
|
|
||||||
|
kernsrcver=`(echo "#include <linux/utsrelease.h>";
|
||||||
|
echo "kernsrcver=UTS_RELEASE") |
|
||||||
|
cpp -I $kernelbuild/include |
|
||||||
|
grep "^kernsrcver=" | cut -d \" -f 2`
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "$kernsrcver"; then
|
||||||
|
AC_MSG_RESULT([Not found])
|
||||||
|
AC_MSG_ERROR([
|
||||||
|
*** Cannot determine the version of the linux kernel source.
|
||||||
|
*** Please prepare the kernel before running this script])
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_MSG_RESULT([$kernsrcver])
|
||||||
|
|
||||||
|
kmoduledir=${INSTALL_MOD_PATH}/lib/modules/$kernsrcver
|
||||||
|
LINUX=${kernelsrc}
|
||||||
|
LINUX_OBJ=${kernelbuild}
|
||||||
|
|
||||||
|
AC_SUBST(LINUX)
|
||||||
|
AC_SUBST(LINUX_OBJ)
|
||||||
|
AC_SUBST(kmoduledir)
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([SPL_AC_DEBUG], [
|
||||||
|
AC_MSG_CHECKING([whether debugging is enabled])
|
||||||
|
AC_ARG_ENABLE( [debug],
|
||||||
|
AS_HELP_STRING([--enable-debug],
|
||||||
|
[Enable generic debug support (default off)]),
|
||||||
|
[ case "$enableval" in
|
||||||
|
yes) spl_ac_debug=yes ;;
|
||||||
|
no) spl_ac_debug=no ;;
|
||||||
|
*) AC_MSG_RESULT([Error!])
|
||||||
|
AC_MSG_ERROR([Bad value "$enableval" for --enable-debug]) ;;
|
||||||
|
esac ]
|
||||||
|
)
|
||||||
|
if test "$spl_ac_debug" = yes; then
|
||||||
|
KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG"
|
||||||
|
else
|
||||||
|
KERNELCPPFLAGS="${KERNELCPPFLAGS} -DNDEBUG"
|
||||||
|
AC_DEFINE([NDEBUG], [1],
|
||||||
|
[Define to 1 to disable debug tracing])
|
||||||
|
fi
|
||||||
|
AC_MSG_RESULT([${spl_ac_debug=no}])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([SPL_AC_DEBUG_KMEM], [
|
||||||
|
AC_MSG_CHECKING([whether kmem debugging is enabled])
|
||||||
|
AC_ARG_ENABLE( [debug-kmem],
|
||||||
|
AS_HELP_STRING([--enable-debug-kmem],
|
||||||
|
[Enable kmem debug support (default off)]),
|
||||||
|
[ case "$enableval" in
|
||||||
|
yes) spl_ac_debug=yes ;;
|
||||||
|
no) spl_ac_debug=no ;;
|
||||||
|
*) AC_MSG_RESULT([Error!])
|
||||||
|
AC_MSG_ERROR([Bad value "$enableval" for --enable-debug-kmem]) ;;
|
||||||
|
esac ]
|
||||||
|
)
|
||||||
|
if test "$spl_ac_debug" = yes; then
|
||||||
|
KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG_KMEM"
|
||||||
|
AC_DEFINE([DEBUG_KMEM], [1],
|
||||||
|
[Define to 1 to enable kmem debugging])
|
||||||
|
fi
|
||||||
|
AC_MSG_RESULT([${spl_ac_debug=no}])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([SPL_AC_DEBUG_MUTEX], [
|
||||||
|
AC_MSG_CHECKING([whether mutex debugging is enabled])
|
||||||
|
AC_ARG_ENABLE( [debug-mutex],
|
||||||
|
AS_HELP_STRING([--enable-debug-mutex],
|
||||||
|
[Enable mutex debug support (default off)]),
|
||||||
|
[ case "$enableval" in
|
||||||
|
yes) spl_ac_debug=yes ;;
|
||||||
|
no) spl_ac_debug=no ;;
|
||||||
|
*) AC_MSG_RESULT([Error!])
|
||||||
|
AC_MSG_ERROR([Bad value "$enableval" for --enable-debug-mutex]) ;;
|
||||||
|
esac ]
|
||||||
|
)
|
||||||
|
if test "$spl_ac_debug" = yes; then
|
||||||
|
KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG_MUTEX"
|
||||||
|
AC_DEFINE([DEBUG_MUTEX], [1],
|
||||||
|
[Define to 1 to enable mutex debugging])
|
||||||
|
fi
|
||||||
|
AC_MSG_RESULT([${spl_ac_debug=no}])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([SPL_AC_DEBUG_KSTAT], [
|
||||||
|
AC_MSG_CHECKING([whether kstat debugging is enabled])
|
||||||
|
AC_ARG_ENABLE( [debug-kstat],
|
||||||
|
AS_HELP_STRING([--enable-debug-kstat],
|
||||||
|
[Enable kstat debug support (default off)]),
|
||||||
|
[ case "$enableval" in
|
||||||
|
yes) spl_ac_debug=yes ;;
|
||||||
|
no) spl_ac_debug=no ;;
|
||||||
|
*) AC_MSG_RESULT([Error!])
|
||||||
|
AC_MSG_ERROR([Bad value "$enableval" for --enable-debug-kstat]) ;;
|
||||||
|
esac ]
|
||||||
|
)
|
||||||
|
if test "$spl_ac_debug" = yes; then
|
||||||
|
KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG_KSTAT"
|
||||||
|
AC_DEFINE([DEBUG_KSTAT], [1],
|
||||||
|
[Define to 1 to enable kstat debugging])
|
||||||
|
fi
|
||||||
|
AC_MSG_RESULT([${spl_ac_debug=no}])
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN([SPL_AC_DEBUG_CALLB], [
|
||||||
|
AC_MSG_CHECKING([whether callb debugging is enabled])
|
||||||
|
AC_ARG_ENABLE( [debug-callb],
|
||||||
|
AS_HELP_STRING([--enable-debug-callb],
|
||||||
|
[Enable callb debug support (default off)]),
|
||||||
|
[ case "$enableval" in
|
||||||
|
yes) spl_ac_debug=yes ;;
|
||||||
|
no) spl_ac_debug=no ;;
|
||||||
|
*) AC_MSG_RESULT([Error!])
|
||||||
|
AC_MSG_ERROR([Bad value "$enableval" for --enable-debug-callb]) ;;
|
||||||
|
esac ]
|
||||||
|
)
|
||||||
|
if test "$spl_ac_debug" = yes; then
|
||||||
|
KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG_CALLB"
|
||||||
|
AC_DEFINE([DEBUG_CALLB], [1],
|
||||||
|
[Define to 1 to enable callb debugging])
|
||||||
|
fi
|
||||||
|
AC_MSG_RESULT([${spl_ac_debug=no}])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # SPL_LINUX_CONFTEST
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([SPL_LINUX_CONFTEST], [
|
||||||
|
cat >conftest.c <<_ACEOF
|
||||||
|
$1
|
||||||
|
_ACEOF
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # SPL_LANG_PROGRAM(C)([PROLOGUE], [BODY])
|
||||||
|
dnl #
|
||||||
|
m4_define([SPL_LANG_PROGRAM], [
|
||||||
|
$1
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
dnl Do *not* indent the following line: there may be CPP directives.
|
||||||
|
dnl Don't move the `;' right after for the same reason.
|
||||||
|
$2
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # SPL_LINUX_COMPILE_IFELSE / like AC_COMPILE_IFELSE
|
||||||
|
dnl #
|
||||||
|
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])],
|
||||||
|
[$4],
|
||||||
|
[_AC_MSG_LOG_CONFTEST
|
||||||
|
m4_ifvaln([$5],[$5])dnl])dnl
|
||||||
|
rm -f build/conftest.o build/conftest.mod.c build/conftest.mod.o build/conftest.ko m4_ifval([$1], [build/conftest.c conftest.c])[]dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # SPL_LINUX_TRY_COMPILE like AC_TRY_COMPILE
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([SPL_LINUX_TRY_COMPILE],
|
||||||
|
[SPL_LINUX_COMPILE_IFELSE(
|
||||||
|
[AC_LANG_SOURCE([SPL_LANG_PROGRAM([[$1]], [[$2]])])],
|
||||||
|
[modules],
|
||||||
|
[test -s build/conftest.o],
|
||||||
|
[$3], [$4])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # SPL_LINUX_CONFIG
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([SPL_LINUX_CONFIG],
|
||||||
|
[AC_MSG_CHECKING([whether Linux was built with CONFIG_$1])
|
||||||
|
SPL_LINUX_TRY_COMPILE([
|
||||||
|
#ifndef AUTOCONF_INCLUDED
|
||||||
|
#include <linux/config.h>
|
||||||
|
#endif
|
||||||
|
],[
|
||||||
|
#ifndef CONFIG_$1
|
||||||
|
#error CONFIG_$1 not #defined
|
||||||
|
#endif
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
$2
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
$3
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # SPL_CHECK_SYMBOL_EXPORT
|
||||||
|
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
|
||||||
|
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
|
||||||
|
rc=$?
|
||||||
|
if test $rc -eq 0; then
|
||||||
|
export=1
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test $export -eq 0; then
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
$4
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
$3
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
$3
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 2.6.x API change
|
||||||
|
dnl # check if uintptr_t typedef is defined
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([SPL_AC_TYPE_UINTPTR_T],
|
||||||
|
[AC_MSG_CHECKING([whether kernel defines uintptr_t])
|
||||||
|
SPL_LINUX_TRY_COMPILE([
|
||||||
|
#include <linux/types.h>
|
||||||
|
],[
|
||||||
|
uintptr_t *ptr;
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
AC_DEFINE(HAVE_UINTPTR_T, 1,
|
||||||
|
[kernel defines uintptr_t])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 2.6.x API change
|
||||||
|
dnl # check if kmem_cache_t typedef is defined
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([SPL_AC_TYPE_KMEM_CACHE_T],
|
||||||
|
[AC_MSG_CHECKING([whether kernel defines kmem_cache_t])
|
||||||
|
SPL_LINUX_TRY_COMPILE([
|
||||||
|
#include <linux/slab.h>
|
||||||
|
],[
|
||||||
|
kmem_cache_t *cache;
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
AC_DEFINE(HAVE_KMEM_CACHE_T, 1,
|
||||||
|
[kernel defines kmem_cache_t])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 2.6.19 API change
|
||||||
|
dnl # kmem_cache_destroy() return void instead of int
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([SPL_AC_KMEM_CACHE_DESTROY_INT],
|
||||||
|
[AC_MSG_CHECKING([whether kmem_cache_destroy() returns int])
|
||||||
|
SPL_LINUX_TRY_COMPILE([
|
||||||
|
#include <linux/slab.h>
|
||||||
|
],[
|
||||||
|
int i = kmem_cache_destroy(NULL);
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_KMEM_CACHE_DESTROY_INT, 1,
|
||||||
|
[kmem_cache_destroy() returns int])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 2.6.19 API change
|
||||||
|
dnl # panic_notifier_list use atomic_notifier operations
|
||||||
|
dnl #
|
||||||
|
|
||||||
|
AC_DEFUN([SPL_AC_ATOMIC_PANIC_NOTIFIER],
|
||||||
|
[AC_MSG_CHECKING([whether panic_notifier_list is atomic])
|
||||||
|
SPL_LINUX_TRY_COMPILE([
|
||||||
|
#include <linux/notifier.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
],[
|
||||||
|
struct atomic_notifier_head panic_notifier_list;
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_ATOMIC_PANIC_NOTIFIER, 1,
|
||||||
|
[panic_notifier_list is atomic])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 2.6.20 API change
|
||||||
|
dnl # INIT_WORK use 2 args and not store data inside
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([SPL_AC_3ARGS_INIT_WORK],
|
||||||
|
[AC_MSG_CHECKING([whether INIT_WORK wants 3 args])
|
||||||
|
SPL_LINUX_TRY_COMPILE([
|
||||||
|
#include <linux/workqueue.h>
|
||||||
|
],[
|
||||||
|
struct work_struct work;
|
||||||
|
|
||||||
|
INIT_WORK(&work, NULL, NULL);
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_3ARGS_INIT_WORK, 1,
|
||||||
|
[INIT_WORK wants 3 args])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 2.6.21 api change.
|
||||||
|
dnl # 'register_sysctl_table' use only one argument instead of two
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([SPL_AC_2ARGS_REGISTER_SYSCTL],
|
||||||
|
[AC_MSG_CHECKING([whether register_sysctl_table() wants 2 args])
|
||||||
|
SPL_LINUX_TRY_COMPILE([
|
||||||
|
#include <linux/sysctl.h>
|
||||||
|
],[
|
||||||
|
return register_sysctl_table(NULL,0);
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_2ARGS_REGISTER_SYSCTL, 1,
|
||||||
|
[register_sysctl_table() wants 2 args])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 2.6.21 API change
|
||||||
|
dnl # Use struct kmem_cache for missing kmem_cache_t
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([SPL_AC_KMEM_CACHE_T], [
|
||||||
|
AC_MSG_CHECKING([whether kernel has kmem_cache_t])
|
||||||
|
tmp_flags="$EXTRA_KCFLAGS"
|
||||||
|
EXTRA_KCFLAGS="-Werror"
|
||||||
|
SPL_LINUX_TRY_COMPILE([
|
||||||
|
#include <linux/slab.h>
|
||||||
|
],[
|
||||||
|
kmem_cache_t *cachep = NULL;
|
||||||
|
kmem_cache_free(cachep, NULL);
|
||||||
|
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
AC_DEFINE(HAVE_KMEM_CACHE_T, 1,
|
||||||
|
[kernel has struct kmem_cache_t])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
])
|
||||||
|
EXTRA_KCFLAGS="$tmp_flags"
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 2.6.23 API change
|
||||||
|
dnl # Slab no longer accepts a dtor argument
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([SPL_AC_KMEM_CACHE_CREATE_DTOR],
|
||||||
|
[AC_MSG_CHECKING([whether kmem_cache_create() has dtor arg])
|
||||||
|
SPL_LINUX_TRY_COMPILE([
|
||||||
|
#include <linux/slab.h>
|
||||||
|
],[
|
||||||
|
kmem_cache_create(NULL, 0, 0, 0, NULL, NULL);
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_KMEM_CACHE_CREATE_DTOR, 1,
|
||||||
|
[kmem_cache_create() has dtor arg])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 2.6.x API change
|
||||||
|
dnl # Slab ctor no longer takes 3 args
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([SPL_AC_3ARG_KMEM_CACHE_CREATE_CTOR],
|
||||||
|
[AC_MSG_CHECKING([whether slab ctor wants 3 args])
|
||||||
|
tmp_flags="$EXTRA_KCFLAGS"
|
||||||
|
EXTRA_KCFLAGS="-Werror"
|
||||||
|
SPL_LINUX_TRY_COMPILE([
|
||||||
|
#include <linux/slab.h>
|
||||||
|
],[
|
||||||
|
void (*ctor)(void *,struct kmem_cache *,unsigned long) = NULL;
|
||||||
|
|
||||||
|
#ifdef HAVE_KMEM_CACHE_CREATE_DTOR
|
||||||
|
kmem_cache_create(NULL, 0, 0, 0, ctor, NULL);
|
||||||
|
#else
|
||||||
|
kmem_cache_create(NULL, 0, 0, 0, ctor);
|
||||||
|
#endif
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_3ARG_KMEM_CACHE_CREATE_CTOR, 1,
|
||||||
|
[slab ctor wants 3 args])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
EXTRA_KCFLAGS="$tmp_flags"
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 2.6.x API change
|
||||||
|
dnl # Old set_shrinker API replaced with register_shrinker
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([SPL_AC_SET_SHRINKER], [
|
||||||
|
AC_MSG_CHECKING([whether set_shrinker() available])
|
||||||
|
SPL_LINUX_TRY_COMPILE([
|
||||||
|
#include <linux/mm.h>
|
||||||
|
],[
|
||||||
|
return set_shrinker(DEFAULT_SEEKS, NULL);
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
AC_DEFINE(HAVE_SET_SHRINKER, 1,
|
||||||
|
[set_shrinker() available])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 2.6.x API change
|
||||||
|
dnl # struct path entry added to struct nameidata
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([SPL_AC_PATH_IN_NAMEIDATA],
|
||||||
|
[AC_MSG_CHECKING([whether struct path used in struct nameidata])
|
||||||
|
SPL_LINUX_TRY_COMPILE([
|
||||||
|
#include <linux/namei.h>
|
||||||
|
],[
|
||||||
|
struct nameidata nd;
|
||||||
|
|
||||||
|
nd.path.mnt = NULL;
|
||||||
|
nd.path.dentry = NULL;
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_PATH_IN_NAMEIDATA, 1,
|
||||||
|
[struct path used in struct nameidata])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # Custom SPL patch may export this system it is not required
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([SPL_AC_TASK_CURR], [
|
||||||
|
SPL_CHECK_SYMBOL_EXPORT([task_curr], [kernel/sched.c],
|
||||||
|
[AC_DEFINE(HAVE_TASK_CURR, 1, [task_curr() exported])],
|
||||||
|
[])
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # 2.6.x API change
|
||||||
|
dnl # Use CTL_UNNUMBERED when binary sysctl is not required
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([SPL_AC_CTL_UNNUMBERED],
|
||||||
|
[AC_MSG_CHECKING([whether unnumbered sysctl support exists])
|
||||||
|
SPL_LINUX_TRY_COMPILE([
|
||||||
|
#include <linux/sysctl.h>
|
||||||
|
],[
|
||||||
|
#ifndef CTL_UNNUMBERED
|
||||||
|
#error CTL_UNNUMBERED undefined
|
||||||
|
#endif
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_CTL_UNNUMBERED, 1,
|
||||||
|
[unnumbered sysctl support exists])
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
|
])
|
@ -3,8 +3,8 @@
|
|||||||
find . -type d -name .deps | xargs rm -rf
|
find . -type d -name .deps | xargs rm -rf
|
||||||
rm -rf config.guess config.sub ltmain.sh
|
rm -rf config.guess config.sub ltmain.sh
|
||||||
libtoolize --automake
|
libtoolize --automake
|
||||||
aclocal 2>/dev/null &&
|
aclocal -I autoconf 2>/dev/null &&
|
||||||
autoheader &&
|
autoheader &&
|
||||||
automake --add-missing --include-deps # 2>/dev/null &&
|
automake --add-missing --include-deps 2>/dev/null
|
||||||
autoconf
|
autoconf
|
||||||
|
|
||||||
|
194
configure.ac
194
configure.ac
@ -28,187 +28,14 @@ AC_INIT
|
|||||||
|
|
||||||
AC_CANONICAL_SYSTEM
|
AC_CANONICAL_SYSTEM
|
||||||
AM_INIT_AUTOMAKE(spl, 0.3.1)
|
AM_INIT_AUTOMAKE(spl, 0.3.1)
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([spl_config.h])
|
||||||
|
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AC_PROG_LIBTOOL
|
AC_PROG_LIBTOOL
|
||||||
|
|
||||||
kernelsrc=
|
LINUX=
|
||||||
kernelbuild=
|
LINUX_OBJ=
|
||||||
|
|
||||||
AC_DEFUN([SPL_AC_KERNEL], [
|
|
||||||
ver=`uname -r`
|
|
||||||
|
|
||||||
AC_ARG_WITH([linux],
|
|
||||||
AS_HELP_STRING([--with-linux=PATH],
|
|
||||||
[Path to kernel source]),
|
|
||||||
[kernelsrc="$withval"; kernelbuild="$withval"])
|
|
||||||
|
|
||||||
AC_ARG_WITH([linux-obj],
|
|
||||||
AS_HELP_STRING([--with-linux-obj=PATH],
|
|
||||||
[Path to kernel build objects]),
|
|
||||||
[kernelbuild="$withval"])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([kernel source directory])
|
|
||||||
if test -z "$kernelsrc"; then
|
|
||||||
kernelbuild=
|
|
||||||
sourcelink=/lib/modules/${ver}/source
|
|
||||||
buildlink=/lib/modules/${ver}/build
|
|
||||||
|
|
||||||
if test -e $sourcelink; then
|
|
||||||
kernelsrc=`(cd $sourcelink; /bin/pwd)`
|
|
||||||
fi
|
|
||||||
if test -e $buildlink; then
|
|
||||||
kernelbuild=`(cd $buildlink; /bin/pwd)`
|
|
||||||
fi
|
|
||||||
if test -z "$kernelsrc"; then
|
|
||||||
kernelsrc=$kernelbuild
|
|
||||||
fi
|
|
||||||
if test -z "$kernelsrc" -o -z "$kernelbuild"; then
|
|
||||||
AC_MSG_RESULT([Not found])
|
|
||||||
AC_MSG_ERROR([
|
|
||||||
*** Please specify the location of the kernel source
|
|
||||||
*** with the '--with-kernel=PATH' option])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_MSG_RESULT([$kernelsrc])
|
|
||||||
AC_MSG_CHECKING([kernel build directory])
|
|
||||||
AC_MSG_RESULT([$kernelbuild])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([kernel source version])
|
|
||||||
if test -r $kernelbuild/include/linux/version.h &&
|
|
||||||
fgrep -q UTS_RELEASE $kernelbuild/include/linux/version.h; then
|
|
||||||
|
|
||||||
kernsrcver=`(echo "#include <linux/version.h>";
|
|
||||||
echo "kernsrcver=UTS_RELEASE") |
|
|
||||||
cpp -I $kernelbuild/include |
|
|
||||||
grep "^kernsrcver=" | cut -d \" -f 2`
|
|
||||||
|
|
||||||
elif test -r $kernelbuild/include/linux/utsrelease.h &&
|
|
||||||
fgrep -q UTS_RELEASE $kernelbuild/include/linux/utsrelease.h; then
|
|
||||||
|
|
||||||
kernsrcver=`(echo "#include <linux/utsrelease.h>";
|
|
||||||
echo "kernsrcver=UTS_RELEASE") |
|
|
||||||
cpp -I $kernelbuild/include |
|
|
||||||
grep "^kernsrcver=" | cut -d \" -f 2`
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$kernsrcver"; then
|
|
||||||
AC_MSG_RESULT([Not found])
|
|
||||||
AC_MSG_ERROR([
|
|
||||||
*** Cannot determine the version of the linux kernel source.
|
|
||||||
*** Please prepare the kernel before running this script])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_MSG_RESULT([$kernsrcver])
|
|
||||||
kmoduledir=${INSTALL_MOD_PATH}/lib/modules/$kernsrcver
|
|
||||||
AC_SUBST(kernelsrc)
|
|
||||||
AC_SUBST(kmoduledir)
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([SPL_AC_DEBUG], [
|
|
||||||
AC_MSG_CHECKING([whether debugging is enabled])
|
|
||||||
AC_ARG_ENABLE( [debug],
|
|
||||||
AS_HELP_STRING([--enable-debug],
|
|
||||||
[Enable generic debug support (default off)]),
|
|
||||||
[ case "$enableval" in
|
|
||||||
yes) spl_ac_debug=yes ;;
|
|
||||||
no) spl_ac_debug=no ;;
|
|
||||||
*) AC_MSG_RESULT([Error!])
|
|
||||||
AC_MSG_ERROR([Bad value "$enableval" for --enable-debug]) ;;
|
|
||||||
esac ]
|
|
||||||
)
|
|
||||||
if test "$spl_ac_debug" = yes; then
|
|
||||||
KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG"
|
|
||||||
else
|
|
||||||
KERNELCPPFLAGS="${KERNELCPPFLAGS} -DNDEBUG"
|
|
||||||
AC_DEFINE([NDEBUG], [1],
|
|
||||||
[Define to 1 to disable debug tracing])
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT([${spl_ac_debug=no}])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([SPL_AC_DEBUG_KMEM], [
|
|
||||||
AC_MSG_CHECKING([whether kmem debugging is enabled])
|
|
||||||
AC_ARG_ENABLE( [debug-kmem],
|
|
||||||
AS_HELP_STRING([--enable-debug-kmem],
|
|
||||||
[Enable kmem debug support (default off)]),
|
|
||||||
[ case "$enableval" in
|
|
||||||
yes) spl_ac_debug=yes ;;
|
|
||||||
no) spl_ac_debug=no ;;
|
|
||||||
*) AC_MSG_RESULT([Error!])
|
|
||||||
AC_MSG_ERROR([Bad value "$enableval" for --enable-debug-kmem]) ;;
|
|
||||||
esac ]
|
|
||||||
)
|
|
||||||
if test "$spl_ac_debug" = yes; then
|
|
||||||
KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG_KMEM"
|
|
||||||
AC_DEFINE([DEBUG_KMEM], [1],
|
|
||||||
[Define to 1 to enable kmem debugging])
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT([${spl_ac_debug=no}])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([SPL_AC_DEBUG_MUTEX], [
|
|
||||||
AC_MSG_CHECKING([whether mutex debugging is enabled])
|
|
||||||
AC_ARG_ENABLE( [debug-mutex],
|
|
||||||
AS_HELP_STRING([--enable-debug-mutex],
|
|
||||||
[Enable mutex debug support (default off)]),
|
|
||||||
[ case "$enableval" in
|
|
||||||
yes) spl_ac_debug=yes ;;
|
|
||||||
no) spl_ac_debug=no ;;
|
|
||||||
*) AC_MSG_RESULT([Error!])
|
|
||||||
AC_MSG_ERROR([Bad value "$enableval" for --enable-debug-mutex]) ;;
|
|
||||||
esac ]
|
|
||||||
)
|
|
||||||
if test "$spl_ac_debug" = yes; then
|
|
||||||
KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG_MUTEX"
|
|
||||||
AC_DEFINE([DEBUG_MUTEX], [1],
|
|
||||||
[Define to 1 to enable mutex debugging])
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT([${spl_ac_debug=no}])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([SPL_AC_DEBUG_KSTAT], [
|
|
||||||
AC_MSG_CHECKING([whether kstat debugging is enabled])
|
|
||||||
AC_ARG_ENABLE( [debug-kstat],
|
|
||||||
AS_HELP_STRING([--enable-debug-kstat],
|
|
||||||
[Enable kstat debug support (default off)]),
|
|
||||||
[ case "$enableval" in
|
|
||||||
yes) spl_ac_debug=yes ;;
|
|
||||||
no) spl_ac_debug=no ;;
|
|
||||||
*) AC_MSG_RESULT([Error!])
|
|
||||||
AC_MSG_ERROR([Bad value "$enableval" for --enable-debug-kstat]) ;;
|
|
||||||
esac ]
|
|
||||||
)
|
|
||||||
if test "$spl_ac_debug" = yes; then
|
|
||||||
KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG_KSTAT"
|
|
||||||
AC_DEFINE([DEBUG_KSTAT], [1],
|
|
||||||
[Define to 1 to enable kstat debugging])
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT([${spl_ac_debug=no}])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([SPL_AC_DEBUG_CALLB], [
|
|
||||||
AC_MSG_CHECKING([whether callb debugging is enabled])
|
|
||||||
AC_ARG_ENABLE( [debug-callb],
|
|
||||||
AS_HELP_STRING([--enable-debug-callb],
|
|
||||||
[Enable callb debug support (default off)]),
|
|
||||||
[ case "$enableval" in
|
|
||||||
yes) spl_ac_debug=yes ;;
|
|
||||||
no) spl_ac_debug=no ;;
|
|
||||||
*) AC_MSG_RESULT([Error!])
|
|
||||||
AC_MSG_ERROR([Bad value "$enableval" for --enable-debug-callb]) ;;
|
|
||||||
esac ]
|
|
||||||
)
|
|
||||||
if test "$spl_ac_debug" = yes; then
|
|
||||||
KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG_CALLB"
|
|
||||||
AC_DEFINE([DEBUG_CALLB], [1],
|
|
||||||
[Define to 1 to enable callb debugging])
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT([${spl_ac_debug=no}])
|
|
||||||
])
|
|
||||||
|
|
||||||
SPL_AC_KERNEL
|
SPL_AC_KERNEL
|
||||||
SPL_AC_DEBUG
|
SPL_AC_DEBUG
|
||||||
@ -216,6 +43,19 @@ SPL_AC_DEBUG_KMEM
|
|||||||
SPL_AC_DEBUG_MUTEX
|
SPL_AC_DEBUG_MUTEX
|
||||||
SPL_AC_DEBUG_KSTAT
|
SPL_AC_DEBUG_KSTAT
|
||||||
SPL_AC_DEBUG_CALLB
|
SPL_AC_DEBUG_CALLB
|
||||||
|
SPL_AC_TYPE_UINTPTR_T
|
||||||
|
SPL_AC_TYPE_KMEM_CACHE_T
|
||||||
|
SPL_AC_KMEM_CACHE_DESTROY_INT
|
||||||
|
SPL_AC_ATOMIC_PANIC_NOTIFIER
|
||||||
|
SPL_AC_3ARGS_INIT_WORK
|
||||||
|
SPL_AC_2ARGS_REGISTER_SYSCTL
|
||||||
|
SPL_AC_KMEM_CACHE_T
|
||||||
|
SPL_AC_KMEM_CACHE_CREATE_DTOR
|
||||||
|
SPL_AC_3ARG_KMEM_CACHE_CREATE_CTOR
|
||||||
|
SPL_AC_SET_SHRINKER
|
||||||
|
SPL_AC_PATH_IN_NAMEIDATA
|
||||||
|
SPL_AC_TASK_CURR
|
||||||
|
SPL_AC_CTL_UNNUMBERED
|
||||||
|
|
||||||
TOPDIR=`/bin/pwd`
|
TOPDIR=`/bin/pwd`
|
||||||
|
|
||||||
@ -223,7 +63,7 @@ TOPDIR=`/bin/pwd`
|
|||||||
KERNELMAKE_PARAMS=
|
KERNELMAKE_PARAMS=
|
||||||
KERNELCPPFLAGS="${KERNELCPPFLAGS} -I$TOPDIR -I$TOPDIR/include"
|
KERNELCPPFLAGS="${KERNELCPPFLAGS} -I$TOPDIR -I$TOPDIR/include"
|
||||||
|
|
||||||
if test "$kernelbuild" != "$kernelsrc"; then
|
if test "${LINUX_OBJ}" != "${LINUX}"; then
|
||||||
KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$kernelbuild"
|
KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$kernelbuild"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -41,6 +41,7 @@ extern "C" {
|
|||||||
#include <linux/rwsem.h>
|
#include <linux/rwsem.h>
|
||||||
#include <linux/hash.h>
|
#include <linux/hash.h>
|
||||||
#include <linux/ctype.h>
|
#include <linux/ctype.h>
|
||||||
|
#include <sys/types.h>
|
||||||
#include <sys/debug.h>
|
#include <sys/debug.h>
|
||||||
/*
|
/*
|
||||||
* Memory allocation interfaces
|
* Memory allocation interfaces
|
||||||
@ -316,15 +317,6 @@ kmem_alloc_tryhard(size_t size, size_t *alloc_size, int kmflags)
|
|||||||
#define KMC_REAP_CHUNK 256
|
#define KMC_REAP_CHUNK 256
|
||||||
#define KMC_DEFAULT_SEEKS DEFAULT_SEEKS
|
#define KMC_DEFAULT_SEEKS DEFAULT_SEEKS
|
||||||
|
|
||||||
/* Defined by linux slab.h
|
|
||||||
* typedef struct kmem_cache_s kmem_cache_t;
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* No linux analog
|
|
||||||
* extern int kmem_ready;
|
|
||||||
* extern pgcnt_t kmem_reapahead;
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef DEBUG_KMEM_UNIMPLEMENTED
|
#ifdef DEBUG_KMEM_UNIMPLEMENTED
|
||||||
static __inline__ void kmem_init(void) {
|
static __inline__ void kmem_init(void) {
|
||||||
#error "kmem_init() not implemented"
|
#error "kmem_init() not implemented"
|
||||||
@ -380,6 +372,7 @@ __kmem_cache_create(char *name, size_t size, size_t align,
|
|||||||
|
|
||||||
extern int __kmem_cache_destroy(kmem_cache_t *cache);
|
extern int __kmem_cache_destroy(kmem_cache_t *cache);
|
||||||
extern void *__kmem_cache_alloc(kmem_cache_t *cache, gfp_t flags);
|
extern void *__kmem_cache_alloc(kmem_cache_t *cache, gfp_t flags);
|
||||||
|
extern void __kmem_cache_free(kmem_cache_t *cache, void *obj);
|
||||||
extern void __kmem_reap(void);
|
extern void __kmem_reap(void);
|
||||||
|
|
||||||
int kmem_init(void);
|
int kmem_init(void);
|
||||||
@ -389,7 +382,7 @@ void kmem_fini(void);
|
|||||||
__kmem_cache_create(name,size,align,ctor,dtor,rclm,priv,vmp,flags)
|
__kmem_cache_create(name,size,align,ctor,dtor,rclm,priv,vmp,flags)
|
||||||
#define kmem_cache_destroy(cache) __kmem_cache_destroy(cache)
|
#define kmem_cache_destroy(cache) __kmem_cache_destroy(cache)
|
||||||
#define kmem_cache_alloc(cache, flags) __kmem_cache_alloc(cache, flags)
|
#define kmem_cache_alloc(cache, flags) __kmem_cache_alloc(cache, flags)
|
||||||
#define kmem_cache_free(cache, ptr) kmem_cache_free(cache, ptr)
|
#define kmem_cache_free(cache, obj) __kmem_cache_free(cache, obj)
|
||||||
#define kmem_cache_reap_now(cache) kmem_cache_shrink(cache)
|
#define kmem_cache_reap_now(cache) kmem_cache_shrink(cache)
|
||||||
#define kmem_reap() __kmem_reap()
|
#define kmem_reap() __kmem_reap()
|
||||||
|
|
||||||
|
@ -39,6 +39,15 @@
|
|||||||
#include <sys/kstat.h>
|
#include <sys/kstat.h>
|
||||||
#include <sys/debug.h>
|
#include <sys/debug.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYSCTL
|
||||||
|
#ifdef HAVE_2ARGS_REGISTER_SYSCTL
|
||||||
|
#define spl_register_sysctl_table(t, a) register_sysctl_table(t, a)
|
||||||
|
#else
|
||||||
|
#define spl_register_sysctl_table(t, a) register_sysctl_table(t)
|
||||||
|
#endif /* HAVE_2ARGS_REGISTER_SYSCTL */
|
||||||
|
#define spl_unregister_sysctl_table(t) unregister_sysctl_table(t)
|
||||||
|
#endif /* CONFIG_SYSCTL */
|
||||||
|
|
||||||
#ifdef DEBUG_KSTAT
|
#ifdef DEBUG_KSTAT
|
||||||
extern struct proc_dir_entry *proc_sys_spl_kstat;
|
extern struct proc_dir_entry *proc_sys_spl_kstat;
|
||||||
struct proc_dir_entry *proc_dir_entry_find(struct proc_dir_entry *root,
|
struct proc_dir_entry *proc_dir_entry_find(struct proc_dir_entry *root,
|
||||||
|
@ -197,6 +197,18 @@ extern int ddi_strtoul(const char *str, char **nptr,
|
|||||||
#define offsetof(s, m) ((size_t)(&(((s *)0)->m)))
|
#define offsetof(s, m) ((size_t)(&(((s *)0)->m)))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_3ARGS_INIT_WORK
|
||||||
|
|
||||||
|
#define spl_init_work(wq,cb,d) INIT_WORK((wq), (void *)(cb), (void *)(d))
|
||||||
|
#define spl_get_work_data(type,field,data) (data)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define spl_init_work(wq,cb,d) INIT_WORK((wq), (void *)(cb));
|
||||||
|
#define spl_get_work_data(type,field,data) container_of(data,type,field)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -7,9 +7,17 @@ extern "C" {
|
|||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <sys/sysmacros.h>
|
#include <sys/sysmacros.h>
|
||||||
|
#include "spl_config.h"
|
||||||
|
|
||||||
|
#ifndef HAVE_UINTPTR_T
|
||||||
|
typedef unsigned long uintptr_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_KMEM_CACHE_T
|
||||||
|
typedef struct kmem_cache kmem_cache_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef enum { B_FALSE=0, B_TRUE=1 } boolean_t;
|
typedef enum { B_FALSE=0, B_TRUE=1 } boolean_t;
|
||||||
typedef unsigned long uintptr_t;
|
|
||||||
typedef unsigned long intptr_t;
|
typedef unsigned long intptr_t;
|
||||||
typedef unsigned long ulong_t;
|
typedef unsigned long ulong_t;
|
||||||
typedef unsigned int uint_t;
|
typedef unsigned int uint_t;
|
||||||
|
@ -40,6 +40,7 @@ extern "C" {
|
|||||||
#include <linux/namei.h>
|
#include <linux/namei.h>
|
||||||
#include <linux/file.h>
|
#include <linux/file.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
|
#include <linux/mount.h>
|
||||||
#include <sys/kmem.h>
|
#include <sys/kmem.h>
|
||||||
#include <sys/mutex.h>
|
#include <sys/mutex.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@ -92,6 +93,14 @@ extern "C" {
|
|||||||
#define B_INVAL 0x01
|
#define B_INVAL 0x01
|
||||||
#define B_TRUNC 0x02
|
#define B_TRUNC 0x02
|
||||||
|
|
||||||
|
#ifdef HAVE_PATH_IN_NAMEIDATA
|
||||||
|
# define nd_dentry path.dentry
|
||||||
|
# define nd_mnt path.mnt
|
||||||
|
#else
|
||||||
|
# define nd_dentry dentry
|
||||||
|
# define nd_mnt mnt
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef enum vtype {
|
typedef enum vtype {
|
||||||
VNON = 0,
|
VNON = 0,
|
||||||
VREG = 1,
|
VREG = 1,
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
# include "config.h"
|
# include "spl_config.h"
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#ifdef WITH_PTHREADS
|
#ifdef WITH_PTHREADS
|
||||||
|
@ -2,9 +2,9 @@ subdir-m += spl
|
|||||||
subdir-m += splat
|
subdir-m += splat
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(MAKE) -C @kernelsrc@ SUBDIRS=`pwd` @KERNELMAKE_PARAMS@ modules
|
$(MAKE) -C @LINUX@ SUBDIRS=`pwd` @KERNELMAKE_PARAMS@ modules
|
||||||
|
|
||||||
install uninstall clean distclean maintainer-clean distdir:
|
install uninstall clean distclean maintainer-clean distdir:
|
||||||
$(MAKE) -C @kernelsrc@ SUBDIRS=`pwd` @KERNELMAKE_PARAMS@ $@
|
$(MAKE) -C @LINUX@ SUBDIRS=`pwd` @KERNELMAKE_PARAMS@ $@
|
||||||
|
|
||||||
check:
|
check:
|
||||||
|
@ -4,7 +4,7 @@ MODULES := spl
|
|||||||
DISTFILES = Makefile.in \
|
DISTFILES = Makefile.in \
|
||||||
spl-kmem.c spl-rwlock.c spl-taskq.c \
|
spl-kmem.c spl-rwlock.c spl-taskq.c \
|
||||||
spl-thread.c spl-generic.c
|
spl-thread.c spl-generic.c
|
||||||
CPPFLAGS += @KERNELCPPFLAGS@
|
EXTRA_CFLAGS = @KERNELCPPFLAGS@
|
||||||
|
|
||||||
# Solaris porting layer module
|
# Solaris porting layer module
|
||||||
obj-m := spl.o
|
obj-m := spl.o
|
||||||
|
@ -44,7 +44,6 @@
|
|||||||
#include <sys/proc.h>
|
#include <sys/proc.h>
|
||||||
#include <sys/debug.h>
|
#include <sys/debug.h>
|
||||||
#include <spl-ctl.h>
|
#include <spl-ctl.h>
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#ifdef DEBUG_SUBSYSTEM
|
#ifdef DEBUG_SUBSYSTEM
|
||||||
#undef DEBUG_SUBSYSTEM
|
#undef DEBUG_SUBSYSTEM
|
||||||
@ -1118,7 +1117,7 @@ void spl_debug_dumpstack(struct task_struct *tsk)
|
|||||||
tsk = current;
|
tsk = current;
|
||||||
|
|
||||||
printk(KERN_ERR "SPL: Showing stack for process %d\n", tsk->pid);
|
printk(KERN_ERR "SPL: Showing stack for process %d\n", tsk->pid);
|
||||||
show_task(tsk);
|
dump_stack();
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(spl_debug_dumpstack);
|
EXPORT_SYMBOL(spl_debug_dumpstack);
|
||||||
|
|
||||||
@ -1255,8 +1254,13 @@ debug_init(void)
|
|||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
#ifdef HAVE_ATOMIC_PANIC_NOTIFIER
|
||||||
atomic_notifier_chain_register(&panic_notifier_list,
|
atomic_notifier_chain_register(&panic_notifier_list,
|
||||||
&spl_panic_notifier);
|
&spl_panic_notifier);
|
||||||
|
#else
|
||||||
|
notifier_chain_register(&panic_notifier_list,
|
||||||
|
&spl_panic_notifier);
|
||||||
|
#endif
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1306,8 +1310,14 @@ trace_fini(void)
|
|||||||
void
|
void
|
||||||
debug_fini(void)
|
debug_fini(void)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_ATOMIC_PANIC_NOTIFIER
|
||||||
atomic_notifier_chain_unregister(&panic_notifier_list,
|
atomic_notifier_chain_unregister(&panic_notifier_list,
|
||||||
&spl_panic_notifier);
|
&spl_panic_notifier);
|
||||||
|
#else
|
||||||
|
notifier_chain_unregister(&panic_notifier_list,
|
||||||
|
&spl_panic_notifier);
|
||||||
|
#endif
|
||||||
|
|
||||||
trace_fini();
|
trace_fini();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#include <sys/sysmacros.h>
|
#include <sys/sysmacros.h>
|
||||||
#include <sys/cmn_err.h>
|
#include <sys/cmn_err.h>
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#ifdef DEBUG_SUBSYSTEM
|
#ifdef DEBUG_SUBSYSTEM
|
||||||
#undef DEBUG_SUBSYSTEM
|
#undef DEBUG_SUBSYSTEM
|
||||||
|
@ -33,7 +33,6 @@
|
|||||||
#include <sys/proc.h>
|
#include <sys/proc.h>
|
||||||
#include <sys/kstat.h>
|
#include <sys/kstat.h>
|
||||||
#include <linux/kmod.h>
|
#include <linux/kmod.h>
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#ifdef DEBUG_SUBSYSTEM
|
#ifdef DEBUG_SUBSYSTEM
|
||||||
#undef DEBUG_SUBSYSTEM
|
#undef DEBUG_SUBSYSTEM
|
||||||
@ -101,7 +100,7 @@ set_hostid(void)
|
|||||||
char sh_path[] = "/bin/sh";
|
char sh_path[] = "/bin/sh";
|
||||||
char *argv[] = { sh_path,
|
char *argv[] = { sh_path,
|
||||||
"-c",
|
"-c",
|
||||||
"/usr/bin/hostid >/proc/sys/spl/hostid",
|
"/usr/bin/hostid >/proc/sys/kernel/spl/hostid",
|
||||||
NULL };
|
NULL };
|
||||||
char *envp[] = { "HOME=/",
|
char *envp[] = { "HOME=/",
|
||||||
"TERM=linux",
|
"TERM=linux",
|
||||||
|
@ -104,7 +104,15 @@ typedef struct kmem_cache_cb {
|
|||||||
|
|
||||||
static struct rw_semaphore kmem_cache_cb_sem;
|
static struct rw_semaphore kmem_cache_cb_sem;
|
||||||
static struct list_head kmem_cache_cb_list;
|
static struct list_head kmem_cache_cb_list;
|
||||||
|
#ifdef HAVE_SET_SHRINKER
|
||||||
static struct shrinker *kmem_cache_shrinker;
|
static struct shrinker *kmem_cache_shrinker;
|
||||||
|
#else
|
||||||
|
static int kmem_cache_generic_shrinker(int nr_to_scan, unsigned int gfp_mask);
|
||||||
|
static struct shrinker kmem_cache_shrinker = {
|
||||||
|
.shrink = kmem_cache_generic_shrinker,
|
||||||
|
.seeks = KMC_DEFAULT_SEEKS,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Function must be called while holding the kmem_cache_cb_sem
|
/* Function must be called while holding the kmem_cache_cb_sem
|
||||||
* Because kmem_cache_t is an opaque datatype we're forced to
|
* Because kmem_cache_t is an opaque datatype we're forced to
|
||||||
@ -166,19 +174,21 @@ kmem_cache_remove_cache_cb(kmem_cache_cb_t *kcc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_3ARG_KMEM_CACHE_CREATE_CTOR
|
||||||
static void
|
static void
|
||||||
kmem_cache_generic_constructor(void *ptr, kmem_cache_t *cache, unsigned long flags)
|
kmem_cache_generic_constructor(void *ptr, kmem_cache_t *cache,
|
||||||
|
unsigned long flags)
|
||||||
{
|
{
|
||||||
kmem_cache_cb_t *kcc;
|
kmem_cache_cb_t *kcc;
|
||||||
kmem_constructor_t constructor;
|
kmem_constructor_t constructor;
|
||||||
void *private;
|
void *private;
|
||||||
|
|
||||||
ASSERT(flags & SLAB_CTOR_CONSTRUCTOR);
|
|
||||||
|
|
||||||
/* Ensure constructor verifies are not passed to the registered
|
/* Ensure constructor verifies are not passed to the registered
|
||||||
* constructors. This may not be safe due to the Solaris constructor
|
* constructors. This may not be safe due to the Solaris constructor
|
||||||
* not being aware of how to handle the SLAB_CTOR_VERIFY flag
|
* not being aware of how to handle the SLAB_CTOR_VERIFY flag
|
||||||
*/
|
*/
|
||||||
|
ASSERT(flags & SLAB_CTOR_CONSTRUCTOR);
|
||||||
|
|
||||||
if (flags & SLAB_CTOR_VERIFY)
|
if (flags & SLAB_CTOR_VERIFY)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -186,7 +196,15 @@ kmem_cache_generic_constructor(void *ptr, kmem_cache_t *cache, unsigned long fla
|
|||||||
flags = KM_NOSLEEP;
|
flags = KM_NOSLEEP;
|
||||||
else
|
else
|
||||||
flags = KM_SLEEP;
|
flags = KM_SLEEP;
|
||||||
|
#else
|
||||||
|
static void
|
||||||
|
kmem_cache_generic_constructor(kmem_cache_t *cache, void *ptr)
|
||||||
|
{
|
||||||
|
kmem_cache_cb_t *kcc;
|
||||||
|
kmem_constructor_t constructor;
|
||||||
|
void *private;
|
||||||
|
int flags = KM_NOSLEEP;
|
||||||
|
#endif
|
||||||
/* We can be called with interrupts disabled so it is critical that
|
/* We can be called with interrupts disabled so it is critical that
|
||||||
* this function and the registered constructor never sleep.
|
* this function and the registered constructor never sleep.
|
||||||
*/
|
*/
|
||||||
@ -244,7 +262,7 @@ kmem_cache_generic_destructor(void *ptr, kmem_cache_t *cache, unsigned long flag
|
|||||||
atomic_dec(&kcc->kcc_ref);
|
atomic_dec(&kcc->kcc_ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX - Arguments are ignored */
|
/* Arguments are ignored */
|
||||||
static int
|
static int
|
||||||
kmem_cache_generic_shrinker(int nr_to_scan, unsigned int gfp_mask)
|
kmem_cache_generic_shrinker(int nr_to_scan, unsigned int gfp_mask)
|
||||||
{
|
{
|
||||||
@ -306,6 +324,7 @@ kmem_cache_generic_shrinker(int nr_to_scan, unsigned int gfp_mask)
|
|||||||
#undef kmem_cache_create
|
#undef kmem_cache_create
|
||||||
#undef kmem_cache_destroy
|
#undef kmem_cache_destroy
|
||||||
#undef kmem_cache_alloc
|
#undef kmem_cache_alloc
|
||||||
|
#undef kmem_cache_free
|
||||||
|
|
||||||
kmem_cache_t *
|
kmem_cache_t *
|
||||||
__kmem_cache_create(char *name, size_t size, size_t align,
|
__kmem_cache_create(char *name, size_t size, size_t align,
|
||||||
@ -329,23 +348,32 @@ __kmem_cache_create(char *name, size_t size, size_t align,
|
|||||||
RETURN(NULL);
|
RETURN(NULL);
|
||||||
|
|
||||||
strcpy(cache_name, name);
|
strcpy(cache_name, name);
|
||||||
|
|
||||||
|
#ifdef HAVE_KMEM_CACHE_CREATE_DTOR
|
||||||
cache = kmem_cache_create(cache_name, size, align, flags,
|
cache = kmem_cache_create(cache_name, size, align, flags,
|
||||||
kmem_cache_generic_constructor,
|
kmem_cache_generic_constructor,
|
||||||
kmem_cache_generic_destructor);
|
kmem_cache_generic_destructor);
|
||||||
|
#else
|
||||||
|
cache = kmem_cache_create(cache_name, size, align, flags, NULL);
|
||||||
|
#endif
|
||||||
if (cache == NULL)
|
if (cache == NULL)
|
||||||
RETURN(NULL);
|
RETURN(NULL);
|
||||||
|
|
||||||
/* Register shared shrinker function on initial cache create */
|
/* Register shared shrinker function on initial cache create */
|
||||||
down_read(&kmem_cache_cb_sem);
|
down_read(&kmem_cache_cb_sem);
|
||||||
if (list_empty(&kmem_cache_cb_list)) {
|
if (list_empty(&kmem_cache_cb_list)) {
|
||||||
kmem_cache_shrinker = set_shrinker(KMC_DEFAULT_SEEKS,
|
#ifdef HAVE_SET_SHRINKER
|
||||||
kmem_cache_generic_shrinker);
|
kmem_cache_shrinker =
|
||||||
|
set_shrinker(KMC_DEFAULT_SEEKS,
|
||||||
|
kmem_cache_generic_shrinker);
|
||||||
if (kmem_cache_shrinker == NULL) {
|
if (kmem_cache_shrinker == NULL) {
|
||||||
kmem_cache_destroy(cache);
|
kmem_cache_destroy(cache);
|
||||||
up_read(&kmem_cache_cb_sem);
|
up_read(&kmem_cache_cb_sem);
|
||||||
RETURN(NULL);
|
RETURN(NULL);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
register_shrinker(&kmem_cache_shrinker);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
up_read(&kmem_cache_cb_sem);
|
up_read(&kmem_cache_cb_sem);
|
||||||
|
|
||||||
@ -353,7 +381,11 @@ __kmem_cache_create(char *name, size_t size, size_t align,
|
|||||||
reclaim, priv, vmp);
|
reclaim, priv, vmp);
|
||||||
if (kcc == NULL) {
|
if (kcc == NULL) {
|
||||||
if (shrinker_flag) /* New shrinker registered must be removed */
|
if (shrinker_flag) /* New shrinker registered must be removed */
|
||||||
|
#ifdef HAVE_SET_SHRINKER
|
||||||
remove_shrinker(kmem_cache_shrinker);
|
remove_shrinker(kmem_cache_shrinker);
|
||||||
|
#else
|
||||||
|
unregister_shrinker(&kmem_cache_shrinker);
|
||||||
|
#endif
|
||||||
|
|
||||||
kmem_cache_destroy(cache);
|
kmem_cache_destroy(cache);
|
||||||
RETURN(NULL);
|
RETURN(NULL);
|
||||||
@ -383,7 +415,13 @@ __kmem_cache_destroy(kmem_cache_t *cache)
|
|||||||
up_read(&kmem_cache_cb_sem);
|
up_read(&kmem_cache_cb_sem);
|
||||||
|
|
||||||
name = (char *)kmem_cache_name(cache);
|
name = (char *)kmem_cache_name(cache);
|
||||||
|
|
||||||
|
#ifdef HAVE_KMEM_CACHE_DESTROY_INT
|
||||||
rc = kmem_cache_destroy(cache);
|
rc = kmem_cache_destroy(cache);
|
||||||
|
#else
|
||||||
|
kmem_cache_destroy(cache);
|
||||||
|
rc = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
atomic_dec(&kcc->kcc_ref);
|
atomic_dec(&kcc->kcc_ref);
|
||||||
kmem_cache_remove_cache_cb(kcc);
|
kmem_cache_remove_cache_cb(kcc);
|
||||||
@ -392,7 +430,11 @@ __kmem_cache_destroy(kmem_cache_t *cache)
|
|||||||
/* Unregister generic shrinker on removal of all caches */
|
/* Unregister generic shrinker on removal of all caches */
|
||||||
down_read(&kmem_cache_cb_sem);
|
down_read(&kmem_cache_cb_sem);
|
||||||
if (list_empty(&kmem_cache_cb_list))
|
if (list_empty(&kmem_cache_cb_list))
|
||||||
remove_shrinker(kmem_cache_shrinker);
|
#ifdef HAVE_SET_SHRINKER
|
||||||
|
remove_shrinker(kmem_cache_shrinker);
|
||||||
|
#else
|
||||||
|
unregister_shrinker(&kmem_cache_shrinker);
|
||||||
|
#endif
|
||||||
|
|
||||||
up_read(&kmem_cache_cb_sem);
|
up_read(&kmem_cache_cb_sem);
|
||||||
RETURN(rc);
|
RETURN(rc);
|
||||||
@ -409,22 +451,45 @@ EXPORT_SYMBOL(__kmem_cache_destroy);
|
|||||||
void *
|
void *
|
||||||
__kmem_cache_alloc(kmem_cache_t *cache, gfp_t flags)
|
__kmem_cache_alloc(kmem_cache_t *cache, gfp_t flags)
|
||||||
{
|
{
|
||||||
void *rc;
|
void *obj;
|
||||||
ENTRY;
|
ENTRY;
|
||||||
|
|
||||||
restart:
|
restart:
|
||||||
rc = kmem_cache_alloc(cache, flags);
|
obj = kmem_cache_alloc(cache, flags);
|
||||||
if ((rc == NULL) && (flags & KM_SLEEP)) {
|
if ((obj == NULL) && (flags & KM_SLEEP)) {
|
||||||
#ifdef DEBUG_KMEM
|
#ifdef DEBUG_KMEM
|
||||||
atomic64_inc(&kmem_cache_alloc_failed);
|
atomic64_inc(&kmem_cache_alloc_failed);
|
||||||
#endif /* DEBUG_KMEM */
|
#endif /* DEBUG_KMEM */
|
||||||
GOTO(restart, rc);
|
GOTO(restart, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
RETURN(rc);
|
/* When destructor support is removed we must be careful not to
|
||||||
|
* use the provided constructor which will end up being called
|
||||||
|
* more often than the destructor which we only call on free. Thus
|
||||||
|
* we many call the proper constructor when there is no destructor.
|
||||||
|
*/
|
||||||
|
#ifndef HAVE_KMEM_CACHE_CREATE_DTOR
|
||||||
|
#ifdef HAVE_3ARG_KMEM_CACHE_CREATE_CTOR
|
||||||
|
kmem_cache_generic_constructor(obj, cache, flags);
|
||||||
|
#else
|
||||||
|
kmem_cache_generic_constructor(cache, obj);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
RETURN(obj);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__kmem_cache_alloc);
|
EXPORT_SYMBOL(__kmem_cache_alloc);
|
||||||
|
|
||||||
|
void
|
||||||
|
__kmem_cache_free(kmem_cache_t *cache, void *obj)
|
||||||
|
{
|
||||||
|
#ifndef HAVE_KMEM_CACHE_CREATE_DTOR
|
||||||
|
kmem_cache_generic_destructor(obj, cache, 0);
|
||||||
|
#endif
|
||||||
|
kmem_cache_free(cache, obj);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(__kmem_cache_free);
|
||||||
|
|
||||||
void
|
void
|
||||||
__kmem_reap(void)
|
__kmem_reap(void)
|
||||||
{
|
{
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/kobj.h>
|
#include <sys/kobj.h>
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#ifdef DEBUG_SUBSYSTEM
|
#ifdef DEBUG_SUBSYSTEM
|
||||||
#undef DEBUG_SUBSYSTEM
|
#undef DEBUG_SUBSYSTEM
|
||||||
|
@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#include <sys/sysmacros.h>
|
#include <sys/sysmacros.h>
|
||||||
#include <sys/sunddi.h>
|
#include <sys/sunddi.h>
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#ifdef DEBUG_SUBSYSTEM
|
#ifdef DEBUG_SUBSYSTEM
|
||||||
#undef DEBUG_SUBSYSTEM
|
#undef DEBUG_SUBSYSTEM
|
||||||
|
@ -171,6 +171,11 @@ __mutex_tryenter(kmutex_t *mp)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__mutex_tryenter);
|
EXPORT_SYMBOL(__mutex_tryenter);
|
||||||
|
|
||||||
|
#ifndef HAVE_TASK_CURR
|
||||||
|
#define task_curr(owner) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mutex_enter_adaptive(kmutex_t *mp)
|
mutex_enter_adaptive(kmutex_t *mp)
|
||||||
{
|
{
|
||||||
|
@ -39,8 +39,10 @@ static unsigned long table_max = ~0;
|
|||||||
|
|
||||||
#ifdef CONFIG_SYSCTL
|
#ifdef CONFIG_SYSCTL
|
||||||
static struct ctl_table_header *spl_header = NULL;
|
static struct ctl_table_header *spl_header = NULL;
|
||||||
|
#if defined(DEBUG_MUTEX) || defined(DEBUG_KMEM) || defined(DEBUG_KSTAT)
|
||||||
static struct proc_dir_entry *proc_sys = NULL;
|
static struct proc_dir_entry *proc_sys = NULL;
|
||||||
static struct proc_dir_entry *proc_sys_spl = NULL;
|
static struct proc_dir_entry *proc_sys_spl = NULL;
|
||||||
|
#endif
|
||||||
#ifdef DEBUG_MUTEX
|
#ifdef DEBUG_MUTEX
|
||||||
static struct proc_dir_entry *proc_sys_spl_mutex = NULL;
|
static struct proc_dir_entry *proc_sys_spl_mutex = NULL;
|
||||||
static struct proc_dir_entry *proc_sys_spl_mutex_stats = NULL;
|
static struct proc_dir_entry *proc_sys_spl_mutex_stats = NULL;
|
||||||
@ -53,6 +55,49 @@ struct proc_dir_entry *proc_sys_spl_kstat = NULL;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_CTL_UNNUMBERED
|
||||||
|
|
||||||
|
#define CTL_SPL CTL_UNNUMBERED
|
||||||
|
#define CTL_SPL_DEBUG CTL_UNNUMBERED
|
||||||
|
#define CTL_SPL_MUTEX CTL_UNNUMBERED
|
||||||
|
#define CTL_SPL_KMEM CTL_UNNUMBERED
|
||||||
|
#define CTL_SPL_KSTAT CTL_UNNUMBERED
|
||||||
|
|
||||||
|
#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_DEBUG_SUBSYS CTL_UNNUMBERED /* Debug subsystem */
|
||||||
|
#define CTL_DEBUG_MASK CTL_UNNUMBERED /* Debug mask */
|
||||||
|
#define CTL_DEBUG_PRINTK CTL_UNNUMBERED /* All messages to console */
|
||||||
|
#define CTL_DEBUG_MB CTL_UNNUMBERED /* Debug buffer size */
|
||||||
|
#define CTL_DEBUG_BINARY CTL_UNNUMBERED /* Binary data in buffer */
|
||||||
|
#define CTL_DEBUG_CATASTROPHE CTL_UNNUMBERED /* Set if BUG'd or panic'd */
|
||||||
|
#define CTL_DEBUG_PANIC_ON_BUG CTL_UNNUMBERED /* Should panic on BUG */
|
||||||
|
#define CTL_DEBUG_PATH CTL_UNNUMBERED /* Dump log location */
|
||||||
|
#define CTL_DEBUG_DUMP CTL_UNNUMBERED /* Dump debug buffer to file */
|
||||||
|
#define CTL_DEBUG_FORCE_BUG CTL_UNNUMBERED /* Hook to force a BUG */
|
||||||
|
#define CTL_DEBUG_STACK_SIZE CTL_UNNUMBERED /* Max observed stack size */
|
||||||
|
|
||||||
|
#define CTL_CONSOLE_RATELIMIT CTL_UNNUMBERED /* Ratelimit console messages */
|
||||||
|
#define CTL_CONSOLE_MAX_DELAY_CS CTL_UNNUMBERED /* Max delay skip messages */
|
||||||
|
#define CTL_CONSOLE_MIN_DELAY_CS CTL_UNNUMBERED /* Init delay skip messages */
|
||||||
|
#define CTL_CONSOLE_BACKOFF CTL_UNNUMBERED /* Delay increase factor */
|
||||||
|
|
||||||
|
#ifdef DEBUG_KMEM
|
||||||
|
#define CTL_KMEM_KMEMUSED CTL_UNNUMBERED /* Alloc'd kmem bytes */
|
||||||
|
#define CTL_KMEM_KMEMMAX CTL_UNNUMBERED /* Max alloc'd by kmem bytes */
|
||||||
|
#define CTL_KMEM_VMEMUSED CTL_UNNUMBERED /* Alloc'd vmem bytes */
|
||||||
|
#define CTL_KMEM_VMEMMAX CTL_UNNUMBERED /* Max alloc'd by vmem bytes */
|
||||||
|
#define CTL_KMEM_ALLOC_FAILED CTL_UNNUMBERED /* Cache allocations failed */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CTL_MUTEX_STATS CTL_UNNUMBERED /* Global mutex statistics */
|
||||||
|
#define CTL_MUTEX_STATS_PER CTL_UNNUMBERED /* Per mutex statistics */
|
||||||
|
#define CTL_MUTEX_SPIN_MAX CTL_UNNUMBERED /* Max mutex spin iterations */
|
||||||
|
|
||||||
|
#else /* HAVE_CTL_UNNUMBERED */
|
||||||
|
|
||||||
#define CTL_SPL 0x87
|
#define CTL_SPL 0x87
|
||||||
#define CTL_SPL_DEBUG 0x88
|
#define CTL_SPL_DEBUG 0x88
|
||||||
#define CTL_SPL_MUTEX 0x89
|
#define CTL_SPL_MUTEX 0x89
|
||||||
@ -82,9 +127,9 @@ enum {
|
|||||||
CTL_CONSOLE_BACKOFF, /* Delay increase factor */
|
CTL_CONSOLE_BACKOFF, /* Delay increase factor */
|
||||||
|
|
||||||
#ifdef DEBUG_KMEM
|
#ifdef DEBUG_KMEM
|
||||||
CTL_KMEM_KMEMUSED, /* Crrently alloc'd kmem bytes */
|
CTL_KMEM_KMEMUSED, /* Alloc'd kmem bytes */
|
||||||
CTL_KMEM_KMEMMAX, /* Max alloc'd by kmem bytes */
|
CTL_KMEM_KMEMMAX, /* Max alloc'd by kmem bytes */
|
||||||
CTL_KMEM_VMEMUSED, /* Currently alloc'd vmem bytes */
|
CTL_KMEM_VMEMUSED, /* Alloc'd vmem bytes */
|
||||||
CTL_KMEM_VMEMMAX, /* Max alloc'd by vmem bytes */
|
CTL_KMEM_VMEMMAX, /* Max alloc'd by vmem bytes */
|
||||||
CTL_KMEM_ALLOC_FAILED, /* Cache allocation failed */
|
CTL_KMEM_ALLOC_FAILED, /* Cache allocation failed */
|
||||||
#endif
|
#endif
|
||||||
@ -93,6 +138,7 @@ enum {
|
|||||||
CTL_MUTEX_STATS_PER, /* Per mutex statistics */
|
CTL_MUTEX_STATS_PER, /* Per mutex statistics */
|
||||||
CTL_MUTEX_SPIN_MAX, /* Maximum mutex spin iterations */
|
CTL_MUTEX_SPIN_MAX, /* Maximum mutex spin iterations */
|
||||||
};
|
};
|
||||||
|
#endif /* HAVE_CTL_UNNUMBERED */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
proc_copyin_string(char *kbuffer, int kbuffer_size,
|
proc_copyin_string(char *kbuffer, int kbuffer_size,
|
||||||
@ -775,7 +821,17 @@ static struct ctl_table spl_dir[] = {
|
|||||||
.mode = 0555,
|
.mode = 0555,
|
||||||
.child = spl_table,
|
.child = spl_table,
|
||||||
},
|
},
|
||||||
{0}
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct ctl_table spl_root[] = {
|
||||||
|
{
|
||||||
|
.ctl_name = CTL_KERN,
|
||||||
|
.procname = "kernel",
|
||||||
|
.mode = 0555,
|
||||||
|
.child = spl_dir,
|
||||||
|
},
|
||||||
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -818,10 +874,11 @@ proc_init(void)
|
|||||||
ENTRY;
|
ENTRY;
|
||||||
|
|
||||||
#ifdef CONFIG_SYSCTL
|
#ifdef CONFIG_SYSCTL
|
||||||
spl_header = register_sysctl_table(spl_dir, 0);
|
spl_header = spl_register_sysctl_table(spl_root, 0);
|
||||||
if (spl_header == NULL)
|
if (spl_header == NULL)
|
||||||
RETURN(-EUNATCH);
|
RETURN(-EUNATCH);
|
||||||
|
|
||||||
|
#if defined(DEBUG_MUTEX) || defined(DEBUG_KMEM) || defined(DEBUG_KSTAT)
|
||||||
proc_sys = proc_dir_entry_find(&proc_root, "sys");
|
proc_sys = proc_dir_entry_find(&proc_root, "sys");
|
||||||
if (proc_sys == NULL)
|
if (proc_sys == NULL)
|
||||||
GOTO(out, rc = -EUNATCH);
|
GOTO(out, rc = -EUNATCH);
|
||||||
@ -829,6 +886,7 @@ proc_init(void)
|
|||||||
proc_sys_spl = proc_dir_entry_find(proc_sys, "spl");
|
proc_sys_spl = proc_dir_entry_find(proc_sys, "spl");
|
||||||
if (proc_sys_spl == NULL)
|
if (proc_sys_spl == NULL)
|
||||||
GOTO(out, rc = -EUNATCH);
|
GOTO(out, rc = -EUNATCH);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG_MUTEX
|
#ifdef DEBUG_MUTEX
|
||||||
proc_sys_spl_mutex = proc_dir_entry_find(proc_sys_spl, "mutex");
|
proc_sys_spl_mutex = proc_dir_entry_find(proc_sys_spl, "mutex");
|
||||||
@ -862,8 +920,10 @@ out2:
|
|||||||
#ifdef DEBUG_MUTEX
|
#ifdef DEBUG_MUTEX
|
||||||
remove_proc_entry("stats_per", proc_sys_spl_mutex);
|
remove_proc_entry("stats_per", proc_sys_spl_mutex);
|
||||||
#endif /* DEBUG_MUTEX */
|
#endif /* DEBUG_MUTEX */
|
||||||
|
#if defined(DEBUG_MUTEX) || defined(DEBUG_KMEM) || defined(DEBUG_KSTAT)
|
||||||
out:
|
out:
|
||||||
unregister_sysctl_table(spl_header);
|
#endif
|
||||||
|
spl_unregister_sysctl_table(spl_header);
|
||||||
#endif /* CONFIG_SYSCTL */
|
#endif /* CONFIG_SYSCTL */
|
||||||
RETURN(rc);
|
RETURN(rc);
|
||||||
}
|
}
|
||||||
@ -878,7 +938,7 @@ proc_fini(void)
|
|||||||
#ifdef DEBUG_MUTEX
|
#ifdef DEBUG_MUTEX
|
||||||
remove_proc_entry("stats_per", proc_sys_spl_mutex);
|
remove_proc_entry("stats_per", proc_sys_spl_mutex);
|
||||||
#endif /* DEBUG_MUTEX */
|
#endif /* DEBUG_MUTEX */
|
||||||
unregister_sysctl_table(spl_header);
|
spl_unregister_sysctl_table(spl_header);
|
||||||
#endif
|
#endif
|
||||||
EXIT;
|
EXIT;
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#include <sys/sysmacros.h>
|
#include <sys/sysmacros.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#ifdef DEBUG_SUBSYSTEM
|
#ifdef DEBUG_SUBSYSTEM
|
||||||
#undef DEBUG_SUBSYSTEM
|
#undef DEBUG_SUBSYSTEM
|
||||||
|
@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#include <sys/sysmacros.h>
|
#include <sys/sysmacros.h>
|
||||||
#include <sys/vnode.h>
|
#include <sys/vnode.h>
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG_SUBSYSTEM
|
#ifdef DEBUG_SUBSYSTEM
|
||||||
@ -105,7 +104,7 @@ vn_open(const char *path, uio_seg_t seg, int flags, int mode,
|
|||||||
{
|
{
|
||||||
struct file *fp;
|
struct file *fp;
|
||||||
struct kstat stat;
|
struct kstat stat;
|
||||||
int rc, saved_umask;
|
int rc, saved_umask = 0;
|
||||||
vnode_t *vp;
|
vnode_t *vp;
|
||||||
ENTRY;
|
ENTRY;
|
||||||
|
|
||||||
@ -243,11 +242,17 @@ vn_close(vnode_t *vp, int flags, int x1, int x2, void *x3, void *x4)
|
|||||||
} /* vn_close() */
|
} /* vn_close() */
|
||||||
EXPORT_SYMBOL(vn_close);
|
EXPORT_SYMBOL(vn_close);
|
||||||
|
|
||||||
static struct dentry *lookup_hash(struct nameidata *nd)
|
static struct dentry *vn_lookup_hash(struct nameidata *nd)
|
||||||
{
|
{
|
||||||
return __lookup_hash(&nd->last, nd->dentry, nd);
|
return lookup_one_len(nd->last.name, nd->nd_dentry, nd->last.len);
|
||||||
} /* lookup_hash() */
|
} /* lookup_hash() */
|
||||||
|
|
||||||
|
static void vn_path_release(struct nameidata *nd)
|
||||||
|
{
|
||||||
|
dput(nd->nd_dentry);
|
||||||
|
mntput(nd->nd_mnt);
|
||||||
|
}
|
||||||
|
|
||||||
/* Modified do_unlinkat() from linux/fs/namei.c, only uses exported symbols */
|
/* Modified do_unlinkat() from linux/fs/namei.c, only uses exported symbols */
|
||||||
int
|
int
|
||||||
vn_remove(const char *path, uio_seg_t seg, int flags)
|
vn_remove(const char *path, uio_seg_t seg, int flags)
|
||||||
@ -269,8 +274,8 @@ vn_remove(const char *path, uio_seg_t seg, int flags)
|
|||||||
if (nd.last_type != LAST_NORM)
|
if (nd.last_type != LAST_NORM)
|
||||||
GOTO(exit1, rc);
|
GOTO(exit1, rc);
|
||||||
|
|
||||||
mutex_lock_nested(&nd.dentry->d_inode->i_mutex, I_MUTEX_PARENT);
|
mutex_lock_nested(&nd.nd_dentry->d_inode->i_mutex, I_MUTEX_PARENT);
|
||||||
dentry = lookup_hash(&nd);
|
dentry = vn_lookup_hash(&nd);
|
||||||
rc = PTR_ERR(dentry);
|
rc = PTR_ERR(dentry);
|
||||||
if (!IS_ERR(dentry)) {
|
if (!IS_ERR(dentry)) {
|
||||||
/* Why not before? Because we want correct rc value */
|
/* Why not before? Because we want correct rc value */
|
||||||
@ -280,15 +285,15 @@ vn_remove(const char *path, uio_seg_t seg, int flags)
|
|||||||
inode = dentry->d_inode;
|
inode = dentry->d_inode;
|
||||||
if (inode)
|
if (inode)
|
||||||
atomic_inc(&inode->i_count);
|
atomic_inc(&inode->i_count);
|
||||||
rc = vfs_unlink(nd.dentry->d_inode, dentry);
|
rc = vfs_unlink(nd.nd_dentry->d_inode, dentry);
|
||||||
exit2:
|
exit2:
|
||||||
dput(dentry);
|
dput(dentry);
|
||||||
}
|
}
|
||||||
mutex_unlock(&nd.dentry->d_inode->i_mutex);
|
mutex_unlock(&nd.nd_dentry->d_inode->i_mutex);
|
||||||
if (inode)
|
if (inode)
|
||||||
iput(inode); /* truncate the inode here */
|
iput(inode); /* truncate the inode here */
|
||||||
exit1:
|
exit1:
|
||||||
path_release(&nd);
|
vn_path_release(&nd);
|
||||||
exit:
|
exit:
|
||||||
RETURN(-rc);
|
RETURN(-rc);
|
||||||
|
|
||||||
@ -319,21 +324,21 @@ vn_rename(const char *oldname, const char *newname, int x1)
|
|||||||
GOTO(exit1, rc);
|
GOTO(exit1, rc);
|
||||||
|
|
||||||
rc = -EXDEV;
|
rc = -EXDEV;
|
||||||
if (oldnd.mnt != newnd.mnt)
|
if (oldnd.nd_mnt != newnd.nd_mnt)
|
||||||
GOTO(exit2, rc);
|
GOTO(exit2, rc);
|
||||||
|
|
||||||
old_dir = oldnd.dentry;
|
old_dir = oldnd.nd_dentry;
|
||||||
rc = -EBUSY;
|
rc = -EBUSY;
|
||||||
if (oldnd.last_type != LAST_NORM)
|
if (oldnd.last_type != LAST_NORM)
|
||||||
GOTO(exit2, rc);
|
GOTO(exit2, rc);
|
||||||
|
|
||||||
new_dir = newnd.dentry;
|
new_dir = newnd.nd_dentry;
|
||||||
if (newnd.last_type != LAST_NORM)
|
if (newnd.last_type != LAST_NORM)
|
||||||
GOTO(exit2, rc);
|
GOTO(exit2, rc);
|
||||||
|
|
||||||
trap = lock_rename(new_dir, old_dir);
|
trap = lock_rename(new_dir, old_dir);
|
||||||
|
|
||||||
old_dentry = lookup_hash(&oldnd);
|
old_dentry = vn_lookup_hash(&oldnd);
|
||||||
|
|
||||||
rc = PTR_ERR(old_dentry);
|
rc = PTR_ERR(old_dentry);
|
||||||
if (IS_ERR(old_dentry))
|
if (IS_ERR(old_dentry))
|
||||||
@ -358,7 +363,7 @@ vn_rename(const char *oldname, const char *newname, int x1)
|
|||||||
if (old_dentry == trap)
|
if (old_dentry == trap)
|
||||||
GOTO(exit4, rc);
|
GOTO(exit4, rc);
|
||||||
|
|
||||||
new_dentry = lookup_hash(&newnd);
|
new_dentry = vn_lookup_hash(&newnd);
|
||||||
rc = PTR_ERR(new_dentry);
|
rc = PTR_ERR(new_dentry);
|
||||||
if (IS_ERR(new_dentry))
|
if (IS_ERR(new_dentry))
|
||||||
GOTO(exit4, rc);
|
GOTO(exit4, rc);
|
||||||
@ -377,9 +382,9 @@ exit4:
|
|||||||
exit3:
|
exit3:
|
||||||
unlock_rename(new_dir, old_dir);
|
unlock_rename(new_dir, old_dir);
|
||||||
exit2:
|
exit2:
|
||||||
path_release(&newnd);
|
vn_path_release(&newnd);
|
||||||
exit1:
|
exit1:
|
||||||
path_release(&oldnd);
|
vn_path_release(&oldnd);
|
||||||
exit:
|
exit:
|
||||||
RETURN(-rc);
|
RETURN(-rc);
|
||||||
}
|
}
|
||||||
@ -610,7 +615,8 @@ int
|
|||||||
vn_init(void)
|
vn_init(void)
|
||||||
{
|
{
|
||||||
ENTRY;
|
ENTRY;
|
||||||
vn_cache = kmem_cache_create("spl_vn_cache", sizeof(struct vnode), 64,
|
vn_cache = kmem_cache_create("spl_vn_cache",
|
||||||
|
sizeof(struct vnode), 64,
|
||||||
vn_cache_constructor,
|
vn_cache_constructor,
|
||||||
vn_cache_destructor,
|
vn_cache_destructor,
|
||||||
NULL, NULL, NULL, 0);
|
NULL, NULL, NULL, 0);
|
||||||
|
@ -6,8 +6,7 @@ DISTFILES = Makefile.in \
|
|||||||
splat-time.c splat-condvar.c splat-mutex.c \
|
splat-time.c splat-condvar.c splat-mutex.c \
|
||||||
splat-rwlock.c splat-thread.c \
|
splat-rwlock.c splat-thread.c \
|
||||||
splat-ctl.c splat-internal.h
|
splat-ctl.c splat-internal.h
|
||||||
|
EXTRA_CFLAGS = @KERNELCPPFLAGS@
|
||||||
CPPFLAGS += @KERNELCPPFLAGS@
|
|
||||||
|
|
||||||
# Solaris Porting LAyer Tests
|
# Solaris Porting LAyer Tests
|
||||||
obj-m := splat.o
|
obj-m := splat.o
|
||||||
|
@ -41,7 +41,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "splat-internal.h"
|
#include "splat-internal.h"
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
|
||||||
#include <linux/devfs_fs_kernel.h>
|
#include <linux/devfs_fs_kernel.h>
|
||||||
|
@ -59,7 +59,7 @@ typedef struct mutex_priv {
|
|||||||
int mp_rc;
|
int mp_rc;
|
||||||
} mutex_priv_t;
|
} mutex_priv_t;
|
||||||
|
|
||||||
|
#ifdef HAVE_3ARGS_INIT_WORK
|
||||||
static void
|
static void
|
||||||
splat_mutex_test1_work(void *priv)
|
splat_mutex_test1_work(void *priv)
|
||||||
{
|
{
|
||||||
@ -71,14 +71,16 @@ splat_mutex_test1_work(void *priv)
|
|||||||
if (!mutex_tryenter(&mp->mp_mtx))
|
if (!mutex_tryenter(&mp->mp_mtx))
|
||||||
mp->mp_rc = -EBUSY;
|
mp->mp_rc = -EBUSY;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int
|
static int
|
||||||
splat_mutex_test1(struct file *file, void *arg)
|
splat_mutex_test1(struct file *file, void *arg)
|
||||||
{
|
{
|
||||||
|
int rc = 0;
|
||||||
|
#ifdef HAVE_3ARGS_INIT_WORK
|
||||||
struct workqueue_struct *wq;
|
struct workqueue_struct *wq;
|
||||||
struct work_struct work;
|
struct work_struct work;
|
||||||
mutex_priv_t *mp;
|
mutex_priv_t *mp;
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
mp = (mutex_priv_t *)kmalloc(sizeof(*mp), GFP_KERNEL);
|
mp = (mutex_priv_t *)kmalloc(sizeof(*mp), GFP_KERNEL);
|
||||||
if (mp == NULL)
|
if (mp == NULL)
|
||||||
@ -141,10 +143,11 @@ out:
|
|||||||
destroy_workqueue(wq);
|
destroy_workqueue(wq);
|
||||||
out2:
|
out2:
|
||||||
kfree(mp);
|
kfree(mp);
|
||||||
|
#endif
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_3ARGS_INIT_WORK
|
||||||
static void
|
static void
|
||||||
splat_mutex_test2_work(void *priv)
|
splat_mutex_test2_work(void *priv)
|
||||||
{
|
{
|
||||||
@ -162,13 +165,16 @@ splat_mutex_test2_work(void *priv)
|
|||||||
mp->mp_rc = rc + 1;
|
mp->mp_rc = rc + 1;
|
||||||
mutex_exit(&mp->mp_mtx);
|
mutex_exit(&mp->mp_mtx);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int
|
static int
|
||||||
splat_mutex_test2(struct file *file, void *arg)
|
splat_mutex_test2(struct file *file, void *arg)
|
||||||
{
|
{
|
||||||
|
int rc = 0;
|
||||||
|
#ifdef HAVE_3ARGS_INIT_WORK
|
||||||
struct workqueue_struct *wq;
|
struct workqueue_struct *wq;
|
||||||
mutex_priv_t *mp;
|
mutex_priv_t *mp;
|
||||||
int i, rc = 0;
|
int i;
|
||||||
|
|
||||||
mp = (mutex_priv_t *)kmalloc(sizeof(*mp), GFP_KERNEL);
|
mp = (mutex_priv_t *)kmalloc(sizeof(*mp), GFP_KERNEL);
|
||||||
if (mp == NULL)
|
if (mp == NULL)
|
||||||
@ -220,7 +226,7 @@ splat_mutex_test2(struct file *file, void *arg)
|
|||||||
destroy_workqueue(wq);
|
destroy_workqueue(wq);
|
||||||
out:
|
out:
|
||||||
kfree(mp);
|
kfree(mp);
|
||||||
|
#endif
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user