From: Suman Anna <s-anna@ti.com>
To: Henri Roosen <henri.roosen@ginzinger.com>, <bjorn.andersson@linaro.org>
Cc: <ohad@wizery.com>, <linux-remoteproc@vger.kernel.org>,
open list <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] rpmsg: Release rpmsg devices in backends
Date: Fri, 2 Jun 2017 19:28:57 -0500 [thread overview]
Message-ID: <e6bdf431-8950-8543-cec0-bbf9c9a270c2@ti.com> (raw)
In-Reply-To: <4955fa27-2daf-b80f-c37f-35489c63b599@ginzinger.com>
Hi Bjorn,
On 06/02/2017 05:07 AM, Henri Roosen wrote:
>> The rpmsg devices are allocated in the backends and as such must be
>> freed there as well.
>>
>> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
>> ---
>> drivers/rpmsg/qcom_smd.c | 11 +++++++++++
>> drivers/rpmsg/virtio_rpmsg_bus.c | 9 +++++++++
>> 2 files changed, 20 insertions(+)
>>
>> diff --git a/drivers/rpmsg/qcom_smd.c b/drivers/rpmsg/qcom_smd.c
>> index beaef5dd973e..a0a39a8821a3 100644
>> --- a/drivers/rpmsg/qcom_smd.c
>> +++ b/drivers/rpmsg/qcom_smd.c
>> @@ -969,6 +969,14 @@ static const struct rpmsg_endpoint_ops
>> qcom_smd_endpoint_ops = {
>> .poll = qcom_smd_poll,
>> };
>>
>> +static void qcom_smd_release_device(struct device *dev)
>> +{
>> + struct rpmsg_device *rpdev = to_rpmsg_device(dev);
>> + struct qcom_smd_device *qsdev = to_smd_device(rpdev);
>> +
>> + kfree(qsdev);
>> +}
>> +
>> /*
>> * Create a smd client device for channel that is being opened.
>> */
>> @@ -998,6 +1006,7 @@ static int qcom_smd_create_device(struct
>> qcom_smd_channel *channel)
>>
>> rpdev->dev.of_node = qcom_smd_match_channel(edge->of_node,
>> channel->name);
>> rpdev->dev.parent = &edge->dev;
>> + rpdev->dev.release = qcom_smd_release_device;
>>
>> return rpmsg_register_device(rpdev);
>
> This will not work: the registration of qcom_smd_release_device at
> rpdev->dev.release gets overwritten inside rpmsg_register_device() and
> will then point to the function rpmsg_release_device().
>
> My suggestion would be to additionally change/fix
> rpmsg_register_device() so it will not overwrite the release callback.
>
>> }
>> @@ -1013,6 +1022,8 @@ static int qcom_smd_create_chrdev(struct
>> qcom_smd_edge *edge)
>> qsdev->edge = edge;
>> qsdev->rpdev.ops = &qcom_smd_device_ops;
>> qsdev->rpdev.dev.parent = &edge->dev;
>> + qsdev->rpdev.dev.release = qcom_smd_release_device;
>> +
>> return rpmsg_chrdev_register_device(&qsdev->rpdev);
>
> This will not work either: same reason as described above because
> rpmsg_chrdev_register_device() will call rpmsg_register_device().
>
>> }
>>
>> diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c
>> b/drivers/rpmsg/virtio_rpmsg_bus.c
>> index 5e66e081027e..7f8c5cc1c118 100644
>> --- a/drivers/rpmsg/virtio_rpmsg_bus.c
>> +++ b/drivers/rpmsg/virtio_rpmsg_bus.c
>> @@ -360,6 +360,14 @@ static const struct rpmsg_device_ops
>> virtio_rpmsg_ops = {
>> .announce_destroy = virtio_rpmsg_announce_destroy,
>> };
>>
>> +static void virtio_rpmsg_release_device(struct device *dev)
>> +{
>> + struct rpmsg_device *rpdev = to_rpmsg_device(dev);
>> + struct virtio_rpmsg_channel *vch = to_virtio_rpmsg_channel(rpdev);
>> +
>> + kfree(vch);
>> +}
>> +
>> /*
>> * create an rpmsg channel using its name and address info.
>> * this function will be used to create both static and dynamic
>> @@ -408,6 +416,7 @@ static struct rpmsg_device
>> *rpmsg_create_channel(struct virtproc_info *vrp,
>> strncpy(rpdev->id.name, chinfo->name, RPMSG_NAME_SIZE);
>>
>> rpdev->dev.parent = &vrp->vdev->dev;
>> + rpdev->dev.release = virtio_rpmsg_release_device;
>> ret = rpmsg_register_device(rpdev);
>
> The same issue as described above.
FWIW, I didn't run into any rpmsg device memory leaks even without this
patch with booting and shutting down of remoteproc devices. The
virtio_rpmsg_channel structure inherits the struct rpmsg_device and is
the one that gets allocated, and the release function plugged in
rpmsg_release_device is operating on the rpmsg_device pointer, but both
are actually the same pointer.
Did you run into any memory leaks that required you to have this patch?
regards
Suman
next prev parent reply other threads:[~2017-06-03 0:29 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-16 5:18 Bjorn Andersson
2017-06-02 10:07 ` Henri Roosen
2017-06-03 0:28 ` Suman Anna [this message]
2017-06-25 21:28 ` Bjorn Andersson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e6bdf431-8950-8543-cec0-bbf9c9a270c2@ti.com \
--to=s-anna@ti.com \
--cc=bjorn.andersson@linaro.org \
--cc=henri.roosen@ginzinger.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-remoteproc@vger.kernel.org \
--cc=ohad@wizery.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®