diff mbox series

[V2] remoteproc: virtio: Fix wdg cannot recovery remote processor

Message ID 20231215145023.2248366-1-joakim.zhang@cixtech.com (mailing list archive)
State Superseded
Headers show
Series [V2] remoteproc: virtio: Fix wdg cannot recovery remote processor | expand

Commit Message

Joakim Zhang Dec. 15, 2023, 2:50 p.m. UTC
From: Joakim Zhang <joakim.zhang@cixtech.com>

Recovery remote processor failed when wdg irq received:
[    0.842574] remoteproc remoteproc0: crash detected in cix-dsp-rproc: type watchdog
[    0.842750] remoteproc remoteproc0: handling crash #1 in cix-dsp-rproc
[    0.842824] remoteproc remoteproc0: recovering cix-dsp-rproc
[    0.843342] remoteproc remoteproc0: stopped remote processor cix-dsp-rproc
[    0.847901] rproc-virtio rproc-virtio.0.auto: Failed to associate buffer
[    0.847979] remoteproc remoteproc0: failed to probe subdevices for cix-dsp-rproc: -16

The reason is that dma coherent mem would not be released when
recovering the remote processor, due to rproc_virtio_remove()
would not be called, where the mem released. It will fail when
it try to allocate and associate buffer again.

We can see that dma coherent mem allocated from rproc_add_virtio_dev(),
so should release it from rproc_remove_virtio_dev(). These functions should
appear symmetrically:
-rproc_vdev_do_start()->rproc_add_virtio_dev()->dma_declare_coherent_memory()
-rproc_vdev_do_stop()->rproc_remove_virtio_dev()->dma_release_coherent_memory()

The same for of_reserved_mem_device_init_by_idx() and of_reserved_mem_device_release().

Fixes: 1d7b61c06dc3 ("remoteproc: virtio: Create platform device for the remoteproc_virtio")
Signed-off-by: Joakim Zhang <joakim.zhang@cixtech.com>
---
ChangeLogs:
V1->V2:
	* the same for of_reserved_mem_device_release()
---
 drivers/remoteproc/remoteproc_virtio.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

Comments

Arnaud POULIQUEN Dec. 15, 2023, 4:55 p.m. UTC | #1
Hello  Joakim,

