diff --git a/module/spl/spl-debug.c b/module/spl/spl-debug.c index 93c3f31b8a..6c4e043f05 100644 --- a/module/spl/spl-debug.c +++ b/module/spl/spl-debug.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -1073,15 +1074,22 @@ spl_debug_get_mb(void) } 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 + * 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) { - extern void show_task(struct task_struct *); + if (__ratelimit(&dumpstack_ratelimit_state)) { + if (tsk == NULL) + tsk = current; - if (tsk == NULL) - tsk = current; - - printk("SPL: Showing stack for process %d\n", tsk->pid); - dump_stack(); + printk("SPL: Showing stack for process %d\n", tsk->pid); + dump_stack(); + } } EXPORT_SYMBOL(spl_debug_dumpstack); diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c index e458c20201..6389dc5aab 100644 --- a/module/spl/spl-kmem.c +++ b/module/spl/spl-kmem.c @@ -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", (unsigned long long) size, flags, func, line, kmem_alloc_used_read(), kmem_alloc_max); - dump_stack(); + spl_debug_dumpstack(NULL); } /* Use the correct allocator */