Message ID | 1569442244-16726-1-git-send-email-decui@microsoft.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | [v2] scsi: storvsc: Add the support of hibernation | expand |
> From: kbuild test robot <lkp@intel.com> > Sent: Wednesday, September 25, 2019 2:55 PM > To: Dexuan Cui <decui@microsoft.com> > Cc: kbuild-all@01.org; KY Srinivasan <kys@microsoft.com>; Haiyang Zhang > <haiyangz@microsoft.com>; Stephen Hemminger > <sthemmin@microsoft.com>; sashal@kernel.org; jejb@linux.ibm.com; > martin.petersen@oracle.com; linux-hyperv@vger.kernel.org; > linux-scsi@vger.kernel.org; linux-kernel@vger.kernel.org; Michael Kelley > <mikelley@microsoft.com>; Dexuan Cui <decui@microsoft.com> > Subject: Re: [PATCH v2] scsi: storvsc: Add the support of hibernation > > Hi Dexuan, > > Thank you for the patch! Yet something to improve: > > [auto build test ERROR on mkp-scsi/for-next] > [cannot apply to v5.3 next-20190924] > [if your patch is applied to the wrong git tree, please drop us a note to help > improve the system. BTW, we also suggest to use '--base' option to specify the > base tree in git format-patch, please see > [...snipped...] > config: x86_64-rhel (attached as .config) > compiler: gcc-7 (Debian 7.4.0-13) 7.4.0 > reproduce: > # save the attached .config to linux build tree > make ARCH=x86_64 > > If you fix the issue, kindly add following tag > Reported-by: kbuild test robot <lkp@intel.com> > > All errors (new ones prefixed by >>): > > >> drivers//scsi/storvsc_drv.c:1981:3: error: 'struct hv_driver' has no member > named 'suspend' > .suspend = storvsc_suspend, > ^~~~~~~ This patch depends on the below patch in Linus's tree (today): 271b2224d42f ("Drivers: hv: vmbus: Implement suspend/resume for VSC drivers for hibernation") So, we don't really have an issue here. The mkp-scsi/for-next branch needs to do a merge with Linus's master branch. Thanks, -- Dexuan
On Wed, Sep 25, 2019 at 08:11:08PM +0000, Dexuan Cui wrote: >When we're in storvsc_suspend(), we're sure the SCSI layer has quiesced the >scsi device by scsi_bus_suspend() -> ... -> scsi_device_quiesce(), so the >low level SCSI adapter driver only needs to suspend/resume its own state. > >Signed-off-by: Dexuan Cui <decui@microsoft.com> >Acked-by: Martin K. Petersen <martin.petersen@oracle.com> > >--- > >This patch is basically a pure Hyper-V specific change and it has a >build dependency on the commit 271b2224d42f ("Drivers: hv: vmbus: Implement >suspend/resume for VSC drivers for hibernation"), which is on Sasha Levin's >Hyper-V tree's hyperv-next branch: >https://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux.git/log/?h=hyperv-next > >I request this patch should go through Sasha's tree rather than the >SCSI tree. > >In v2: > Added Acked-by from Martin. > > @Sasha: I think the patch can go through the hyper-v tree, since > we have the Ack from Martin. :-) Queued up for hyperv-next, thanks! -- Thanks, Sasha
diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c index ed8b9ac..9fbf604 100644 --- a/drivers/scsi/storvsc_drv.c +++ b/drivers/scsi/storvsc_drv.c @@ -1727,6 +1727,13 @@ enum { MODULE_DEVICE_TABLE(vmbus, id_table); +static const struct { guid_t guid; } fc_guid = { HV_SYNTHFC_GUID }; + +static bool hv_dev_is_fc(struct hv_device *hv_dev) +{ + return guid_equal(&fc_guid.guid, &hv_dev->dev_type); +} + static int storvsc_probe(struct hv_device *device, const struct hv_vmbus_device_id *dev_id) { @@ -1935,11 +1942,45 @@ static int storvsc_remove(struct hv_device *dev) return 0; } +static int storvsc_suspend(struct hv_device *hv_dev) +{ + struct storvsc_device *stor_device = hv_get_drvdata(hv_dev); + struct Scsi_Host *host = stor_device->host; + struct hv_host_device *host_dev = shost_priv(host); + + storvsc_wait_to_drain(stor_device); + + drain_workqueue(host_dev->handle_error_wq); + + vmbus_close(hv_dev->channel); + + memset(stor_device->stor_chns, 0, + num_possible_cpus() * sizeof(void *)); + + kfree(stor_device->stor_chns); + stor_device->stor_chns = NULL; + + cpumask_clear(&stor_device->alloced_cpus); + + return 0; +} + +static int storvsc_resume(struct hv_device *hv_dev) +{ + int ret; + + ret = storvsc_connect_to_vsp(hv_dev, storvsc_ringbuffer_size, + hv_dev_is_fc(hv_dev)); + return ret; +} + static struct hv_driver storvsc_drv = { .name = KBUILD_MODNAME, .id_table = id_table, .probe = storvsc_probe, .remove = storvsc_remove, + .suspend = storvsc_suspend, + .resume = storvsc_resume, .driver = { .probe_type = PROBE_PREFER_ASYNCHRONOUS, },