On 12/15/23 15:50, joakim.zhang@cixtech.com wrote:
> From: Joakim Zhang <joakim.zhang@cixtech.com>
> 
> Recovery remote processor failed when wdg irq received:
> [    0.842574] remoteproc remoteproc0: crash detected in cix-dsp-rproc: type watchdog
> [    0.842750] remoteproc remoteproc0: handling crash #1 in cix-dsp-rproc
> [    0.842824] remoteproc remoteproc0: recovering cix-dsp-rproc
> [    0.843342] remoteproc remoteproc0: stopped remote processor cix-dsp-rproc
> [    0.847901] rproc-virtio rproc-virtio.0.auto: Failed to associate buffer
> [    0.847979] remoteproc remoteproc0: failed to probe subdevices for cix-dsp-rproc: -16
> 
> The reason is that dma coherent mem would not be released when
> recovering the remote processor, due to rproc_virtio_remove()
> would not be called, where the mem released. It will fail when
> it try to allocate and associate buffer again.
> 
> We can see that dma coherent mem allocated from rproc_add_virtio_dev(),
> so should release it from rproc_remove_virtio_dev(). These functions should
> appear symmetrically:
> -rproc_vdev_do_start()->rproc_add_virtio_dev()->dma_declare_coherent_memory()
> -rproc_vdev_do_stop()->rproc_remove_virtio_dev()->dma_release_coherent_memory()
> 
> The same for of_reserved_mem_device_init_by_idx() and of_reserved_mem_device_release().
> 
> Fixes: 1d7b61c06dc3 ("remoteproc: virtio: Create platform device for the remoteproc_virtio")
> Signed-off-by: Joakim Zhang <joakim.zhang@cixtech.com>
> ---
> ChangeLogs:
> V1->V2:
>         * the same for of_reserved_mem_device_release()
> ---
>  drivers/remoteproc/remoteproc_virtio.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
> index 83d76915a6ad..e877ee78740d 100644
> --- a/drivers/remoteproc/remoteproc_virtio.c
> +++ b/drivers/remoteproc/remoteproc_virtio.c
> @@ -465,8 +465,12 @@ static int rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id)
>  static int rproc_remove_virtio_dev(struct device *dev, void *data)
>  {
>         struct virtio_device *vdev = dev_to_virtio(dev);
> +       struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
> 
>         unregister_virtio_device(vdev);
> +       of_reserved_mem_device_release(&rvdev->pdev->dev);
> +       dma_release_coherent_memory(&rvdev->pdev->dev);
> +

At this step, the virtio device may not be released and may still be using the
memory.
Do you try to move this in rproc_virtio_dev_release?

Regards,
Arnaud

>         return 0;
>  }
> 
> @@ -584,9 +588,6 @@ static void rproc_virtio_remove(struct platform_device *pdev)
>         rproc_remove_subdev(rproc, &rvdev->subdev);
>         rproc_remove_rvdev(rvdev);
> 
> -       of_reserved_mem_device_release(&pdev->dev);
> -       dma_release_coherent_memory(&pdev->dev);
> -
>         put_device(&rproc->dev);
>  }
> 
> --
> 2.25.1
> 
> 
> 
> This email (including its attachments) is intended only for the person or entity to which it is addressed and may contain information that is privileged, confidential or otherwise protected from disclosure. Unauthorized use, dissemination, distribution or copying of this email or the information herein or taking any action in reliance on the contents of this email or the information herein, by anyone other than the intended recipient, or an employee or agent responsible for delivering the message to the intended recipient, is strictly prohibited. If you are not the intended recipient, please do not read, copy, use or disclose any part of this e-mail to others. Please notify the sender immediately and permanently delete this e-mail and any attachments if you received it in error. Internet communications cannot be guaranteed to be timely, secure, error-free or virus-free. The sender does not accept liability for any errors or omissions.
Joakim Zhang Dec. 17, 2023, 5:26 a.m. UTC | #2
Hello Arnaud,

