brintos

brintos / linux-shallow public Read only

0
0
Text · 1.8 KiB · ce945c1 Raw
77 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * ratelimit.c - Do something with rate limit.4 *5 * Isolated from kernel/printk.c by Dave Young <hidave.darkstar@gmail.com>6 *7 * 2008-05-01 rewrite the function and use a ratelimit_state data struct as8 * parameter. Now every user can use their own standalone ratelimit_state.9 */10 11#include <linux/ratelimit.h>12#include <linux/jiffies.h>13#include <linux/export.h>14 15/*16 * __ratelimit - rate limiting17 * @rs: ratelimit_state data18 * @func: name of calling function19 *20 * This enforces a rate limit: not more than @rs->burst callbacks21 * in every @rs->interval22 *23 * RETURNS:24 * 0 means callbacks will be suppressed.25 * 1 means go ahead and do it.26 */27int ___ratelimit(struct ratelimit_state *rs, const char *func)28{29	/* Paired with WRITE_ONCE() in .proc_handler().30	 * Changing two values seperately could be inconsistent31	 * and some message could be lost.  (See: net_ratelimit_state).32	 */33	int interval = READ_ONCE(rs->interval);34	int burst = READ_ONCE(rs->burst);35	unsigned long flags;36	int ret;37 38	if (!interval)39		return 1;40 41	/*42	 * If we contend on this state's lock then almost43	 * by definition we are too busy to print a message,44	 * in addition to the one that will be printed by45	 * the entity that is holding the lock already:46	 */47	if (!raw_spin_trylock_irqsave(&rs->lock, flags))48		return 0;49 50	if (!rs->begin)51		rs->begin = jiffies;52 53	if (time_is_before_jiffies(rs->begin + interval)) {54		if (rs->missed) {55			if (!(rs->flags & RATELIMIT_MSG_ON_RELEASE)) {56				printk_deferred(KERN_WARNING57						"%s: %d callbacks suppressed\n",58						func, rs->missed);59				rs->missed = 0;60			}61		}62		rs->begin   = jiffies;63		rs->printed = 0;64	}65	if (burst && burst > rs->printed) {66		rs->printed++;67		ret = 1;68	} else {69		rs->missed++;70		ret = 0;71	}72	raw_spin_unlock_irqrestore(&rs->lock, flags);73 74	return ret;75}76EXPORT_SYMBOL(___ratelimit);77