Re: [PATCH net] hv_netvsc: Fix napi reschedule while receive completion is busy

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon,  9 Jul 2018 16:43:19 +0000
Haiyang Zhang <haiyangz@xxxxxxxxxxxxxxxxx> wrote:

> From: Haiyang Zhang <haiyangz@xxxxxxxxxxxxx>
> 
> 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 <haiyangz@xxxxxxxxxxxxx>

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
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel



[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux