From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mohammed Gamal Subject: [RFC PATCH 2/2] hv_netvsc: Change GPADL teardown order according to Hyper-V version Date: Tue, 23 Jan 2018 10:34:05 +0100 Message-ID: <1516700045-32142-3-git-send-email-mgamal@redhat.com> References: <1516700045-32142-1-git-send-email-mgamal@redhat.com> Cc: linux-kernel@vger.kernel.org, devel@linuxdriverproject.org, kys@microsoft.com, haiyangz@microsoft.com, sthemmin@microsoft.com, vkuznets@redhat.com, cavery@redhat.com, otubo@redhat.com, Mohammed Gamal To: netdev@vger.kernel.org Return-path: In-Reply-To: <1516700045-32142-1-git-send-email-mgamal@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-Id: netdev.vger.kernel.org Commit 0cf737808ae7 ("hv_netvsc: netvsc_teardown_gpadl() split") introduced a regression causing VMs not to shutdown on pre-Wind2016 hosts after netvsc_remove_device() is called. This was caused as the GPADL teardown sequence was changed. This patch restores the old behavior for pre-Win2016 hosts, while keeping the changes from 0cf7378 for Win2016 and higher hosts. Signed-off-by: Mohammed Gamal --- drivers/net/hyperv/netvsc.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index 3982f76..d09bb3b 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c @@ -575,8 +575,17 @@ void netvsc_device_remove(struct hv_device *device) cancel_work_sync(&net_device->subchan_work); + /* + * Revoke receive buffer. If host is pre-Win2016 then tear down + * receive buffer GPADL. Do the same for send buffer. + */ netvsc_revoke_recv_buf(device, net_device); + if (vmbus_proto_version < VERSION_WIN10) + netvsc_teardown_recv_buf_gpadl(device, net_device); + netvsc_revoke_send_buf(device, net_device); + if (vmbus_proto_version < VERSION_WIN10) + netvsc_teardown_send_buf_gpadl(device, net_device); RCU_INIT_POINTER(net_device_ctx->nvdev, NULL); @@ -589,8 +598,14 @@ void netvsc_device_remove(struct hv_device *device) /* Now, we can close the channel safely */ vmbus_close(device->channel); - netvsc_teardown_recv_buf_gpadl(device, net_device); - netvsc_teardown_send_buf_gpadl(device, net_device); + /* + * If host is Win2016 or higher then we do the GPADL tear down + * here after VMBus is closed, instead of doing it earlier. + */ + if (vmbus_proto_version >= VERSION_WIN10) { + netvsc_teardown_recv_buf_gpadl(device, net_device); + netvsc_teardown_send_buf_gpadl(device, net_device); + } /* And dissassociate NAPI context from device */ for (i = 0; i < net_device->num_chn; i++) -- 1.8.3.1