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:
Родитель
99f02ef1f1
Коммит
92618184cb
|
@ -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)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче