diff options
Diffstat (limited to 'arch/ia64/kernel/unaligned.c')
-rw-r--r-- | arch/ia64/kernel/unaligned.c | 24 |
1 files changed, 5 insertions, 19 deletions
diff --git a/arch/ia64/kernel/unaligned.c b/arch/ia64/kernel/unaligned.c index 776dd40397e2..622772b7fb6c 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) |