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:
parent
f6a869614e
commit
377e12f14a
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue