aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/hyperv/netvsc_drv.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index 2d3cdb026a99..bc05c895d958 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -859,15 +859,22 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu)
859 if (ret) 859 if (ret)
860 goto out; 860 goto out;
861 861
862 memset(&device_info, 0, sizeof(device_info));
863 device_info.ring_size = ring_size;
864 device_info.num_chn = nvdev->num_chn;
865 device_info.max_num_vrss_chns = nvdev->num_chn;
866
862 ndevctx->start_remove = true; 867 ndevctx->start_remove = true;
863 rndis_filter_device_remove(hdev, nvdev); 868 rndis_filter_device_remove(hdev, nvdev);
864 869
870 /* 'nvdev' has been freed in rndis_filter_device_remove() ->
871 * netvsc_device_remove () -> free_netvsc_device().
872 * We mustn't access it before it's re-created in
873 * rndis_filter_device_add() -> netvsc_device_add().
874 */
875
865 ndev->mtu = mtu; 876 ndev->mtu = mtu;
866 877
867 memset(&device_info, 0, sizeof(device_info));
868 device_info.ring_size = ring_size;
869 device_info.num_chn = nvdev->num_chn;
870 device_info.max_num_vrss_chns = nvdev->num_chn;
871 rndis_filter_device_add(hdev, &device_info); 878 rndis_filter_device_add(hdev, &device_info);
872 879
873out: 880out: