|
@@ -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)
|
|
@@ -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);
|