mirror of https://gitee.com/openkylin/linux.git
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: Pawel Staszewski <pstaszewski@itcare.pl> Tested-by: Pawel Staszewski <pstaszewski@itcare.pl> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d696c7bdaa
commit
2fc1b5dd99
|
@ -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)
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue