printk: add pr_warn_once_per_minute From: Konstantin Khlebnikov Signed-off-by: Konstantin Khlebnikov --- include/linux/printk.h | 17 +++++++++++++++++ mm/mmap.c | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/include/linux/printk.h b/include/linux/printk.h index 696a56be7d3e..372984b6645b 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -341,11 +341,25 @@ extern asmlinkage void dump_stack(void) __cold; } \ unlikely(__ret_print_once); \ }) +#define printk_periodic(period, fmt, ...) \ +({ \ + static unsigned long __prev __read_mostly = INITIAL_JIFFIES - (period); \ + unsigned long __now = jiffies; \ + bool __print = !time_in_range_open(__now, __prev, __prev + (period)); \ + \ + if (__print) { \ + __prev = __now; \ + printk(fmt, ##__VA_ARGS__); \ + } \ + unlikely(__print); \ +}) #else #define printk_once(fmt, ...) \ no_printk(fmt, ##__VA_ARGS__) #define printk_deferred_once(fmt, ...) \ no_printk(fmt, ##__VA_ARGS__) +#define printk_periodic(period, fmt, ...) \ + no_printk(fmt, ##__VA_ARGS__) #endif #define pr_emerg_once(fmt, ...) \ @@ -365,6 +379,9 @@ extern asmlinkage void dump_stack(void) __cold; #define pr_cont_once(fmt, ...) \ printk_once(KERN_CONT pr_fmt(fmt), ##__VA_ARGS__) +#define pr_warn_once_per_minute(fmt, ...) \ + printk_periodic(HZ * 60, KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__) + #if defined(DEBUG) #define pr_devel_once(fmt, ...) \ printk_once(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) diff --git a/mm/mmap.c b/mm/mmap.c index ca9d91bca0d6..34f9fb2adcab 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -2935,7 +2935,7 @@ bool may_expand_vm(struct mm_struct *mm, vm_flags_t flags, unsigned long npages) mm->data_vm + npages <= rlimit_max(RLIMIT_DATA) >> PAGE_SHIFT) return true; if (!ignore_rlimit_data) { - pr_warn_once("%s (%d): VmData %lu exceed data ulimit %lu. Update limits or use boot option ignore_rlimit_data.\n", + pr_warn_once_per_minute("%s (%d): VmData %lu exceed data ulimit %lu. Update limits or use boot option ignore_rlimit_data.\n", current->comm, current->pid, (mm->data_vm + npages) << PAGE_SHIFT, rlimit(RLIMIT_DATA));