lkdtm: avoid calling lkdtm_do_action() with spinlock held

lkdtm_do_action() may call sleeping functions like kmalloc(), so do not
call it with spin lock held.

Signed-off-by: WANG Cong <xiyou.wangcong@gmail.com>
Cc: Prarit Bhargava <prarit@redhat.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Greg Kroah-Hartman <greg@kroah.com>
Reviewed-by: Dave Young <dyoung@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Cong Wang 2012-02-03 15:37:15 -08:00 коммит произвёл Linus Torvalds
Родитель 99f02ef1f1
Коммит 92618184cb
1 изменённых файлов: 5 добавлений и 1 удалений

Просмотреть файл

@ -354,6 +354,7 @@ static void lkdtm_do_action(enum ctype which)
static void lkdtm_handler(void) static void lkdtm_handler(void)
{ {
unsigned long flags; unsigned long flags;
bool do_it = false;
spin_lock_irqsave(&count_lock, flags); spin_lock_irqsave(&count_lock, flags);
count--; count--;
@ -361,10 +362,13 @@ static void lkdtm_handler(void)
cp_name_to_str(cpoint), cp_type_to_str(cptype), count); cp_name_to_str(cpoint), cp_type_to_str(cptype), count);
if (count == 0) { if (count == 0) {
lkdtm_do_action(cptype); do_it = true;
count = cpoint_count; count = cpoint_count;
} }
spin_unlock_irqrestore(&count_lock, flags); spin_unlock_irqrestore(&count_lock, flags);
if (do_it)
lkdtm_do_action(cptype);
} }
static int lkdtm_register_cpoint(enum cname which) static int lkdtm_register_cpoint(enum cname which)