Re: [PATCH] vfio/pci: Handle concurrent vma faults

From: Alex Williamson
Date: Fri Mar 12 2021 - 15:59:41 EST


On Fri, 12 Mar 2021 13:09:38 -0700
Alex Williamson <alex.williamson@xxxxxxxxxx> wrote:

> On Fri, 12 Mar 2021 15:41:47 -0400
> Jason Gunthorpe <jgg@xxxxxxxxxx> wrote:
>
>
> ======================================================
> WARNING: possible circular locking dependency detected
> 5.12.0-rc1+ #18 Not tainted
> ------------------------------------------------------
> CPU 0/KVM/1406 is trying to acquire lock:
> ffffffffa5a58d60 (fs_reclaim){+.+.}-{0:0}, at: fs_reclaim_acquire+0x83/0xd0
>
> but task is already holding lock:
> ffff94c0f3e8fb08 (&mapping->i_mmap_rwsem){++++}-{3:3}, at: vfio_device_io_remap_mapping_range+0x31/0x120 [vfio]
>
> which lock already depends on the new lock.
>
>
> the existing dependency chain (in reverse order) is:
>
> -> #1 (&mapping->i_mmap_rwsem){++++}-{3:3}:
> down_write+0x3d/0x70
> dma_resv_lockdep+0x1b0/0x298
> do_one_initcall+0x5b/0x2d0
> kernel_init_freeable+0x251/0x298
> kernel_init+0xa/0x111
> ret_from_fork+0x22/0x30
>
> -> #0 (fs_reclaim){+.+.}-{0:0}:
> __lock_acquire+0x111f/0x1e10
> lock_acquire+0xb5/0x380
> fs_reclaim_acquire+0xa3/0xd0
> kmem_cache_alloc_trace+0x30/0x2c0
> memtype_reserve+0xc3/0x280
> reserve_pfn_range+0x86/0x160
> track_pfn_remap+0xa6/0xe0
> remap_pfn_range+0xa8/0x610
> vfio_device_io_remap_mapping_range+0x93/0x120 [vfio]
> vfio_pci_test_and_up_write_memory_lock+0x34/0x40 [vfio_pci]
> vfio_basic_config_write+0x12d/0x230 [vfio_pci]
> vfio_pci_config_rw+0x1b7/0x3a0 [vfio_pci]
> vfs_write+0xea/0x390
> __x64_sys_pwrite64+0x72/0xb0
> do_syscall_64+0x33/0x40
> entry_SYSCALL_64_after_hwframe+0x44/0xae
>
..
> > Does current_gfp_context()/memalloc_nofs_save()/etc solve it?

Yeah, we can indeed use memalloc_nofs_save/restore(). It seems we're
trying to allocate something for pfnmap tracking and that enables lots
of lockdep specific tests. Is it valid to wrap io_remap_pfn_range()
around clearing this flag or am I just masking a bug? Thanks,

Alex