• Chuanxiao Dong's avatar
    drm/i915/gvt: Fix possible recursive locking issue · 62d02fd1
    Chuanxiao Dong authored
    vfio_unpin_pages will hold a read semaphore however it is already hold
    in the same thread by vfio ioctl. It will cause below warning:
    
    [ 5102.127454] ============================================
    [ 5102.133379] WARNING: possible recursive locking detected
    [ 5102.139304] 4.12.0-rc4+ #3 Not tainted
    [ 5102.143483] --------------------------------------------
    [ 5102.149407] qemu-system-x86/1620 is trying to acquire lock:
    [ 5102.155624]  (&container->group_lock){++++++}, at: [<ffffffff817768c6>] vfio_unpin_pages+0x96/0xf0
    [ 5102.165626]
    but task is already holding lock:
    [ 5102.172134]  (&container->group_lock){++++++}, at: [<ffffffff8177728f>] vfio_fops_unl_ioctl+0x5f/0x280
    [ 5102.182522]
    other info that might help us debug this:
    [ 5102.189806]  Possible unsafe locking scenario:
    
    [ 5102.196411]        CPU0
    [ 5102.199136]        ----
    [ 5102.201861]   lock(&container->group_lock);
    [ 5102.206527]   lock(&container->group_lock);
    [ 5102.211191]
    *** DEADLOCK ***
    
    [ 5102.217796]  May be due to missing lock nesting notation
    
    [ 5102.225370] 3 locks held by qemu-system-x86/1620:
    [ 5102.230618]  #0:  (&container->group_lock){++++++}, at: [<ffffffff8177728f>] vfio_fops_unl_ioctl+0x5f/0x280
    [ 5102.241482]  #1:  (&(&iommu->notifier)->rwsem){++++..}, at: [<ffffffff810de775>] __blocking_notifier_call_chain+0x35/0x70
    [ 5102.253713]  #2:  (&vgpu->vdev.cache_lock){+.+...}, at: [<ffffffff8157b007>] intel_vgpu_iommu_notifier+0x77/0x120
    [ 5102.265163]
    stack backtrace:
    [ 5102.270022] CPU: 5 PID: 1620 Comm: qemu-system-x86 Not tainted 4.12.0-rc4+ #3
    [ 5102.277991] Hardware name: Intel Corporation S1200RP/S1200RP, BIOS S1200RP.86B.03.01.APER.061220151418 06/12/2015
    [ 5102.289445] Call Trace:
    [ 5102.292175]  dump_stack+0x85/0xc7
    [ 5102.295871]  validate_chain.isra.21+0x9da/0xaf0
    [ 5102.300925]  __lock_acquire+0x405/0x820
    [ 5102.305202]  lock_acquire+0xc7/0x220
    [ 5102.309191]  ? vfio_unpin_pages+0x96/0xf0
    [ 5102.313666]  down_read+0x2b/0x50
    [ 5102.317259]  ? vfio_unpin_pages+0x96/0xf0
    [ 5102.321732]  vfio_unpin_pages+0x96/0xf0
    [ 5102.326024]  intel_vgpu_iommu_notifier+0xe5/0x120
    [ 5102.331283]  notifier_call_chain+0x4a/0x70
    [ 5102.335851]  __blocking_notifier_call_chain+0x4d/0x70
    [ 5102.341490]  blocking_notifier_call_chain+0x16/0x20
    [ 5102.346935]  vfio_iommu_type1_ioctl+0x87b/0x920
    [ 5102.351994]  vfio_fops_unl_ioctl+0x81/0x280
    [ 5102.356660]  ? __fget+0xf0/0x210
    [ 5102.360261]  do_vfs_ioctl+0x93/0x6a0
    [ 5102.364247]  ? __fget+0x111/0x210
    [ 5102.367942]  SyS_ioctl+0x41/0x70
    [ 5102.371542]  entry_SYSCALL_64_fastpath+0x1f/0xbe
    
    put the vfio_unpin_pages in a workqueue can fix this.
    
    v2:
    - use for style instead of do{}while(1). (Zhenyu)
    v3:
    - rename gvt_cache_mark to gvt_cache_mark_remove. (Zhenyu)
    
    Fixes: 659643f7 ("drm/i915/gvt/kvmgt: add vfio/mdev support to KVMGT")
    Signed-off-by: default avatarChuanxiao Dong <chuanxiao.dong@intel.com>
    Cc: Zhenyu Wang <zhenyuw@linux.intel.com>
    Cc: stable@vger.kernel.org # v4.10+
    Signed-off-by: default avatarZhenyu Wang <zhenyuw@linux.intel.com>
    62d02fd1
gvt.h 13.8 KB