ACK: [bionic/linux-azure][PATCH] hv_netvsc: Fix napi reschedule while receive completion is busy

Kamal Mostafa kamal at canonical.com
Thu Aug 16 16:41:11 UTC 2018


Acked-by: Kamal Mostafa <kamal at canonical.com>

On Thu, Aug 16, 2018 at 12:39:59PM -0300, Marcelo Henrique Cerri wrote:
> From: Haiyang Zhang <haiyangz at microsoft.com>
> 
> BugLink: http://bugs.launchpad.net/bugs/1786313
> 
> If out ring is full temporarily and receive completion cannot go out,
> we may still need to reschedule napi if certain conditions are met.
> Otherwise the napi poll might be stopped forever, and cause network
> disconnect.
> 
> Fixes: 7426b1a51803 ("netvsc: optimize receive completions")
> Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
> Signed-off-by: David S. Miller <davem at davemloft.net>
> (cherry picked from commit 6b81b193b83e87da1ea13217d684b54fccf8ee8a)
> Signed-off-by: Marcelo Henrique Cerri <marcelo.cerri at canonical.com>
> ---
>  drivers/net/hyperv/netvsc.c | 17 ++++++++++-------
>  1 file changed, 10 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
> index b500baf99eba..b2c3a28381b9 100644
> --- a/drivers/net/hyperv/netvsc.c
> +++ b/drivers/net/hyperv/netvsc.c
> @@ -1222,6 +1222,7 @@ int netvsc_poll(struct napi_struct *napi, int budget)
>  	struct hv_device *device = netvsc_channel_to_device(channel);
>  	struct net_device *ndev = hv_get_drvdata(device);
>  	int work_done = 0;
> +	int ret;
>  
>  	/* If starting a new interval */
>  	if (!nvchan->desc)
> @@ -1233,16 +1234,18 @@ 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
> -	 *   and not doing busy poll
> +	/* Send any pending receive completions */
> +	ret = send_recv_completions(ndev, net_device, nvchan);
> +
> +	/* If it did not exhaust NAPI budget this time
> +	 *  and not doing busy poll
>  	 * then re-enable host interrupts
> -	 *     and reschedule if ring is not empty.
> +	 *  and reschedule if ring is not empty
> +	 *   or sending receive completion failed.
>  	 */
> -	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) &&
> +	    (ret || hv_end_read(&channel->inbound)) &&
>  	    napi_schedule_prep(napi)) {
>  		hv_begin_read(&channel->inbound);
>  		__napi_schedule(napi);
> -- 
> 2.17.1
> 
> 
> -- 
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team




More information about the kernel-team mailing list