From 5298ca70783cd60b0a18d73f38ae409ddb45c860 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Sat, 16 May 2020 03:29:39 +0800 Subject: [PATCH 1/3] rpmsg: rpmsg_unregister_endpoint management cleanup to simplify the work in the furture Signed-off-by: Xiang Xiao --- lib/rpmsg/rpmsg.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/lib/rpmsg/rpmsg.c b/lib/rpmsg/rpmsg.c index 023c044cc..f1403d133 100644 --- a/lib/rpmsg/rpmsg.c +++ b/lib/rpmsg/rpmsg.c @@ -176,17 +176,14 @@ struct rpmsg_endpoint *rpmsg_get_endpoint(struct rpmsg_device *rdev, static void rpmsg_unregister_endpoint(struct rpmsg_endpoint *ept) { - struct rpmsg_device *rdev; - - if (!ept) - return; - - rdev = ept->rdev; + struct rpmsg_device *rdev = ept->rdev; + metal_mutex_acquire(&rdev->lock); if (ept->addr != RPMSG_ADDR_ANY) rpmsg_release_address(rdev->bitmap, RPMSG_ADDR_BMP_SIZE, ept->addr); metal_list_del(&ept->node); + metal_mutex_release(&rdev->lock); } void rpmsg_register_endpoint(struct rpmsg_device *rdev, @@ -230,15 +227,15 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev, rpmsg_init_ept(ept, name, addr, dest, cb, unbind_cb); rpmsg_register_endpoint(rdev, ept); + metal_mutex_release(&rdev->lock); - if (rdev->support_ns && ept->dest_addr == RPMSG_ADDR_ANY) { - /* Send NS announcement to remote processor */ - metal_mutex_release(&rdev->lock); + /* Send NS announcement to remote processor */ + if (rdev->support_ns && ept->dest_addr == RPMSG_ADDR_ANY) status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE); - metal_mutex_acquire(&rdev->lock); - if (status) - rpmsg_unregister_endpoint(ept); - } + + if (status) + rpmsg_unregister_endpoint(ept); + return status; ret_status: metal_mutex_release(&rdev->lock); @@ -261,9 +258,10 @@ void rpmsg_destroy_ept(struct rpmsg_endpoint *ept) return; rdev = ept->rdev; + if (!rdev) + return; + if (ept->name[0] && rdev->support_ns && ept->addr != RPMSG_NS_EPT_ADDR) (void)rpmsg_send_ns_message(ept, RPMSG_NS_DESTROY); - metal_mutex_acquire(&rdev->lock); rpmsg_unregister_endpoint(ept); - metal_mutex_release(&rdev->lock); } From f56189bcb896511d5fa480e90dd37db4334b124e Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Wed, 20 May 2020 21:33:09 +0800 Subject: [PATCH 2/3] rpmsg: rpmsg_create_ept don't send RPMSG_NS_CREATE if name is empty like what is done inside rpmsg_destroy_ept Signed-off-by: Xiang Xiao --- lib/rpmsg/rpmsg.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/rpmsg/rpmsg.c b/lib/rpmsg/rpmsg.c index f1403d133..cfd9d6907 100644 --- a/lib/rpmsg/rpmsg.c +++ b/lib/rpmsg/rpmsg.c @@ -230,7 +230,8 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev, metal_mutex_release(&rdev->lock); /* Send NS announcement to remote processor */ - if (rdev->support_ns && ept->dest_addr == RPMSG_ADDR_ANY) + if (ept->name[0] && rdev->support_ns && + ept->dest_addr == RPMSG_ADDR_ANY) status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE); if (status) From f5aa98fe7db3f8fca15424bdd9e6a36e632dcd6b Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Sat, 16 May 2020 03:22:02 +0800 Subject: [PATCH 3/3] rpmsg: zero out rdev field in rpmsg_unregister_endpoint so is_rpmsg_ept_ready can check the validity more easier Signed-off-by: Xiang Xiao --- lib/include/openamp/rpmsg.h | 3 +-- lib/rpmsg/rpmsg.c | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/include/openamp/rpmsg.h b/lib/include/openamp/rpmsg.h index 8401c3861..c5ed7da3b 100644 --- a/lib/include/openamp/rpmsg.h +++ b/lib/include/openamp/rpmsg.h @@ -342,8 +342,7 @@ void rpmsg_destroy_ept(struct rpmsg_endpoint *ept); */ static inline unsigned int is_rpmsg_ept_ready(struct rpmsg_endpoint *ept) { - return (ept->dest_addr != RPMSG_ADDR_ANY) && - (ept->addr != RPMSG_ADDR_ANY); + return ept && ept->rdev && ept->dest_addr != RPMSG_ADDR_ANY; } #if defined __cplusplus diff --git a/lib/rpmsg/rpmsg.c b/lib/rpmsg/rpmsg.c index cfd9d6907..1902f1c8c 100644 --- a/lib/rpmsg/rpmsg.c +++ b/lib/rpmsg/rpmsg.c @@ -183,6 +183,7 @@ static void rpmsg_unregister_endpoint(struct rpmsg_endpoint *ept) rpmsg_release_address(rdev->bitmap, RPMSG_ADDR_BMP_SIZE, ept->addr); metal_list_del(&ept->node); + ept->rdev = NULL; metal_mutex_release(&rdev->lock); }