On Thu, Nov 11, 2021 at 02:38:53PM +0800, Jason Wang wrote: > We used to access packed descriptor flags via > address_space_{write|read}_cached(). When we hit the cache, memcpy() > is used which is not an atomic operation which may lead a wrong value > is read or wrote.
Could you clarify where's the memcpy that you see? Thanks! > So this patch switches to use virito_{stw|lduw}_phys_cached() to make > sure the aceess is atomic. > > Fixes: 86044b24e865f ("virtio: basic packed virtqueue support") > Cc: qemu-sta...@nongnu.org > Signed-off-by: Jason Wang <jasow...@redhat.com> > --- > hw/virtio/virtio.c | 11 ++++------- > 1 file changed, 4 insertions(+), 7 deletions(-) > > diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c > index cc69a9b881..939bcbfeb9 100644 > --- a/hw/virtio/virtio.c > +++ b/hw/virtio/virtio.c > @@ -507,11 +507,9 @@ static void vring_packed_desc_read_flags(VirtIODevice > *vdev, > MemoryRegionCache *cache, > int i) > { > - address_space_read_cached(cache, > - i * sizeof(VRingPackedDesc) + > - offsetof(VRingPackedDesc, flags), > - flags, sizeof(*flags)); > - virtio_tswap16s(vdev, flags); > + hwaddr off = i * sizeof(VRingPackedDesc) + offsetof(VRingPackedDesc, > flags); > + > + *flags = virtio_lduw_phys_cached(vdev, cache, off); > } > > static void vring_packed_desc_read(VirtIODevice *vdev, > @@ -564,8 +562,7 @@ static void vring_packed_desc_write_flags(VirtIODevice > *vdev, > { > hwaddr off = i * sizeof(VRingPackedDesc) + offsetof(VRingPackedDesc, > flags); > > - virtio_tswap16s(vdev, &desc->flags); > - address_space_write_cached(cache, off, &desc->flags, > sizeof(desc->flags)); > + virtio_stw_phys_cached(vdev, cache, off, desc->flags); > address_space_cache_invalidate(cache, off, sizeof(desc->flags)); > } > > -- > 2.25.1