remoteproc: k3: Correctly release some resources allocated in k3_rproc_request_mbox()

If an error occurs after a successful k3_rproc_request_mbox() call,
mbox_free_channel() should be called to avoid a leak.

Such a call is missing in the error handling path of k3_dsp_rproc_probe().
It is also missing both in the error handling path of k3_m4_rproc_probe()
and in the (in-existent) corresponding remove function.

Switch to managed resources to avoid these leaks and simplify the code.
Remove the now unneeded mbox_free_channel().

Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Reviewed-by: Beleswar Padhi <b-padhi@ti.com>
Tested-by: Beleswar Padhi <b-padhi@ti.com>
Link: https://lore.kernel.org/r/df853ede72e9972c464415990b196289680e6acb.1756065142.git.christophe.jaillet@wanadoo.fr
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
pull/1354/merge
Christophe JAILLET 2025-08-24 21:52:37 +02:00 committed by Mathieu Poirier
parent 3df0bee9c5
commit 2433961962
3 changed files with 12 additions and 4 deletions

View File

@ -155,11 +155,19 @@ int k3_rproc_release(struct k3_rproc *kproc)
} }
EXPORT_SYMBOL_GPL(k3_rproc_release); EXPORT_SYMBOL_GPL(k3_rproc_release);
static void k3_rproc_free_channel(void *data)
{
struct k3_rproc *kproc = data;
mbox_free_channel(kproc->mbox);
}
int k3_rproc_request_mbox(struct rproc *rproc) int k3_rproc_request_mbox(struct rproc *rproc)
{ {
struct k3_rproc *kproc = rproc->priv; struct k3_rproc *kproc = rproc->priv;
struct mbox_client *client = &kproc->client; struct mbox_client *client = &kproc->client;
struct device *dev = kproc->dev; struct device *dev = kproc->dev;
int ret;
client->dev = dev; client->dev = dev;
client->tx_done = NULL; client->tx_done = NULL;
@ -172,6 +180,10 @@ int k3_rproc_request_mbox(struct rproc *rproc)
return dev_err_probe(dev, PTR_ERR(kproc->mbox), return dev_err_probe(dev, PTR_ERR(kproc->mbox),
"mbox_request_channel failed\n"); "mbox_request_channel failed\n");
ret = devm_add_action_or_reset(dev, k3_rproc_free_channel, kproc);
if (ret)
return ret;
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(k3_rproc_request_mbox); EXPORT_SYMBOL_GPL(k3_rproc_request_mbox);

View File

@ -175,8 +175,6 @@ static void k3_dsp_rproc_remove(struct platform_device *pdev)
if (ret) if (ret)
dev_err(dev, "failed to detach proc (%pe)\n", ERR_PTR(ret)); dev_err(dev, "failed to detach proc (%pe)\n", ERR_PTR(ret));
} }
mbox_free_channel(kproc->mbox);
} }
static const struct k3_rproc_mem_data c66_mems[] = { static const struct k3_rproc_mem_data c66_mems[] = {

View File

@ -1206,8 +1206,6 @@ static void k3_r5_cluster_rproc_exit(void *data)
return; return;
} }
} }
mbox_free_channel(kproc->mbox);
} }
} }