diff --git a/mm/kmemleak.c b/mm/kmemleak.c index b78861b8e013..ad79faf7d4d0 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -1859,6 +1859,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 @@ -1867,6 +1868,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(); } }