• Alex Williamson's avatar
    vfio-pci: Avoid recursive read-lock usage · bc93b9ae
    Alex Williamson authored
    A down_read on memory_lock is held when performing read/write accesses
    to MMIO BAR space, including across the copy_to/from_user() callouts
    which may fault.  If the user buffer for these copies resides in an
    mmap of device MMIO space, the mmap fault handler will acquire a
    recursive read-lock on memory_lock.  Avoid this by reducing the lock
    granularity.  Sequential accesses requiring multiple ioread/iowrite
    cycles are expected to be rare, therefore typical accesses should not
    see additional overhead.
    
    VGA MMIO accesses are expected to be non-fatal regardless of the PCI
    memory enable bit to allow legacy probing, this behavior remains with
    a comment added.  ioeventfds are now included in memory access testing,
    with writes dropped while memory space is disabled.
    
    Fixes: abafbc55 ("vfio-pci: Invalidate mmaps and block MMIO access on disabled memory")
    Reported-by: default avatarZhiyi Guo <zhguo@redhat.com>
    Tested-by: default avatarZhiyi Guo <zhguo@redhat.com>
    Reviewed-by: default avatarCornelia Huck <cohuck@redhat.com>
    Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
    bc93b9ae
vfio_pci_rdwr.c 10.3 KB