diff options
Diffstat (limited to 'drivers/misc')
-rw-r--r-- | drivers/misc/lkdtm.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/misc/lkdtm.c b/drivers/misc/lkdtm.c index 31a991161f0a..5bfb2a2041b8 100644 --- a/drivers/misc/lkdtm.c +++ b/drivers/misc/lkdtm.c | |||
@@ -75,6 +75,9 @@ enum ctype { | |||
75 | UNALIGNED_LOAD_STORE_WRITE, | 75 | UNALIGNED_LOAD_STORE_WRITE, |
76 | OVERWRITE_ALLOCATION, | 76 | OVERWRITE_ALLOCATION, |
77 | WRITE_AFTER_FREE, | 77 | WRITE_AFTER_FREE, |
78 | SOFTLOCKUP, | ||
79 | HARDLOCKUP, | ||
80 | HUNG_TASK, | ||
78 | }; | 81 | }; |
79 | 82 | ||
80 | static char* cp_name[] = { | 83 | static char* cp_name[] = { |
@@ -99,6 +102,9 @@ static char* cp_type[] = { | |||
99 | "UNALIGNED_LOAD_STORE_WRITE", | 102 | "UNALIGNED_LOAD_STORE_WRITE", |
100 | "OVERWRITE_ALLOCATION", | 103 | "OVERWRITE_ALLOCATION", |
101 | "WRITE_AFTER_FREE", | 104 | "WRITE_AFTER_FREE", |
105 | "SOFTLOCKUP", | ||
106 | "HARDLOCKUP", | ||
107 | "HUNG_TASK", | ||
102 | }; | 108 | }; |
103 | 109 | ||
104 | static struct jprobe lkdtm; | 110 | static struct jprobe lkdtm; |
@@ -320,6 +326,20 @@ static void lkdtm_do_action(enum ctype which) | |||
320 | memset(data, 0x78, len); | 326 | memset(data, 0x78, len); |
321 | break; | 327 | break; |
322 | } | 328 | } |
329 | case SOFTLOCKUP: | ||
330 | preempt_disable(); | ||
331 | for (;;) | ||
332 | cpu_relax(); | ||
333 | break; | ||
334 | case HARDLOCKUP: | ||
335 | local_irq_disable(); | ||
336 | for (;;) | ||
337 | cpu_relax(); | ||
338 | break; | ||
339 | case HUNG_TASK: | ||
340 | set_current_state(TASK_UNINTERRUPTIBLE); | ||
341 | schedule(); | ||
342 | break; | ||
323 | case NONE: | 343 | case NONE: |
324 | default: | 344 | default: |
325 | break; | 345 | break; |