This is an automated email from the ASF dual-hosted git repository. xiaoxiang781216 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 1c09f383f1b8a111bef90f7c18c691c61b8372e7 Author: Bowen Wang <[email protected]> AuthorDate: Tue Jul 29 21:12:34 2025 +0800 rpmsg/rpmsg_port: read the list counters under the list lock rpmsg_port_add_node() and rpmsg_port_remove_node() update free.num and ready.num under the list spinlock, but rpmsg_port_queue_navail() and rpmsg_port_queue_nused() read them with atomic_read(), which does not synchronize with that lock. Read each counter under its own list lock. Signed-off-by: Bowen Wang <[email protected]> --- drivers/rpmsg/rpmsg_port.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/rpmsg/rpmsg_port.h b/drivers/rpmsg/rpmsg_port.h index 02f6072fd9b..462af29db39 100644 --- a/drivers/rpmsg/rpmsg_port.h +++ b/drivers/rpmsg/rpmsg_port.h @@ -251,7 +251,13 @@ void rpmsg_port_queue_add_buffer(FAR struct rpmsg_port_queue_s *queue, static inline_function uint16_t rpmsg_port_queue_navail(FAR struct rpmsg_port_queue_s *queue) { - return atomic_read(&queue->free.num); + irqstate_t flags; + uint16_t num; + + flags = spin_lock_irqsave(&queue->free.lock); + num = queue->free.num; + spin_unlock_irqrestore(&queue->free.lock, flags); + return num; } /**************************************************************************** @@ -271,7 +277,13 @@ uint16_t rpmsg_port_queue_navail(FAR struct rpmsg_port_queue_s *queue) static inline_function uint16_t rpmsg_port_queue_nused(FAR struct rpmsg_port_queue_s *queue) { - return atomic_read(&queue->ready.num); + irqstate_t flags; + uint16_t num; + + flags = spin_lock_irqsave(&queue->ready.lock); + num = queue->ready.num; + spin_unlock_irqrestore(&queue->ready.lock, flags); + return num; } /****************************************************************************
