diff mbox series

[v3] virtio_pmem: Check device status before requesting flush

Message ID 20240826215313.2673566-1-philipchen@chromium.org (mailing list archive)
State Handled Elsewhere, archived
Delegated to: Ira Weiny
Headers show
Series [v3] virtio_pmem: Check device status before requesting flush | expand

Commit Message

Philip Chen Aug. 26, 2024, 9:53 p.m. UTC
If a pmem device is in a bad status, the driver side could wait for
host ack forever in virtio_pmem_flush(), causing the system to hang.

So add a status check in the beginning of virtio_pmem_flush() to return
early if the device is not activated.

Signed-off-by: Philip Chen <philipchen@chromium.org>
---
v3:
- Fix a typo in the comment (s/acticated/activated/)

v2:
- Remove change id from the patch description
- Add more details to the patch description

 drivers/nvdimm/nd_virtio.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Pankaj Gupta Sept. 9, 2024, 1:26 p.m. UTC | #1
+CC MST

> If a pmem device is in a bad status, the driver side could wait for
> host ack forever in virtio_pmem_flush(), causing the system to hang.
>
> So add a status check in the beginning of virtio_pmem_flush() to return
> early if the device is not activated.
>
> Signed-off-by: Philip Chen <philipchen@chromium.org>

Looks good to me.

Acked-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com

> ---
> v3:
> - Fix a typo in the comment (s/acticated/activated/)
>
> v2:
> - Remove change id from the patch description
> - Add more details to the patch description
>
>  drivers/nvdimm/nd_virtio.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
>
> diff --git a/drivers/nvdimm/nd_virtio.c b/drivers/nvdimm/nd_virtio.c
> index 35c8fbbba10e..f55d60922b87 100644
> --- a/drivers/nvdimm/nd_virtio.c
> +++ b/drivers/nvdimm/nd_virtio.c
> @@ -44,6 +44,15 @@ static int virtio_pmem_flush(struct nd_region *nd_region)
>         unsigned long flags;
>         int err, err1;
>
> +       /*
> +        * Don't bother to submit the request to the device if the device is
> +        * not activated.
> +        */
> +       if (vdev->config->get_status(vdev) & VIRTIO_CONFIG_S_NEEDS_RESET) {
> +               dev_info(&vdev->dev, "virtio pmem device needs a reset\n");
> +               return -EIO;
> +       }
> +
>         might_sleep();
>         req_data = kmalloc(sizeof(*req_data), GFP_KERNEL);
>         if (!req_data)
diff mbox series

Patch

diff --git a/drivers/nvdimm/nd_virtio.c b/drivers/nvdimm/nd_virtio.c
index 35c8fbbba10e..f55d60922b87 100644
--- a/drivers/nvdimm/nd_virtio.c
+++ b/drivers/nvdimm/nd_virtio.c
@@ -44,6 +44,15 @@  static int virtio_pmem_flush(struct nd_region *nd_region)
 	unsigned long flags;
 	int err, err1;
 
+	/*
+	 * Don't bother to submit the request to the device if the device is
+	 * not activated.
+	 */
+	if (vdev->config->get_status(vdev) & VIRTIO_CONFIG_S_NEEDS_RESET) {
+		dev_info(&vdev->dev, "virtio pmem device needs a reset\n");
+		return -EIO;
+	}
+
 	might_sleep();
 	req_data = kmalloc(sizeof(*req_data), GFP_KERNEL);
 	if (!req_data)