diff options
-rw-r--r-- | arch/ia64/kernel/irq_ia64.c | 9 | ||||
-rw-r--r-- | arch/ia64/kernel/unaligned.c | 24 |
2 files changed, 8 insertions, 25 deletions
diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c index 640479304ac..f14c35f9b03 100644 --- a/arch/ia64/kernel/irq_ia64.c +++ b/arch/ia64/kernel/irq_ia64.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/threads.h> | 29 | #include <linux/threads.h> |
30 | #include <linux/bitops.h> | 30 | #include <linux/bitops.h> |
31 | #include <linux/irq.h> | 31 | #include <linux/irq.h> |
32 | #include <linux/ratelimit.h> | ||
32 | 33 | ||
33 | #include <asm/delay.h> | 34 | #include <asm/delay.h> |
34 | #include <asm/intrinsics.h> | 35 | #include <asm/intrinsics.h> |
@@ -467,13 +468,9 @@ ia64_handle_irq (ia64_vector vector, struct pt_regs *regs) | |||
467 | sp = ia64_getreg(_IA64_REG_SP); | 468 | sp = ia64_getreg(_IA64_REG_SP); |
468 | 469 | ||
469 | if ((sp - bsp) < 1024) { | 470 | if ((sp - bsp) < 1024) { |
470 | static unsigned char count; | 471 | static DEFINE_RATELIMIT_STATE(ratelimit, 5 * HZ, 5); |
471 | static long last_time; | ||
472 | 472 | ||
473 | if (time_after(jiffies, last_time + 5 * HZ)) | 473 | if (__ratelimit(&ratelimit)) { |
474 | count = 0; | ||
475 | if (++count < 5) { | ||
476 | last_time = jiffies; | ||
477 | printk("ia64_handle_irq: DANGER: less than " | 474 | printk("ia64_handle_irq: DANGER: less than " |
478 | "1KB of free stack space!!\n" | 475 | "1KB of free stack space!!\n" |
479 | "(bsp=0x%lx, sp=%lx)\n", bsp, sp); | 476 | "(bsp=0x%lx, sp=%lx)\n", bsp, sp); |
diff --git a/arch/ia64/kernel/unaligned.c b/arch/ia64/kernel/unaligned.c index 776dd40397e..622772b7fb6 100644 --- a/arch/ia64/kernel/unaligned.c +++ b/arch/ia64/kernel/unaligned.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
18 | #include <linux/sched.h> | 18 | #include <linux/sched.h> |
19 | #include <linux/tty.h> | 19 | #include <linux/tty.h> |
20 | #include <linux/ratelimit.h> | ||
20 | 21 | ||
21 | #include <asm/intrinsics.h> | 22 | #include <asm/intrinsics.h> |
22 | #include <asm/processor.h> | 23 | #include <asm/processor.h> |
@@ -1283,24 +1284,9 @@ emulate_store_float (unsigned long ifa, load_store_t ld, struct pt_regs *regs) | |||
1283 | /* | 1284 | /* |
1284 | * Make sure we log the unaligned access, so that user/sysadmin can notice it and | 1285 | * Make sure we log the unaligned access, so that user/sysadmin can notice it and |
1285 | * eventually fix the program. However, we don't want to do that for every access so we | 1286 | * eventually fix the program. However, we don't want to do that for every access so we |
1286 | * pace it with jiffies. This isn't really MP-safe, but it doesn't really have to be | 1287 | * pace it with jiffies. |
1287 | * either... | ||
1288 | */ | 1288 | */ |
1289 | static int | 1289 | static DEFINE_RATELIMIT_STATE(logging_rate_limit, 5 * HZ, 5); |
1290 | within_logging_rate_limit (void) | ||
1291 | { | ||
1292 | static unsigned long count, last_time; | ||
1293 | |||
1294 | if (time_after(jiffies, last_time + 5 * HZ)) | ||
1295 | count = 0; | ||
1296 | if (count < 5) { | ||
1297 | last_time = jiffies; | ||
1298 | count++; | ||
1299 | return 1; | ||
1300 | } | ||
1301 | return 0; | ||
1302 | |||
1303 | } | ||
1304 | 1290 | ||
1305 | void | 1291 | void |
1306 | ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs) | 1292 | ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs) |
@@ -1337,7 +1323,7 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs) | |||
1337 | 1323 | ||
1338 | if (!no_unaligned_warning && | 1324 | if (!no_unaligned_warning && |
1339 | !(current->thread.flags & IA64_THREAD_UAC_NOPRINT) && | 1325 | !(current->thread.flags & IA64_THREAD_UAC_NOPRINT) && |
1340 | within_logging_rate_limit()) | 1326 | __ratelimit(&logging_rate_limit)) |
1341 | { | 1327 | { |
1342 | char buf[200]; /* comm[] is at most 16 bytes... */ | 1328 | char buf[200]; /* comm[] is at most 16 bytes... */ |
1343 | size_t len; | 1329 | size_t len; |
@@ -1370,7 +1356,7 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs) | |||
1370 | } | 1356 | } |
1371 | } | 1357 | } |
1372 | } else { | 1358 | } else { |
1373 | if (within_logging_rate_limit()) { | 1359 | if (__ratelimit(&logging_rate_limit)) { |
1374 | printk(KERN_WARNING "kernel unaligned access to 0x%016lx, ip=0x%016lx\n", | 1360 | printk(KERN_WARNING "kernel unaligned access to 0x%016lx, ip=0x%016lx\n", |
1375 | ifa, regs->cr_iip + ipsr->ri); | 1361 | ifa, regs->cr_iip + ipsr->ri); |
1376 | if (unaligned_dump_stack) | 1362 | if (unaligned_dump_stack) |