]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
virtio-rng: fix DMA alignment for data buffer
authorMichael S. Tsirkin <mst@redhat.com>
Mon, 29 Dec 2025 23:27:21 +0000 (18:27 -0500)
committerMichael S. Tsirkin <mst@redhat.com>
Thu, 8 Jan 2026 14:54:27 +0000 (09:54 -0500)
The data buffer in struct virtrng_info is used for DMA_FROM_DEVICE via
virtqueue_add_inbuf() and shares cachelines with the adjacent
CPU-written fields (data_avail, data_idx).

The device writing to the DMA buffer and the CPU writing to adjacent
fields could corrupt each other's data on non-cache-coherent platforms.

Add __dma_from_device_group_begin()/end() annotations to place these
in distinct cache lines.

Message-ID: <157a63b6324d1f1307ddd4faa3b62a8b90a79423.1767601130.git.mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
drivers/char/hw_random/virtio-rng.c

index dd998f4fe4f234367ef051fa12c4f326b0d8fd3e..eb80a031c7becf78606677d2bcac94221d5dacaf 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/spinlock.h>
 #include <linux/virtio.h>
 #include <linux/virtio_rng.h>
+#include <linux/dma-mapping.h>
 #include <linux/module.h>
 #include <linux/slab.h>
 
@@ -28,11 +29,13 @@ struct virtrng_info {
        unsigned int data_avail;
        unsigned int data_idx;
        /* minimal size returned by rng_buffer_size() */
+       __dma_from_device_group_begin();
 #if SMP_CACHE_BYTES < 32
        u8 data[32];
 #else
        u8 data[SMP_CACHE_BYTES];
 #endif
+       __dma_from_device_group_end();
 };
 
 static void random_recv_done(struct virtqueue *vq)