diff --git a/mm/kmemleak.c b/mm/kmemleak.c index 9430b2e283ca..c9c55b39bed3 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -1992,6 +1992,7 @@ static const struct file_operations kmemleak_fops = { static void __kmemleak_do_cleanup(void) { struct kmemleak_object *object, *tmp; + unsigned int cnt = 0; /* * Kmemleak has already been disabled, no need for RCU list traversal @@ -2000,6 +2001,10 @@ static void __kmemleak_do_cleanup(void) list_for_each_entry_safe(object, tmp, &object_list, object_list) { __remove_object(object); __delete_object(object); + + /* Call cond_resched() once per 64 iterations to avoid soft lockup */ + if (!(++cnt & 0x3f)) + cond_resched(); } }