mirror of
https://github.com/OpenAMP/open-amp.git
synced 2026-10-02 18:23:21 +08:00
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 <noreply@anthropic.com> Signed-off-by: Atul Akella <atul.akella@gmail.com>
This commit is contained in:
committed by
Arnaud Pouliquen
parent
22ddff1a4e
commit
a0ec4fc2c7
@@ -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,
|
static int rproc_virtio_create_virtqueue(struct virtio_device *vdev,
|
||||||
unsigned int flags,
|
unsigned int flags,
|
||||||
unsigned int idx,
|
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);
|
rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev);
|
||||||
metal_assert(vq_id < vdev->vrings_num);
|
metal_assert(vq_id < vdev->vrings_num);
|
||||||
vring_info = &vdev->vrings_info[vq_id];
|
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)
|
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),
|
metal_io_virt_to_offset(io, &vdev_rsc->status),
|
||||||
status);
|
status);
|
||||||
RSC_TABLE_FLUSH(vdev_rsc, sizeof(struct fw_rsc_vdev));
|
RSC_TABLE_FLUSH(vdev_rsc, sizeof(struct fw_rsc_vdev));
|
||||||
rpvdev->notify(rpvdev->priv, vdev->notifyid);
|
rpvdev_notify(rpvdev, vdev->notifyid);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -199,7 +213,7 @@ static void rproc_virtio_set_features(struct virtio_device *vdev,
|
|||||||
metal_io_virt_to_offset(io, &vdev_rsc->gfeatures),
|
metal_io_virt_to_offset(io, &vdev_rsc->gfeatures),
|
||||||
features);
|
features);
|
||||||
RSC_TABLE_FLUSH(vdev_rsc, sizeof(struct fw_rsc_vdev));
|
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,
|
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),
|
metal_io_virt_to_offset(io, config + offset),
|
||||||
src, length);
|
src, length);
|
||||||
RSC_TABLE_FLUSH(config + offset, length);
|
RSC_TABLE_FLUSH(config + offset, length);
|
||||||
rpvdev->notify(rpvdev->priv, vdev->notifyid);
|
rpvdev_notify(rpvdev, vdev->notifyid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user