Re: [PATCH] scsi: storvsc: Add the support of hibernation
On Fri, Sep 13, 2019 at 06:47:38PM -0400, Martin K. Petersen wrote: Dexuan, 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. Acked-by: Martin K. Petersen Queued up for hyperv-next, thanks! -- Thanks, Sasha
Re: [PATCH] scsi: storvsc: Add the support of hibernation
Dexuan, > 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. Acked-by: Martin K. Petersen -- Martin K. Petersen Oracle Linux Engineering
RE: [PATCH] scsi: storvsc: Add the support of hibernation
> From: linux-scsi-ow...@vger.kernel.org > On Behalf Of kbuild test robot > Sent: Thursday, September 12, 2019 1:54 PM > To: Dexuan Cui > Cc: kbuild-...@01.org; KY Srinivasan ; Haiyang Zhang > ; Stephen Hemminger > ; sas...@kernel.org; j...@linux.ibm.com; > martin.peter...@oracle.com; linux-hyp...@vger.kernel.org; > linux-s...@vger.kernel.org; linux-kernel@vger.kernel.org; Michael Kelley > ; Dexuan Cui > Subject: Re: [PATCH] scsi: storvsc: Add the support of hibernation > > Hi Dexuan, > > Thank you for the patch! Yet something to improve: > > [auto build test ERROR on linus/master] > [cannot apply to v5.3-rc8 next-20190904] > [if your patch is applied to the wrong git tree, please drop us a note to help > improve the system] > > >> drivers//scsi/storvsc_drv.c:1982:3: error: 'struct hv_driver' has no member > named 'suspend' > .suspend = storvsc_suspend, > ^~~ This build failure is expected: In the patch mail, I mentioned this patch 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 Thanks, -- Dexuan
Re: [PATCH] scsi: storvsc: Add the support of hibernation
Hi Dexuan, Thank you for the patch! Yet something to improve: [auto build test ERROR on linus/master] [cannot apply to v5.3-rc8 next-20190904] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Dexuan-Cui/scsi-storvsc-Add-the-support-of-hibernation/20190912-234223 config: i386-randconfig-b004-201936 (attached as .config) compiler: gcc-7 (Debian 7.4.0-11) 7.4.0 reproduce: # save the attached .config to linux build tree make ARCH=i386 If you fix the issue, kindly add following tag Reported-by: kbuild test robot All error/warnings (new ones prefixed by >>): >> drivers//scsi/storvsc_drv.c:1982:3: error: 'struct hv_driver' has no member >> named 'suspend' .suspend = storvsc_suspend, ^~~ >> drivers//scsi/storvsc_drv.c:1982:13: error: initialization from incompatible >> pointer type [-Werror=incompatible-pointer-types] .suspend = storvsc_suspend, ^~~ drivers//scsi/storvsc_drv.c:1982:13: note: (near initialization for 'storvsc_drv.shutdown') >> drivers//scsi/storvsc_drv.c:1983:3: error: 'struct hv_driver' has no member >> named 'resume'; did you mean 'remove'? .resume = storvsc_resume, ^~ remove >> drivers//scsi/storvsc_drv.c:1983:12: warning: excess elements in struct >> initializer .resume = storvsc_resume, ^~ drivers//scsi/storvsc_drv.c:1983:12: note: (near initialization for 'storvsc_drv') cc1: some warnings being treated as errors vim +1982 drivers//scsi/storvsc_drv.c 1976 1977 static struct hv_driver storvsc_drv = { 1978 .name = KBUILD_MODNAME, 1979 .id_table = id_table, 1980 .probe = storvsc_probe, 1981 .remove = storvsc_remove, > 1982 .suspend = storvsc_suspend, > 1983 .resume = storvsc_resume, 1984 .driver = { 1985 .probe_type = PROBE_PREFER_ASYNCHRONOUS, 1986 }, 1987 }; 1988 --- 0-DAY kernel test infrastructureOpen Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation .config.gz Description: application/gzip
[PATCH] scsi: storvsc: Add the support of hibernation
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 --- 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. drivers/scsi/storvsc_drv.c | 41 + 1 file changed, 41 insertions(+) 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, }, -- 1.8.3.1