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 3199aa7f3d00df26c046dff22551464e50a9a898 Author: niyinghao <[email protected]> AuthorDate: Wed Nov 12 20:07:40 2025 +0800 drivers/virtio-snd: allocate audio buffers from kumm in protected build In a protected build the audio buffers are accessed from user space, but virtio_zalloc_buf() allocates them from kernel memory. Allocate them with kumm in that case, as virtio-gpu does for its frame buffer. Signed-off-by: niyinghao <[email protected]> --- drivers/virtio/virtio-snd.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/virtio/virtio-snd.c b/drivers/virtio/virtio-snd.c index 8f3ac3e3cff..e06afa08cb0 100644 --- a/drivers/virtio/virtio-snd.c +++ b/drivers/virtio/virtio-snd.c @@ -952,22 +952,28 @@ static int virtio_snd_allocbuffer(FAR struct audio_lowerhalf_s *dev, FAR struct audio_buf_desc_s *desc) { FAR struct virtio_snd_dev_s *sdev = (FAR struct virtio_snd_dev_s *)dev; - FAR struct virtio_snd_s *priv = sdev->priv; FAR struct virtio_snd_buffer_s *buf; - - DEBUGASSERT(desc->u.pbuffer != NULL); +#ifndef CONFIG_BUILD_PROTECTED + FAR struct virtio_snd_s *priv = sdev->priv; buf = virtio_zalloc_buf(priv->vdev, sizeof(*buf) + sizeof(struct virtio_snd_pcm_xfer) + desc->numbytes + sizeof(struct virtio_snd_pcm_status), 16); +#else + buf = kumm_calloc(sizeof(*buf) + + sizeof(struct virtio_snd_pcm_xfer) + + desc->numbytes + + sizeof(struct virtio_snd_pcm_status), 16); +#endif if (buf == NULL) { vrterr("failed to allocate apb buffer\n"); return -ENOMEM; } + DEBUGASSERT(desc->u.pbuffer != NULL); *desc->u.pbuffer = &buf->apb; buf->apb.crefs = 1; @@ -990,9 +996,11 @@ static int virtio_snd_allocbuffer(FAR struct audio_lowerhalf_s *dev, static int virtio_snd_freebuffer(FAR struct audio_lowerhalf_s *dev, FAR struct audio_buf_desc_s *desc) { +#ifndef CONFIG_BUILD_PROTECTED FAR struct virtio_snd_dev_s *sdev = (FAR struct virtio_snd_dev_s *)dev; FAR struct virtio_snd_s *priv = sdev->priv; FAR struct virtio_device *vdev = priv->vdev; +#endif FAR struct ap_buffer_s *apb = desc->u.buffer; int refcount; @@ -1002,7 +1010,11 @@ static int virtio_snd_freebuffer(FAR struct audio_lowerhalf_s *dev, if (refcount <= 1) { nxmutex_destroy(&apb->lock); +#ifdef CONFIG_BUILD_PROTECTED + kumm_free(apb); +#else virtio_free_buf(vdev, apb); +#endif } return sizeof(struct audio_buf_desc_s);
