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>
#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>
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)