> From: Haiyang Zhang <haiyangz@xxxxxxxxxxxxx> > Sent: Thursday, September 12, 2019 6:50 AM > > -----Original Message----- > > From: Dexuan Cui <decui@xxxxxxxxxxxxx> > > Sent: Wednesday, September 11, 2019 7:38 PM > > +static int netvsc_suspend(struct hv_device *dev) > > +{ > > + struct net_device_context *ndev_ctx; > > + struct net_device *vf_netdev, *net; > > + struct netvsc_device *nvdev; > > + int ret; > > + > > + net = hv_get_drvdata(dev); > > + > > + ndev_ctx = netdev_priv(net); > > + cancel_delayed_work_sync(&ndev_ctx->dwork); > > + > > + rtnl_lock(); > > + > > + nvdev = rtnl_dereference(ndev_ctx->nvdev); > > + if (nvdev == NULL) { > > + ret = -ENODEV; > > + goto out; > > + } > > + > > + cancel_work_sync(&nvdev->subchan_work); > > This looks redundant because netvsc_detach() cancels subchan_work. > - Haiyang You are right. I'll remove the superflous line cancel_work_sync(&nvdev->subchan_work); in netvsc_suspend() in v2. I'll wait for a few days before posting v2, in case people may have other comments. Thanks, -- Dexuan