Skip to content
  • Jose Ricardo Ziviani's avatar
    vfio: Set MemoryRegionOps:max_access_size and min_access_size · 15126cba
    Jose Ricardo Ziviani authored
    
    
    Sets valid.max_access_size and valid.min_access_size to ensure safe
    8-byte accesses to vfio. Today, 8-byte accesses are broken into pairs
    of 4-byte calls that goes unprotected:
    
    qemu_mutex_lock locked mutex 0x10905ad8
      vfio_region_write  (0001:03:00.0:region1+0xc0, 0x2020c, 4)
    qemu_mutex_unlock unlocked mutex 0x10905ad8
    qemu_mutex_lock locked mutex 0x10905ad8
      vfio_region_write  (0001:03:00.0:region1+0xc4, 0xa0000, 4)
    qemu_mutex_unlock unlocked mutex 0x10905ad8
    
    which occasionally leads to:
    
    qemu_mutex_lock locked mutex 0x10905ad8
      vfio_region_write  (0001:03:00.0:region1+0xc0, 0x2030c, 4)
    qemu_mutex_unlock unlocked mutex 0x10905ad8
    qemu_mutex_lock locked mutex 0x10905ad8
      vfio_region_write  (0001:03:00.0:region1+0xc0, 0x1000c, 4)
    qemu_mutex_unlock unlocked mutex 0x10905ad8
    qemu_mutex_lock locked mutex 0x10905ad8
      vfio_region_write  (0001:03:00.0:region1+0xc4, 0xb0000, 4)
    qemu_mutex_unlock unlocked mutex 0x10905ad8
    qemu_mutex_lock locked mutex 0x10905ad8
      vfio_region_write  (0001:03:00.0:region1+0xc4, 0xa0000, 4)
    qemu_mutex_unlock unlocked mutex 0x10905ad8
    
    causing strange errors in guest OS. With this patch, such accesses
    are protected by the same lock guard:
    
    qemu_mutex_lock locked mutex 0x10905ad8
    vfio_region_write  (0001:03:00.0:region1+0xc0, 0x2000c, 4)
    vfio_region_write  (0001:03:00.0:region1+0xc4, 0xb0000, 4)
    qemu_mutex_unlock unlocked mutex 0x10905ad8
    
    This happens because the 8-byte write should be broken into 4-byte
    writes by memory.c:access_with_adjusted_size() in order to be under
    the same lock. Today, it's done in exec.c:address_space_write_continue()
    which was able to handle only 4 bytes due to a zero'ed
    valid.max_access_size (see exec.c:memory_access_size()).
    
    Signed-off-by: default avatarJose Ricardo Ziviani <joserz@linux.vnet.ibm.com>
    Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
    15126cba