> -----Original Message-----
> From: Arnaud POULIQUEN <arnaud.pouliquen@foss.st.com>
> Sent: Saturday, December 16, 2023 12:56 AM
> To: Joakim Zhang <joakim.zhang@cixtech.com>; andersson@kernel.org;
> mathieu.poirier@linaro.org
> Cc: linux-remoteproc@vger.kernel.org; linux-kernel@vger.kernel.org; cix-
> kernel-upstream <cix-kernel-upstream@cixtech.com>
> Subject: Re: [PATCH V2] remoteproc: virtio: Fix wdg cannot recovery remote
> processor
> 
> Hello  Joakim,
> 
> On 12/15/23 15:50, joakim.zhang@cixtech.com wrote:
> > From: Joakim Zhang <joakim.zhang@cixtech.com>
> >
> > Recovery remote processor failed when wdg irq received:
> > [    0.842574] remoteproc remoteproc0: crash detected in cix-dsp-rproc:
> type watchdog
> > [    0.842750] remoteproc remoteproc0: handling crash #1 in cix-dsp-rproc
> > [    0.842824] remoteproc remoteproc0: recovering cix-dsp-rproc
> > [    0.843342] remoteproc remoteproc0: stopped remote processor cix-dsp-
> rproc
> > [    0.847901] rproc-virtio rproc-virtio.0.auto: Failed to associate buffer
> > [    0.847979] remoteproc remoteproc0: failed to probe subdevices for cix-
> dsp-rproc: -16
> >
> > The reason is that dma coherent mem would not be released when
> > recovering the remote processor, due to rproc_virtio_remove() would
> > not be called, where the mem released. It will fail when it try to
> > allocate and associate buffer again.
> >
> > We can see that dma coherent mem allocated from
> > rproc_add_virtio_dev(), so should release it from
> > rproc_remove_virtio_dev(). These functions should appear symmetrically:
> > -rproc_vdev_do_start()->rproc_add_virtio_dev()-
> >dma_declare_coherent_m
> > emory()
> > -rproc_vdev_do_stop()->rproc_remove_virtio_dev()-
> >dma_release_coherent
> > _memory()
> >
> > The same for of_reserved_mem_device_init_by_idx() and
> of_reserved_mem_device_release().
> >
> > Fixes: 1d7b61c06dc3 ("remoteproc: virtio: Create platform device for
> > the remoteproc_virtio")
> > Signed-off-by: Joakim Zhang <joakim.zhang@cixtech.com>
> > ---
> > ChangeLogs:
> > V1->V2:
> >         * the same for of_reserved_mem_device_release()
> > ---
> >  drivers/remoteproc/remoteproc_virtio.c | 7 ++++---
> >  1 file changed, 4 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/remoteproc/remoteproc_virtio.c
> > b/drivers/remoteproc/remoteproc_virtio.c
> > index 83d76915a6ad..e877ee78740d 100644
> > --- a/drivers/remoteproc/remoteproc_virtio.c
> > +++ b/drivers/remoteproc/remoteproc_virtio.c
> > @@ -465,8 +465,12 @@ static int rproc_add_virtio_dev(struct rproc_vdev
> > *rvdev, int id)  static int rproc_remove_virtio_dev(struct device
> > *dev, void *data)  {
> >         struct virtio_device *vdev = dev_to_virtio(dev);
> > +       struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
> >
> >         unregister_virtio_device(vdev);
> > +       of_reserved_mem_device_release(&rvdev->pdev->dev);
> > +       dma_release_coherent_memory(&rvdev->pdev->dev);
> > +
> 
> At this step, the virtio device may not be released and may still be using the
> memory.
> Do you try to move this in rproc_virtio_dev_release?

Oh, yes, thanks for the hint, I tested, and it can fix the issue, I will send v3 soon.

Joakim
> Regards,
> Arnaud
> 
> >         return 0;
> >  }
> >
> > @@ -584,9 +588,6 @@ static void rproc_virtio_remove(struct
> platform_device *pdev)
> >         rproc_remove_subdev(rproc, &rvdev->subdev);
> >         rproc_remove_rvdev(rvdev);
> >
> > -       of_reserved_mem_device_release(&pdev->dev);
> > -       dma_release_coherent_memory(&pdev->dev);
> > -
> >         put_device(&rproc->dev);
> >  }
> >
> > --
> > 2.25.1
diff mbox series

Patch

diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c
index 83d76915a6ad..e877ee78740d 100644
--- a/drivers/remoteproc/remoteproc_virtio.c
+++ b/drivers/remoteproc/remoteproc_virtio.c
@@ -465,8 +465,12 @@  static int rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id)
 static int rproc_remove_virtio_dev(struct device *dev, void *data)
 {
 	struct virtio_device *vdev = dev_to_virtio(dev);
+	struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
 
 	unregister_virtio_device(vdev);
+	of_reserved_mem_device_release(&rvdev->pdev->dev);
+	dma_release_coherent_memory(&rvdev->pdev->dev);
+
 	return 0;
 }
 
@@ -584,9 +588,6 @@  static void rproc_virtio_remove(struct platform_device *pdev)
 	rproc_remove_subdev(rproc, &rvdev->subdev);
 	rproc_remove_rvdev(rvdev);
 
-	of_reserved_mem_device_release(&pdev->dev);
-	dma_release_coherent_memory(&pdev->dev);
-
 	put_device(&rproc->dev);
 }