Skip to content

Commit

Permalink
hv_netvsc: Fix napi reschedule while receive completion is busy
Browse files Browse the repository at this point in the history
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: 7426b1a ("netvsc: optimize receive completions")
Signed-off-by: Stephen Hemminger <[email protected]>
Signed-off-by: Haiyang Zhang <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
haiyangz authored and davem330 committed Jul 18, 2018
1 parent a2ec9d1 commit 6b81b19
Showing 1 changed file with 10 additions and 7 deletions.
17 changes: 10 additions & 7 deletions drivers/net/hyperv/netvsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1274,6 +1274,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)
Expand All @@ -1285,16 +1286,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);
Expand Down

0 comments on commit 6b81b19

Please sign in to comment.