2019-09-26 09:59:15

by Dexuan Cui

[permalink] [raw]
Subject: [PATCH v2] 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 <[email protected]>
Acked-by: Martin K. Petersen <[email protected]>

---

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. :-)

No other change.


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


2019-09-26 10:02:36

by kernel test robot

[permalink] [raw]
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 https://stackoverflow.com/a/37406982]

url: https://github.com/0day-ci/linux/commits/Dexuan-Cui/scsi-storvsc-Add-the-support-of-hibernation/20190926-041702
base: https://kernel.googlesource.com/pub/scm/linux/kernel/git/mkp/scsi.git for-next
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 <[email protected]>

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,
^~~~~~~
>> drivers//scsi/storvsc_drv.c:1981:13: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
.suspend = storvsc_suspend,
^~~~~~~~~~~~~~~
drivers//scsi/storvsc_drv.c:1981:13: note: (near initialization for 'storvsc_drv.shutdown')
>> drivers//scsi/storvsc_drv.c:1982:3: error: 'struct hv_driver' has no member named 'resume'; did you mean 'remove'?
.resume = storvsc_resume,
^~~~~~
remove
drivers//scsi/storvsc_drv.c:1982:12: warning: excess elements in struct initializer
.resume = storvsc_resume,
^~~~~~~~~~~~~~
drivers//scsi/storvsc_drv.c:1982:12: note: (near initialization for 'storvsc_drv')
cc1: some warnings being treated as errors

vim +1981 drivers//scsi/storvsc_drv.c

1975
1976 static struct hv_driver storvsc_drv = {
1977 .name = KBUILD_MODNAME,
1978 .id_table = id_table,
1979 .probe = storvsc_probe,
1980 .remove = storvsc_remove,
> 1981 .suspend = storvsc_suspend,
> 1982 .resume = storvsc_resume,
1983 .driver = {
1984 .probe_type = PROBE_PREFER_ASYNCHRONOUS,
1985 },
1986 };
1987

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation


Attachments:
(No filename) (2.34 kB)
.config.gz (42.53 kB)
Download all attachments

2019-09-26 10:03:14

by Dexuan Cui

[permalink] [raw]
Subject: RE: [PATCH v2] scsi: storvsc: Add the support of hibernation

> From: kbuild test robot <[email protected]>
> Sent: Wednesday, September 25, 2019 2:55 PM
> To: Dexuan Cui <[email protected]>
> Cc: [email protected]; KY Srinivasan <[email protected]>; Haiyang Zhang
> <[email protected]>; Stephen Hemminger
> <[email protected]>; [email protected]; [email protected];
> [email protected]; [email protected];
> [email protected]; [email protected]; Michael Kelley
> <[email protected]>; Dexuan Cui <[email protected]>
> 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 <[email protected]>
>
> 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

2019-10-01 18:53:36

by Sasha Levin

[permalink] [raw]
Subject: Re: [PATCH v2] scsi: storvsc: Add the support of hibernation

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 <[email protected]>
>Acked-by: Martin K. Petersen <[email protected]>
>
>---
>
>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