Messages in this thread Patch in this message | | | Date | Tue, 31 Jan 2012 21:25:19 +0800 | From | Cong Wang <> | Subject | Re: [Patch] lkdtm: avoid calling lkdtm_do_action() with spin lock held |
| |
On 01/31/2012 04:54 AM, Andrew Morton wrote: > > lkdtm_handler() can be called from module IRQ handlers, so perhaps the > same problems can still happen. The patch does improve things though ;) >
Yeah, what do you think about patch below (untested)?
---
Signed-off-by: WANG Cong <xiyou.wangcong@gmail.com> diff --git a/drivers/misc/lkdtm.c b/drivers/misc/lkdtm.c index 28adefe..5cbd740 100644 --- a/drivers/misc/lkdtm.c +++ b/drivers/misc/lkdtm.c @@ -315,7 +315,7 @@ static void lkdtm_do_action(enum ctype which) } case CT_OVERWRITE_ALLOCATION: { size_t len = 1020; - u32 *data = kmalloc(len, GFP_KERNEL); + u32 *data = kmalloc(len, GFP_ATOMIC); data[1024 / sizeof(u32)] = 0x12345678; kfree(data); @@ -323,14 +323,16 @@ static void lkdtm_do_action(enum ctype which) } case CT_WRITE_AFTER_FREE: { size_t len = 1024; - u32 *data = kmalloc(len, GFP_KERNEL); + u32 *data = kmalloc(len, GFP_ATOMIC); kfree(data); - schedule(); + udelay(100); memset(data, 0x78, len); break; } case CT_SOFTLOCKUP: + if (in_interrupt()) + break; preempt_disable(); for (;;) cpu_relax(); @@ -341,6 +343,8 @@ static void lkdtm_do_action(enum ctype which) cpu_relax(); break; case CT_HUNG_TASK: + if (in_interrupt()) + break; set_current_state(TASK_UNINTERRUPTIBLE); schedule(); break; | |