rpmsg: fix name service endpoint leak
The name service endpoint wasn't destroyed, so fix it. This is achieved by introducing an internal __rpmsg_destroy_ept function which doesn't assume the given ept is bound to an rpmsg channel (much like the existing __rpmsg_create_ept). This is needed because the name service ept belongs to the rpmsg bus, and is never bound with a specific rpdev. Reported-by: Omar Ramirez Luna <omar.ramirez@ti.com> Signed-off-by: Ohad Ben-Cohen <ohad@wizery.com> Cc: Grant Likely <grant.likely@secretlab.ca> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Mark Grosen <mgrosen@ti.com> Cc: Suman Anna <s-anna@ti.com> Cc: Fernando Guzman Lugo <fernando.lugo@ti.com> Cc: Rob Clark <rob@ti.com> Cc: Ludovic BARRE <ludovic.barre@stericsson.com> Cc: Loic PALLARDY <loic.pallardy@stericsson.com> Cc: Omar Ramirez Luna <omar.ramirez@ti.com>
This commit is contained in:
parent
9cd8eb433c
commit
fa2d7795b2
|
@ -289,6 +289,26 @@ struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_channel *rpdev,
|
|||
}
|
||||
EXPORT_SYMBOL(rpmsg_create_ept);
|
||||
|
||||
/**
|
||||
* __rpmsg_destroy_ept() - destroy an existing rpmsg endpoint
|
||||
* @vrp: virtproc which owns this ept
|
||||
* @ept: endpoing to destroy
|
||||
*
|
||||
* An internal function which destroy an ept without assuming it is
|
||||
* bound to an rpmsg channel. This is needed for handling the internal
|
||||
* name service endpoint, which isn't bound to an rpmsg channel.
|
||||
* See also __rpmsg_create_ept().
|
||||
*/
|
||||
static void
|
||||
__rpmsg_destroy_ept(struct virtproc_info *vrp, struct rpmsg_endpoint *ept)
|
||||
{
|
||||
mutex_lock(&vrp->endpoints_lock);
|
||||
idr_remove(&vrp->endpoints, ept->addr);
|
||||
mutex_unlock(&vrp->endpoints_lock);
|
||||
|
||||
kfree(ept);
|
||||
}
|
||||
|
||||
/**
|
||||
* rpmsg_destroy_ept() - destroy an existing rpmsg endpoint
|
||||
* @ept: endpoing to destroy
|
||||
|
@ -298,13 +318,7 @@ EXPORT_SYMBOL(rpmsg_create_ept);
|
|||
*/
|
||||
void rpmsg_destroy_ept(struct rpmsg_endpoint *ept)
|
||||
{
|
||||
struct virtproc_info *vrp = ept->rpdev->vrp;
|
||||
|
||||
mutex_lock(&vrp->endpoints_lock);
|
||||
idr_remove(&vrp->endpoints, ept->addr);
|
||||
mutex_unlock(&vrp->endpoints_lock);
|
||||
|
||||
kfree(ept);
|
||||
__rpmsg_destroy_ept(ept->rpdev->vrp, ept);
|
||||
}
|
||||
EXPORT_SYMBOL(rpmsg_destroy_ept);
|
||||
|
||||
|
@ -964,6 +978,9 @@ static void __devexit rpmsg_remove(struct virtio_device *vdev)
|
|||
if (ret)
|
||||
dev_warn(&vdev->dev, "can't remove rpmsg device: %d\n", ret);
|
||||
|
||||
if (vrp->ns_ept)
|
||||
__rpmsg_destroy_ept(vrp, vrp->ns_ept);
|
||||
|
||||
idr_remove_all(&vrp->endpoints);
|
||||
idr_destroy(&vrp->endpoints);
|
||||
|
||||
|
|
Loading…
Reference in New Issue