On Thu, 5 Aug 2021 22:04:18 -0300 Jason Gunthorpe <jgg@xxxxxxxxxx> wrote: > On Thu, Aug 05, 2021 at 11:07:35AM -0600, Alex Williamson wrote: > > @@ -2281,15 +2143,13 @@ static int vfio_pci_try_zap_and_vma_lock_cb(struct pci_dev *pdev, void *data) > > > > vdev = container_of(device, struct vfio_pci_device, vdev); > > > > - /* > > - * Locking multiple devices is prone to deadlock, runaway and > > - * unwind if we hit contention. > > - */ > > - if (!vfio_pci_zap_and_vma_lock(vdev, true)) { > > + if (!down_write_trylock(&vdev->memory_lock)) { > > vfio_device_put(device); > > return -EBUSY; > > } > > Now that this is simplified so much, I wonder if we can drop the > memory_lock and just use the dev_set->lock? > > That avoids the whole down_write_trylock thing and makes it much more > understandable? Hmm, that would make this case a lot easier, but using a mutex, potentially shared across multiple devices, taken on every non-mmap read/write doesn't really feel like a good trade-off when we're currently using a per device rwsem to retain concurrency here. Thanks, Alex