hc
2024-01-31 f70575805708cabdedea7498aaa3f710fde4d920
kernel/lib/ratelimit.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * ratelimit.c - Do something with rate limit.
34 *
....@@ -5,8 +6,6 @@
56 *
67 * 2008-05-01 rewrite the function and use a ratelimit_state data struct as
78 * parameter. Now every user can use their own standalone ratelimit_state.
8
- *
9
- * This file is released under the GPLv2.
109 */
1110
1211 #include <linux/ratelimit.h>
....@@ -27,10 +26,16 @@
2726 */
2827 int ___ratelimit(struct ratelimit_state *rs, const char *func)
2928 {
29
+ /* Paired with WRITE_ONCE() in .proc_handler().
30
+ * Changing two values seperately could be inconsistent
31
+ * 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);
3035 unsigned long flags;
3136 int ret;
3237
33
- if (!rs->interval)
38
+ if (!interval)
3439 return 1;
3540
3641 /*
....@@ -45,7 +50,7 @@
4550 if (!rs->begin)
4651 rs->begin = jiffies;
4752
48
- if (time_is_before_jiffies(rs->begin + rs->interval)) {
53
+ if (time_is_before_jiffies(rs->begin + interval)) {
4954 if (rs->missed) {
5055 if (!(rs->flags & RATELIMIT_MSG_ON_RELEASE)) {
5156 printk_deferred(KERN_WARNING
....@@ -57,7 +62,7 @@
5762 rs->begin = jiffies;
5863 rs->printed = 0;
5964 }
60
- if (rs->burst && rs->burst > rs->printed) {
65
+ if (burst && burst > rs->printed) {
6166 rs->printed++;
6267 ret = 1;
6368 } else {