Re: [PATCH v2 1/3] EDAC/versalnet: Fix teardown ordering in mc_remove()

Prasanna Kumar T S M <[email protected]> Thu, 9 Jul 2026 12:02:14 +0530
Newsgroups org.kernel.vger.linux-edac,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
Hi Shubrajyoti,

On 08-06-2026 16:41, Shubhrajyoti Datta wrote:
> On Wed, Apr 1, 2026 at 4:56 PM Prasanna Kumar T S M
> <[email protected]> wrote:
>>
>> The teardown sequence in mc_remove() does not mirror the reverse of the
>> initialization order in mc_probe(). In particular,
>> unregister_rpmsg_driver() is called before remove_versalnet(), and
>> cdx_mcdi_finish() is called after rproc_shutdown().
>>
>> Reorder mc_remove() to reverse the probe initialization sequence,
>> consistent with the probe error-unwind paths.
> 
> I think that the remote proc should be quiescence first so that no
> more messages will be
> queued. and then the edac should be removed. See below.
> 
>>
>> The rproc reference acquired via rproc_get_by_phandle() during probe
>> is not released in mc_remove(), causing a reference count leak. Add
>> the missing rproc_put() call.
>>
>> Fixes: d5fe2fec6c40 ("EDAC: Add a driver for the AMD Versal NET DDR controller")
>> Signed-off-by: Prasanna Kumar T S M <[email protected]>
>> ---
>>   drivers/edac/versalnet_edac.c | 5 +++--
>>   1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/edac/versalnet_edac.c b/drivers/edac/versalnet_edac.c
>> index b87fe57aa842..acd51b492772 100644
>> --- a/drivers/edac/versalnet_edac.c
>> +++ b/drivers/edac/versalnet_edac.c
>> @@ -955,10 +955,11 @@ static void mc_remove(struct platform_device *pdev)
>>   {
>>          struct mc_priv *priv = platform_get_drvdata(pdev);
>>
>> -       unregister_rpmsg_driver(&amd_rpmsg_driver);
>>          remove_versalnet(priv);
> 
> Here we are removing the edac but the remoteproc  can be triggered.
> calling the remote callback.

Thanks for the review.

This suggests that my change is not complete. I am not sufficiently 
familiar with this area to provide a correct fix, so I will leave it to 
someone more knowledgeable.

> 
>> -       rproc_shutdown(priv->mcdi->r5_rproc);
>>          cdx_mcdi_finish(priv->mcdi);
>> +       unregister_rpmsg_driver(&amd_rpmsg_driver);
>> +       rproc_shutdown(priv->mcdi->r5_rproc);
>> +       rproc_put(priv->mcdi->r5_rproc);
> The put is a valid fix.
> 
>>          kfree(priv->mcdi);
>>   }
>>
>> --
>> 2.49.0
>>
>>

Thanks,
Prasanna