This is an automated email from the ASF dual-hosted git repository. acassis pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 3183d5e1abbaa2afd9016f72f439963c5877e253 Author: Bowen Wang <[email protected]> AuthorDate: Wed Jun 25 10:58:47 2025 +0800 rpmsg/rpmsg_virtio: take the PM lock with the nopreempt spinlock pm_wakelock_stay() and pm_wakelock_relax() can switch context, which must not happen while priv->lock is held with only interrupts disabled. Use spin_lock_irqsave_nopreempt(), and take the lock in rpmsg_virtio_pm_callback() as well so the PM state cannot race with the TX path on SMP. Signed-off-by: Bowen Wang <[email protected]> --- drivers/rpmsg/rpmsg_virtio.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/rpmsg/rpmsg_virtio.c b/drivers/rpmsg/rpmsg_virtio.c index a1f542e9fe8..62ebede1817 100644 --- a/drivers/rpmsg/rpmsg_virtio.c +++ b/drivers/rpmsg/rpmsg_virtio.c @@ -154,6 +154,9 @@ static void rpmsg_virtio_pm_callback(wdparm_t arg) { FAR struct rpmsg_virtio_priv_s *priv = (FAR struct rpmsg_virtio_priv_s *)arg; + irqstate_t flags; + + flags = spin_lock_irqsave_nopreempt(&priv->lock); if (rpmsg_virtio_buffer_nused(&priv->rvdev, false)) { @@ -164,6 +167,8 @@ static void rpmsg_virtio_pm_callback(wdparm_t arg) { pm_wakelock_relax(&priv->wakelock); } + + spin_unlock_irqrestore_nopreempt(&priv->lock, flags); } #endif @@ -179,7 +184,7 @@ rpmsg_virtio_pm_action(FAR struct rpmsg_virtio_priv_s *priv, bool stay) irqstate_t flags; int count; - flags = spin_lock_irqsave(&priv->lock); + flags = spin_lock_irqsave_nopreempt(&priv->lock); count = pm_wakelock_staycount(&priv->wakelock); if (stay && count == 0) @@ -204,7 +209,7 @@ rpmsg_virtio_pm_action(FAR struct rpmsg_virtio_priv_s *priv, bool stay) } #endif - spin_unlock_irqrestore(&priv->lock, flags); + spin_unlock_irqrestore_nopreempt(&priv->lock, flags); } /****************************************************************************
