Commit 2fc1b5dd authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

dst: call cond_resched() in dst_gc_task()

Kernel bugzilla #15239

On some workloads, it is quite possible to get a huge dst list to
process in dst_gc_task(), and trigger soft lockup detection.

Fix is to call cond_resched(), as we run in process context.
Reported-by: default avatarPawel Staszewski <pstaszewski@itcare.pl>
Tested-by: default avatarPawel Staszewski <pstaszewski@itcare.pl>
Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d696c7bd
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/types.h> #include <linux/types.h>
#include <net/net_namespace.h> #include <net/net_namespace.h>
#include <linux/sched.h>
#include <net/dst.h> #include <net/dst.h>
...@@ -79,6 +80,7 @@ static void dst_gc_task(struct work_struct *work) ...@@ -79,6 +80,7 @@ static void dst_gc_task(struct work_struct *work)
while ((dst = next) != NULL) { while ((dst = next) != NULL) {
next = dst->next; next = dst->next;
prefetch(&next->next); prefetch(&next->next);
cond_resched();
if (likely(atomic_read(&dst->__refcnt))) { if (likely(atomic_read(&dst->__refcnt))) {
last->next = dst; last->next = dst;
last = dst; last = dst;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment