- Properly fix the debug support for all the ASSERT's, VERIFIES, etc can be

compiled out when doing performance runs.
- Bite the bullet and fully autoconfize the debug options in the configure
  time parameters.  By default all the debug support is disable in the core
  SPL build, but available to modules which enable it when building against
  the SPL.  To enable particular SPL debug support use the follow configure
  options:

  --enable-debug		Internal ASSERTs
  --enable-debug-kmem		Detailed memory accounting
  --enable-debug-mutex		Detailed mutex tracking
  --enable-debug_kstat          Kstat info exported to /proc
  --enable-debug-callb		Additional callb debug



git-svn-id: https://outreach.scidac.gov/svn/spl/trunk@111 7e1ea52c-4ff2-0310-8f11-9dd32ca42a1c
This commit is contained in:
behlendo 2008-05-19 02:49:12 +00:00
parent 6ab69573ff
commit cc7449ccd6
8 changed files with 213 additions and 84 deletions

View File

@ -8,99 +8,194 @@ AC_PROG_INSTALL
AC_PROG_CC AC_PROG_CC
AC_PROG_LIBTOOL AC_PROG_LIBTOOL
ver=`uname -r`
kernelsrc= kernelsrc=
kernelbuild= kernelbuild=
AC_ARG_WITH(kernel,
[ --with-linux=PATH Path to kernel source ],
[kernelsrc="$withval"; kernelbuild="$withval"])
AC_ARG_WITH(kernel-build,
[ --with-linux-obj=PATH Path to kernel build objects ],
[kernelbuild="$withval"])
AC_MSG_CHECKING([kernel source directory]) AC_DEFUN([SPL_AC_KERNEL], [
if test -z "$kernelsrc"; then ver=`uname -r`
kernelbuild=
sourcelink=/lib/modules/${ver}/source
buildlink=/lib/modules/${ver}/build
if test -e $sourcelink; then AC_ARG_WITH([linux],
kernelsrc=`(cd $sourcelink; /bin/pwd)` AS_HELP_STRING([--with-linux=PATH],
fi [Path to kernel source]),
if test -e $buildlink; then [kernelsrc="$withval"; kernelbuild="$withval"])
kernelbuild=`(cd $buildlink; /bin/pwd)`
fi AC_ARG_WITH([linux-build],
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 if test -z "$kernelsrc"; then
kernelsrc=$kernelbuild kernelbuild=
fi sourcelink=/lib/modules/${ver}/source
if test -z "$kernelsrc" -o -z "$kernelbuild"; then buildlink=/lib/modules/${ver}/build
AC_MSG_RESULT([Not found])
AC_MSG_ERROR([ 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 *** Please specify the location of the kernel source
*** with the '--with-kernel=PATH' option]) *** with the '--with-kernel=PATH' option])
fi
fi fi
fi
AC_MSG_RESULT([$kernelsrc]) AC_MSG_RESULT([$kernelsrc])
AC_MSG_CHECKING([kernel build directory]) AC_MSG_CHECKING([kernel build directory])
AC_MSG_RESULT([$kernelbuild]) AC_MSG_RESULT([$kernelbuild])
AC_MSG_CHECKING([kernel source version]) AC_MSG_CHECKING([kernel source version])
if test -r $kernelbuild/include/linux/version.h && if test -r $kernelbuild/include/linux/version.h &&
fgrep -q UTS_RELEASE $kernelbuild/include/linux/version.h; then fgrep -q UTS_RELEASE $kernelbuild/include/linux/version.h; then
kernsrcver=`(echo "#include <linux/version.h>"; kernsrcver=`(echo "#include <linux/version.h>";
echo "kernsrcver=UTS_RELEASE") | echo "kernsrcver=UTS_RELEASE") |
cpp -I $kernelbuild/include | cpp -I $kernelbuild/include |
grep "^kernsrcver=" | cut -d \" -f 2` grep "^kernsrcver=" | cut -d \" -f 2`
elif test -r $kernelbuild/include/linux/utsrelease.h && elif test -r $kernelbuild/include/linux/utsrelease.h &&
fgrep -q UTS_RELEASE $kernelbuild/include/linux/utsrelease.h; then fgrep -q UTS_RELEASE $kernelbuild/include/linux/utsrelease.h; then
kernsrcver=`(echo "#include <linux/utsrelease.h>"; kernsrcver=`(echo "#include <linux/utsrelease.h>";
echo "kernsrcver=UTS_RELEASE") | echo "kernsrcver=UTS_RELEASE") |
cpp -I $kernelbuild/include | cpp -I $kernelbuild/include |
grep "^kernsrcver=" | cut -d \" -f 2` grep "^kernsrcver=" | cut -d \" -f 2`
fi fi
if test -z "$kernsrcver"; then if test -z "$kernsrcver"; then
AC_MSG_RESULT([Not found]) AC_MSG_RESULT([Not found])
AC_MSG_ERROR([ AC_MSG_ERROR([
*** Cannot determine the version of the linux kernel source. *** Cannot determine the version of the linux kernel source.
*** Please prepare the kernel before running this script]) *** Please prepare the kernel before running this script])
fi fi
AC_MSG_RESULT([$kernsrcver]) AC_MSG_RESULT([$kernsrcver])
kmoduledir=${INSTALL_MOD_PATH}/lib/modules/$kernsrcver kmoduledir=${INSTALL_MOD_PATH}/lib/modules/$kernsrcver
AC_SUBST(kernelsrc) AC_SUBST(kernelsrc)
AC_SUBST(kmoduledir) AC_SUBST(kmoduledir)
])
# AC_DEFUN([SPL_AC_DEBUG], [
# Each version of the kernel provides a slightly different AC_MSG_CHECKING([whether debugging is enabled])
# ABI, so figure out what we have to work with and adapt. AC_ARG_ENABLE( [debug],
# AS_HELP_STRING([--enable-debug],
AC_MSG_CHECKING([if kernel defines kzalloc function]) [Enable generic debug support (default off)]),
if egrep -qw "kzalloc" $kernelsrc/include/linux/slab.h; then [ case "$enableval" in
AC_DEFINE(HAVE_KZALLOC, 1, [kzalloc() is defined]) yes) spl_ac_debug=yes ;;
AC_MSG_RESULT([yes]) no) spl_ac_debug=no ;;
else *) AC_MSG_RESULT([Error!])
AC_MSG_RESULT([no]) AC_MSG_ERROR([Bad value "$enableval" for --enable-debug]) ;;
fi 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_MSG_CHECKING([if kernel has mutex.h ]) AC_DEFUN([SPL_AC_DEBUG_MUTEX], [
if test -f $kernelsrc/include/linux/mutex.h; then AC_MSG_CHECKING([whether mutex debugging is enabled])
AC_DEFINE(HAVE_MUTEX_H, 1, [kernel has mutex.h]) AC_ARG_ENABLE( [debug-mutex],
AC_MSG_RESULT([yes]) AS_HELP_STRING([--enable-debug-mutex],
else [Enable mutex debug support (default off)]),
AC_MSG_RESULT([no]) [ case "$enableval" in
fi 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_DEBUG
SPL_AC_DEBUG_KMEM
SPL_AC_DEBUG_MUTEX
SPL_AC_DEBUG_KSTAT
SPL_AC_DEBUG_CALLB
TOPDIR=`/bin/pwd` TOPDIR=`/bin/pwd`
# Add "V=1" to KERNELMAKE_PARAMS to enable verbose module build # Add "V=1" to KERNELMAKE_PARAMS to enable verbose module build
KERNELMAKE_PARAMS= KERNELMAKE_PARAMS=
KERNELCPPFLAGS="-I$TOPDIR -I$TOPDIR/include" KERNELCPPFLAGS="${KERNELCPPFLAGS} -I$TOPDIR -I$TOPDIR/include"
if test "$kernelbuild" != "$kernelsrc"; then if test "$kernelbuild" != "$kernelsrc"; then
KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$kernelbuild" KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$kernelbuild"

View File

@ -8,15 +8,12 @@ extern "C" {
#include <linux/module.h> #include <linux/module.h>
#include <sys/mutex.h> #include <sys/mutex.h>
#define DEBUG_CALLB #ifdef DEBUG_CALLB
#ifndef DEBUG_CALLB
#define CALLB_CPR_ASSERT(cp) ASSERT(MUTEX_HELD((cp)->cc_lockp)); #define CALLB_CPR_ASSERT(cp) ASSERT(MUTEX_HELD((cp)->cc_lockp));
#else #else
#define CALLB_CPR_ASSERT(cp) #define CALLB_CPR_ASSERT(cp) (void)0
#endif #endif
typedef struct callb_cpr { typedef struct callb_cpr {
kmutex_t *cc_lockp; kmutex_t *cc_lockp;
} callb_cpr_t; } callb_cpr_t;

View File

@ -1,6 +1,10 @@
#ifndef _SPL_DEBUG_H #ifndef _SPL_DEBUG_H
#define _SPL_DEBUG_H #define _SPL_DEBUG_H
#ifdef __cplusplus
extern "C" {
#endif
#include <linux/sched.h> /* THREAD_SIZE */ #include <linux/sched.h> /* THREAD_SIZE */
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
@ -159,6 +163,37 @@ struct page_collection {
#define SBUG() spl_debug_bug(__FILE__, __FUNCTION__, __LINE__, 0); #define SBUG() spl_debug_bug(__FILE__, __FUNCTION__, __LINE__, 0);
#ifdef NDEBUG
#define CDEBUG_STACK() (0)
#define CDEBUG(mask, format, a...) ((void)0)
#define CWARN(fmt, a...) ((void)0)
#define CERROR(fmt, a...) ((void)0)
#define CEMERG(fmt, a...) ((void)0)
#define CONSOLE(mask, fmt, a...) ((void)0)
#define ENTRY ((void)0)
#define EXIT ((void)0)
#define RETURN(x) return (x)
#define GOTO(x, y) { ((void)(y)); goto x; }
#define __ASSERT(x) ((void)0)
#define __ASSERT_TAGE_INVARIANT(x) ((void)0)
#define ASSERT(x) ((void)0)
#define VERIFY(x) ((void)(x))
#define VERIFY3_IMPL(x, y, z, t, f, c) if (x == z) ((void)0)
#define VERIFY3S(x,y,z) VERIFY3_IMPL(x, y, z, int64_t, "%ld", (long))
#define VERIFY3U(x,y,z) VERIFY3_IMPL(x, y, z, uint64_t, "%lu", (unsigned long))
#define VERIFY3P(x,y,z) VERIFY3_IMPL(x, y, z, uintptr_t, "%p", (void *))
#define ASSERT3S(x,y,z) VERIFY3S(x, y, z)
#define ASSERT3U(x,y,z) VERIFY3U(x, y, z)
#define ASSERT3P(x,y,z) VERIFY3P(x, y, z)
#else /* NDEBUG */
#ifdef __ia64__ #ifdef __ia64__
#define CDEBUG_STACK() (THREAD_SIZE - \ #define CDEBUG_STACK() (THREAD_SIZE - \
((unsigned long)__builtin_dwarf_cfa() & \ ((unsigned long)__builtin_dwarf_cfa() & \
@ -259,10 +294,6 @@ do { \
#define VERIFY(x) ASSERT(x) #define VERIFY(x) ASSERT(x)
#define spl_debug_msg(cdls, subsys, mask, file, fn, line, format, a...) \
spl_debug_vmsg(cdls, subsys, mask, file, fn, \
line, NULL, NULL, format, ##a)
#define __CDEBUG(cdls, subsys, mask, format, a...) \ #define __CDEBUG(cdls, subsys, mask, format, a...) \
do { \ do { \
CHECK_STACK(); \ CHECK_STACK(); \
@ -322,6 +353,11 @@ do { \
#define ENTRY __ENTRY(DEBUG_SUBSYSTEM) #define ENTRY __ENTRY(DEBUG_SUBSYSTEM)
#define EXIT __EXIT(DEBUG_SUBSYSTEM) #define EXIT __EXIT(DEBUG_SUBSYSTEM)
#endif /* NDEBUG */
#define spl_debug_msg(cdls, subsys, mask, file, fn, line, format, a...) \
spl_debug_vmsg(cdls, subsys, mask, file, fn, \
line, NULL, NULL, format, ##a)
extern int spl_debug_vmsg(spl_debug_limit_state_t *cdls, int subsys, int mask, extern int spl_debug_vmsg(spl_debug_limit_state_t *cdls, int subsys, int mask,
const char *file, const char *fn, const int line, const char *file, const char *fn, const int line,
@ -341,4 +377,8 @@ extern void spl_debug_bug(char *file, const char *func, const int line, int flag
extern int spl_debug_clear_buffer(void); extern int spl_debug_clear_buffer(void);
extern int spl_debug_mark_buffer(char *text); extern int spl_debug_mark_buffer(char *text);
#ifdef __cplusplus
}
#endif
#endif /* SPL_DEBUG_H */ #endif /* SPL_DEBUG_H */

View File

@ -5,8 +5,6 @@
extern "C" { extern "C" {
#endif #endif
//#define DEBUG_KMEM
#undef DEBUG_KMEM
#undef DEBUG_KMEM_UNIMPLEMENTED #undef DEBUG_KMEM_UNIMPLEMENTED
#include <linux/module.h> #include <linux/module.h>

View File

@ -5,8 +5,6 @@
extern "C" { extern "C" {
#endif #endif
#define DEBUG_KSTAT
#include <linux/module.h> #include <linux/module.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/time.h> #include <sys/time.h>

View File

@ -10,9 +10,6 @@ extern "C" {
#include <sys/types.h> #include <sys/types.h>
#include <sys/kmem.h> #include <sys/kmem.h>
//#define DEBUG_MUTEX
#undef DEBUG_MUTEX
#define MUTEX_DEFAULT 0 #define MUTEX_DEFAULT 0
#define MUTEX_SPIN 1 #define MUTEX_SPIN 1
#define MUTEX_ADAPTIVE 2 #define MUTEX_ADAPTIVE 2

View File

@ -8,8 +8,10 @@
#define DEBUG_SUBSYSTEM S_GENERIC #define DEBUG_SUBSYSTEM S_GENERIC
#ifndef NDEBUG
static char ce_prefix[CE_IGNORE][10] = { "", "NOTICE: ", "WARNING: ", "" }; static char ce_prefix[CE_IGNORE][10] = { "", "NOTICE: ", "WARNING: ", "" };
static char ce_suffix[CE_IGNORE][2] = { "", "\n", "\n", "" }; static char ce_suffix[CE_IGNORE][2] = { "", "\n", "\n", "" };
#endif
void void
vpanic(const char *fmt, va_list ap) vpanic(const char *fmt, va_list ap)

View File

@ -830,7 +830,9 @@ proc_init(void)
#endif /* DEBUG_KSTAT */ #endif /* DEBUG_KSTAT */
RETURN(rc); RETURN(rc);
#if defined(DEBUG_KMEM) || defined(DEBUG_KSTAT)
out2: out2:
#endif
#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 */