diff mbox series

virtio_pmem: Check device status before requesting flush

Message ID 20240815005704.2331005-1-philipchen@chromium.org (mailing list archive)
State Superseded
Headers show
Series virtio_pmem: Check device status before requesting flush | expand

Commit Message

Philip Chen Aug. 15, 2024, 12:57 a.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.

Signed-off-by: Philip Chen <philipchen@chromium.org>
---
 drivers/nvdimm/nd_virtio.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Ira Weiny Aug. 19, 2024, 9:56 p.m. UTC | #1
Philip Chen wrote:
> 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.

I assume this was supposed to be v2 and you resent this as a proper v2
with a change list from v1?

Ira

> 
> Signed-off-by: Philip Chen <philipchen@chromium.org>
> ---
>  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..3b4d07aa8447 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 send the request to the device if the device is not
> +	 * acticated.
> +	 */
> +	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)
> -- 
> 2.46.0.76.ge559c4bf1a-goog
>
Philip Chen Aug. 20, 2024, 4:16 a.m. UTC | #2
On Mon, Aug 19, 2024 at 2:56 PM Ira Weiny <ira.weiny@intel.com> wrote:
>
> Philip Chen wrote:
> > 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.
>
> I assume this was supposed to be v2 and you resent this as a proper v2
> with a change list from v1?
Ah...yes, I'll fix it and re-send it as a v2 patch.
>
> Ira
>
> >
> > Signed-off-by: Philip Chen <philipchen@chromium.org>
> > ---
> >  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..3b4d07aa8447 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 send the request to the device if the device is not
> > +      * acticated.
> > +      */
> > +     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)
> > --
> > 2.46.0.76.ge559c4bf1a-goog
> >
>
>
Ira Weiny Aug. 20, 2024, 2:23 p.m. UTC | #3
Philip Chen wrote:
> On Mon, Aug 19, 2024 at 2:56 PM Ira Weiny <ira.weiny@intel.com> wrote:
> >
> > Philip Chen wrote:
> > > 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.
> >
> > I assume this was supposed to be v2 and you resent this as a proper v2
> > with a change list from v1?
> Ah...yes, I'll fix it and re-send it as a v2 patch.

Wait didn't you already do that?  Wasn't this v2?

https://lore.kernel.org/all/20240815010337.2334245-1-philipchen@chromium.org/

Ira
Philip Chen Aug. 21, 2024, 2:46 a.m. UTC | #4
Hi,

On Tue, Aug 20, 2024 at 7:23 AM Ira Weiny <ira.weiny@intel.com> wrote:
>
> Philip Chen wrote:
> > On Mon, Aug 19, 2024 at 2:56 PM Ira Weiny <ira.weiny@intel.com> wrote:
> > >
> > > Philip Chen wrote:
> > > > 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.
> > >
> > > I assume this was supposed to be v2 and you resent this as a proper v2
> > > with a change list from v1?
> > Ah...yes, I'll fix it and re-send it as a v2 patch.
>
> Wait didn't you already do that?  Wasn't this v2?

Yes, but somehow the patch didn't go to my inbox.
(Maybe it's because there is no code change between v1 and v2?)
So I resent another v2 (with some minor change to the comment):
https://lore.kernel.org/all/20240820172256.903251-1-philipchen@chromium.org/
Please take a look.

>
> https://lore.kernel.org/all/20240815010337.2334245-1-philipchen@chromium.org/
>
> Ira
diff mbox series

Patch

diff --git a/drivers/nvdimm/nd_virtio.c b/drivers/nvdimm/nd_virtio.c
index 35c8fbbba10e..3b4d07aa8447 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 send the request to the device if the device is not
+	 * acticated.
+	 */
+	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)