Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

virtio_mmio: generation support

virtio_mmio currently lacks generation support which
makes multi-byte field access racy.
Fix by getting the value at offset 0xfc for version 2
devices. Nothing we can do for version 1, so return
generation id 0.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

authored by

Michael S. Tsirkin and committed by
Rusty Russell
87e7bf14 71e4b8bf

+11
+11
drivers/virtio/virtio_mmio.c
··· 174 174 writeb(ptr[i], vm_dev->base + VIRTIO_MMIO_CONFIG + offset + i); 175 175 } 176 176 177 + static u32 vm_generation(struct virtio_device *vdev) 178 + { 179 + struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev); 180 + 181 + if (vm_dev->version == 1) 182 + return 0; 183 + else 184 + return readl(vm_dev->base + VIRTIO_MMIO_CONFIG_GENERATION); 185 + } 186 + 177 187 static u8 vm_get_status(struct virtio_device *vdev) 178 188 { 179 189 struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev); ··· 450 440 static const struct virtio_config_ops virtio_mmio_config_ops = { 451 441 .get = vm_get, 452 442 .set = vm_set, 443 + .generation = vm_generation, 453 444 .get_status = vm_get_status, 454 445 .set_status = vm_set_status, 455 446 .reset = vm_reset,