On Mon,  9 Jul 2018 16:43:19 +0000
Haiyang Zhang <haiya...@linuxonhyperv.com> wrote:

> From: Haiyang Zhang <haiya...@microsoft.com>
> 
> If out ring is full temporarily and receive completion cannot go out,
> we may still need to reschedule napi if other conditions are met.
> Otherwise the napi poll might be stopped forever, and cause network
> disconnect.
> 
> Fixes: 7426b1a51803 ("netvsc: optimize receive completions")
> Signed-off-by: Haiyang Zhang <haiya...@microsoft.com>

Maybe call reschedule?

diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
index 8e9d0ee1572b..b5e92342e422 100644
--- a/drivers/net/hyperv/netvsc.c
+++ b/drivers/net/hyperv/netvsc.c
@@ -1285,14 +1285,20 @@ int netvsc_poll(struct napi_struct *napi, int budget)
                nvchan->desc = hv_pkt_iter_next(channel, nvchan->desc);
        }
 
-       /* If send of pending receive completions suceeded
-        *   and did not exhaust NAPI budget this time
+       /* If all the receive completions could not be sent,
+        * then we want to be scheduled again.
+        */
+       if (unlikely(send_recv_completions(ndev, net_device, nvchan))) {
+               napi_reschedule(napi);
+               goto out;
+       }
+
+       /* if did not exhaust NAPI budget this time
         *   and not doing busy poll
         * then re-enable host interrupts
         *     and reschedule if ring is not empty.
         */
-       if (send_recv_completions(ndev, net_device, nvchan) == 0 &&
-           work_done < budget &&
+       if (work_done < budget &&
            napi_complete_done(napi, work_done) &&
            hv_end_read(&channel->inbound) &&
            napi_schedule_prep(napi)) {
@@ -1300,6 +1306,7 @@ int netvsc_poll(struct napi_struct *napi, int budget)
                __napi_schedule(napi);
        }
 
+out:
        /* Driver may overshoot since multiple packets per descriptor */
        return min(work_done, budget);
 }


_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to