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 41326aea43942fe9a0f0b6c81fd800199c40393a
Author: Bowen Wang <[email protected]>
AuthorDate: Mon Jun 22 22:56:59 2026 +0800

    drivers/virtio/virtio-pci: leave buffers unmapped except ADDRENV user ones
    
    The host (QEMU) can access arbitrary guest memory over PCI, so buffers
    need no bouncing: leave map, unmap and free_largest NULL so
    virtio_map_buf returns the buffer as is (zero copy). With
    CONFIG_ARCH_ADDRENV use virtio_addrenv_map/unmap/free_largest, as
    virtio-mmio does, so user buffers are bounced through the kernel heap.
    
    Signed-off-by: Bowen Wang <[email protected]>
---
 drivers/virtio/virtio-pci.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/drivers/virtio/virtio-pci.c b/drivers/virtio/virtio-pci.c
index 4b1bb40c513..38a4d593f89 100644
--- a/drivers/virtio/virtio-pci.c
+++ b/drivers/virtio/virtio-pci.c
@@ -79,8 +79,23 @@ static struct pci_driver_s g_virtio_pci_drv =
 
 static const struct virtio_memory_ops g_virtio_pci_mmops =
 {
-  virtio_pci_alloc_buf, /* Alloc */
-  virtio_pci_free_buf,  /* Free */
+  .alloc        = virtio_pci_alloc_buf,
+  .free         = virtio_pci_free_buf,
+
+  /* The host (QEMU) can access arbitrary guest memory, so buffers are used
+   * as is (zero copy), except user buffers of a per-process address
+   * environment, which are not physically contiguous.
+   */
+
+#ifdef CONFIG_ARCH_ADDRENV
+  .free_largest = virtio_addrenv_free_largest,
+  .map          = virtio_addrenv_map,
+  .unmap        = virtio_addrenv_unmap,
+#else
+  .free_largest = NULL,
+  .map          = NULL,
+  .unmap        = NULL,
+#endif
 };
 
 /****************************************************************************

Reply via email to