Rate limit debugging stack traces

There have been issues in the past where excessive debug logging
to the console has resulted in significant performance impacts.
In the vast majority of these cases only a few stack traces are
required to diagnose the issue.  Therefore, stack traces dumped to
the console will now we limited to 5 every 60s.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Prakash Surya <surya1@llnl.gov>
Closes #374
This commit is contained in:
Brian Behlendorf 2014-07-16 14:00:57 -07:00
parent f6a869614e
commit 377e12f14a
2 changed files with 16 additions and 8 deletions

View File

@ -37,6 +37,7 @@
#include <linux/proc_compat.h> #include <linux/proc_compat.h>
#include <linux/file_compat.h> #include <linux/file_compat.h>
#include <linux/swap.h> #include <linux/swap.h>
#include <linux/ratelimit.h>
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#include <sys/thread.h> #include <sys/thread.h>
#include <spl-debug.h> #include <spl-debug.h>
@ -1073,15 +1074,22 @@ spl_debug_get_mb(void)
} }
EXPORT_SYMBOL(spl_debug_get_mb); EXPORT_SYMBOL(spl_debug_get_mb);
void spl_debug_dumpstack(struct task_struct *tsk) /*
{ * Limit the number of stack traces dumped to not more than 5 every
extern void show_task(struct task_struct *); * 60 seconds to prevent denial-of-service attacks from debug code.
*/
DEFINE_RATELIMIT_STATE(dumpstack_ratelimit_state, 60 * HZ, 5);
void
spl_debug_dumpstack(struct task_struct *tsk)
{
if (__ratelimit(&dumpstack_ratelimit_state)) {
if (tsk == NULL) if (tsk == NULL)
tsk = current; tsk = current;
printk("SPL: Showing stack for process %d\n", tsk->pid); printk("SPL: Showing stack for process %d\n", tsk->pid);
dump_stack(); dump_stack();
}
} }
EXPORT_SYMBOL(spl_debug_dumpstack); EXPORT_SYMBOL(spl_debug_dumpstack);

View File

@ -725,7 +725,7 @@ kmem_alloc_debug(size_t size, int flags, const char *func, int line,
"large kmem_alloc(%llu, 0x%x) at %s:%d (%lld/%llu)\n", "large kmem_alloc(%llu, 0x%x) at %s:%d (%lld/%llu)\n",
(unsigned long long) size, flags, func, line, (unsigned long long) size, flags, func, line,
kmem_alloc_used_read(), kmem_alloc_max); kmem_alloc_used_read(), kmem_alloc_max);
dump_stack(); spl_debug_dumpstack(NULL);
} }
/* Use the correct allocator */ /* Use the correct allocator */