From: Greg Kroah-Hartman Date: Tue, 18 Jul 2017 07:38:45 +0000 (+0200) Subject: 4.9-stable patches X-Git-Tag: v4.12.3~31 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f979a5ac584bd914e4a9cf31ee807990d00c773c;p=thirdparty%2Fkernel%2Fstable-queue.git 4.9-stable patches added patches: series xen-netfront-rework-the-fix-for-rx-stall-during-oom-and-network-stress.patch --- diff --git a/queue-4.9/series b/queue-4.9/series new file mode 100644 index 00000000000..66b41553f86 --- /dev/null +++ b/queue-4.9/series @@ -0,0 +1 @@ +xen-netfront-rework-the-fix-for-rx-stall-during-oom-and-network-stress.patch diff --git a/queue-4.9/xen-netfront-rework-the-fix-for-rx-stall-during-oom-and-network-stress.patch b/queue-4.9/xen-netfront-rework-the-fix-for-rx-stall-during-oom-and-network-stress.patch new file mode 100644 index 00000000000..ab2d5be0aee --- /dev/null +++ b/queue-4.9/xen-netfront-rework-the-fix-for-rx-stall-during-oom-and-network-stress.patch @@ -0,0 +1,66 @@ +From 538d92912d3190a1dd809233a0d57277459f37b2 Mon Sep 17 00:00:00 2001 +From: Vineeth Remanan Pillai +Date: Tue, 7 Feb 2017 18:59:01 +0000 +Subject: xen-netfront: Rework the fix for Rx stall during OOM and network stress + +From: Vineeth Remanan Pillai + +commit 538d92912d3190a1dd809233a0d57277459f37b2 upstream. + +The commit 90c311b0eeea ("xen-netfront: Fix Rx stall during network +stress and OOM") caused the refill timer to be triggerred almost on +all invocations of xennet_alloc_rx_buffers for certain workloads. +This reworks the fix by reverting to the old behaviour and taking into +consideration the skb allocation failure. Refill timer is now triggered +on insufficient requests or skb allocation failure. + +Signed-off-by: Vineeth Remanan Pillai +Fixes: 90c311b0eeea (xen-netfront: Fix Rx stall during network stress and OOM) +Reported-by: Boris Ostrovsky +Reviewed-by: Boris Ostrovsky +Signed-off-by: David S. Miller +Cc: Eduardo Valentin +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/xen-netfront.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +--- a/drivers/net/xen-netfront.c ++++ b/drivers/net/xen-netfront.c +@@ -281,6 +281,7 @@ static void xennet_alloc_rx_buffers(stru + { + RING_IDX req_prod = queue->rx.req_prod_pvt; + int notify; ++ int err = 0; + + if (unlikely(!netif_carrier_ok(queue->info->netdev))) + return; +@@ -295,8 +296,10 @@ static void xennet_alloc_rx_buffers(stru + struct xen_netif_rx_request *req; + + skb = xennet_alloc_one_rx_buffer(queue); +- if (!skb) ++ if (!skb) { ++ err = -ENOMEM; + break; ++ } + + id = xennet_rxidx(req_prod); + +@@ -320,8 +323,13 @@ static void xennet_alloc_rx_buffers(stru + + queue->rx.req_prod_pvt = req_prod; + +- /* Not enough requests? Try again later. */ +- if (req_prod - queue->rx.sring->req_prod < NET_RX_SLOTS_MIN) { ++ /* Try again later if there are not enough requests or skb allocation ++ * failed. ++ * Enough requests is quantified as the sum of newly created slots and ++ * the unconsumed slots at the backend. ++ */ ++ if (req_prod - queue->rx.rsp_cons < NET_RX_SLOTS_MIN || ++ unlikely(err)) { + mod_timer(&queue->rx_refill_timer, jiffies + (HZ/10)); + return; + }