From a0ec4fc2c764dd8927cafbd751637a29eb6bd761 Mon Sep 17 00:00:00 2001 From: Atul Akella Date: Fri, 25 Sep 2026 16:44:24 +0530 Subject: [PATCH] remoteproc_virtio: guard null notify and check return status rpvdev->notify is called from four places in this file: virtqueue notify, set_status, set_features, and write_config. None guarded against notify being NULL, valid when no mailbox is configured, and none checked the returned status. Add a shared rpvdev_notify() helper used at all four sites: skip when notify is NULL, log a warning via metal_log on nonzero return. Exported notify signature is unchanged, per discussion in issue #343. Assisted-by: Claude Signed-off-by: Atul Akella --- lib/remoteproc/remoteproc_virtio.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/remoteproc/remoteproc_virtio.c b/lib/remoteproc/remoteproc_virtio.c index c7630a8..a4f2f64 100644 --- a/lib/remoteproc/remoteproc_virtio.c +++ b/lib/remoteproc/remoteproc_virtio.c @@ -32,6 +32,20 @@ static void rproc_virtio_delete_virtqueues(struct virtio_device *vdev) } } +static void rpvdev_notify(struct remoteproc_virtio *rpvdev, uint32_t id) +{ + int ret; + + if (!rpvdev->notify) + return; + + ret = rpvdev->notify(rpvdev->priv, id); + if (ret != 0) + metal_log(METAL_LOG_ERROR, + "notify failed: id=%lu, ret=%d\r\n", + (unsigned long)id, ret); +} + static int rproc_virtio_create_virtqueue(struct virtio_device *vdev, unsigned int flags, unsigned int idx, @@ -110,7 +124,7 @@ static void rproc_virtio_virtqueue_notify(struct virtqueue *vq) rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); metal_assert(vq_id < vdev->vrings_num); vring_info = &vdev->vrings_info[vq_id]; - rpvdev->notify(rpvdev->priv, vring_info->notifyid); + rpvdev_notify(rpvdev, vring_info->notifyid); } static unsigned char rproc_virtio_get_status(struct virtio_device *vdev) @@ -144,7 +158,7 @@ static void rproc_virtio_set_status(struct virtio_device *vdev, metal_io_virt_to_offset(io, &vdev_rsc->status), status); RSC_TABLE_FLUSH(vdev_rsc, sizeof(struct fw_rsc_vdev)); - rpvdev->notify(rpvdev->priv, vdev->notifyid); + rpvdev_notify(rpvdev, vdev->notifyid); } #endif @@ -199,7 +213,7 @@ static void rproc_virtio_set_features(struct virtio_device *vdev, metal_io_virt_to_offset(io, &vdev_rsc->gfeatures), features); RSC_TABLE_FLUSH(vdev_rsc, sizeof(struct fw_rsc_vdev)); - rpvdev->notify(rpvdev->priv, vdev->notifyid); + rpvdev_notify(rpvdev, vdev->notifyid); } static uint32_t rproc_virtio_negotiate_features(struct virtio_device *vdev, @@ -253,7 +267,7 @@ static void rproc_virtio_write_config(struct virtio_device *vdev, metal_io_virt_to_offset(io, config + offset), src, length); RSC_TABLE_FLUSH(config + offset, length); - rpvdev->notify(rpvdev->priv, vdev->notifyid); + rpvdev_notify(rpvdev, vdev->notifyid); } }