• Rob Herring's avatar
    drm/shmem: Use mutex_trylock in drm_gem_shmem_purge · dfbc7a46
    Rob Herring authored
    Lockdep reports a circular locking dependency with pages_lock taken in
    the shrinker callback. The deadlock can't actually happen with current
    users at least as a BO will never be purgeable when pages_lock is held.
    To be safe, let's use mutex_trylock() instead and bail if a BO is locked
    already.
    
    WARNING: possible circular locking dependency detected
    5.3.0-rc1+ #100 Tainted: G             L
    ------------------------------------------------------
    kswapd0/171 is trying to acquire lock:
    000000009b9823fd (&shmem->pages_lock){+.+.}, at: drm_gem_shmem_purge+0x20/0x40
    
    but task is already holding lock:
    00000000f82369b6 (fs_reclaim){+.+.}, at: __fs_reclaim_acquire+0x0/0x40
    
    which lock already depends on the new lock.
    
    the existing dependency chain (in reverse order) is:
    
    -> #1 (fs_reclaim){+.+.}:
           fs_reclaim_acquire.part.18+0x34/0x40
           fs_reclaim_acquire+0x20/0x28
           __kmalloc_node+0x6c/0x4c0
           kvmalloc_node+0x38/0xa8
           drm_gem_get_pages+0x80/0x1d0
           drm_gem_shmem_get_pages+0x58/0xa0
           drm_gem_shmem_get_pages_sgt+0x48/0xd0
           panfrost_mmu_map+0x38/0xf8 [panfrost]
           panfrost_gem_open+0xc0/0xe8 [panfrost]
           drm_gem_handle_create_tail+0xe8/0x198
           drm_gem_handle_create+0x3c/0x50
           panfrost_gem_create_with_handle+0x70/0xa0 [panfrost]
           panfrost_ioctl_create_bo+0x48/0x80 [panfrost]
           drm_ioctl_kernel+0xb8/0x110
           drm_ioctl+0x244/0x3f0
           do_vfs_ioctl+0xbc/0x910
           ksys_ioctl+0x78/0xa8
           __arm64_sys_ioctl+0x1c/0x28
           el0_svc_common.constprop.0+0x90/0x168
           el0_svc_handler+0x28/0x78
           el0_svc+0x8/0xc
    
    -> #0 (&shmem->pages_lock){+.+.}:
           __lock_acquire+0xa2c/0x1d70
           lock_acquire+0xdc/0x228
           __mutex_lock+0x8c/0x800
           mutex_lock_nested+0x1c/0x28
           drm_gem_shmem_purge+0x20/0x40
           panfrost_gem_shrinker_scan+0xc0/0x180 [panfrost]
           do_shrink_slab+0x208/0x500
           shrink_slab+0x10c/0x2c0
           shrink_node+0x28c/0x4d8
           balance_pgdat+0x2c8/0x570
           kswapd+0x22c/0x638
           kthread+0x128/0x130
           ret_from_fork+0x10/0x18
    
    other info that might help us debug this:
    
     Possible unsafe locking scenario:
    
           CPU0                    CPU1
           ----                    ----
      lock(fs_reclaim);
                                   lock(&shmem->pages_lock);
                                   lock(fs_reclaim);
      lock(&shmem->pages_lock);
    
     *** DEADLOCK ***
    
    3 locks held by kswapd0/171:
     #0: 00000000f82369b6 (fs_reclaim){+.+.}, at: __fs_reclaim_acquire+0x0/0x40
     #1: 00000000ceb37808 (shrinker_rwsem){++++}, at: shrink_slab+0xbc/0x2c0
     #2: 00000000f31efa81 (&pfdev->shrinker_lock){+.+.}, at: panfrost_gem_shrinker_scan+0x34/0x180 [panfrost]
    
    Fixes: 17acb9f3 ("drm/shmem: Add madvise state and purge helpers")
    Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
    Cc: Maxime Ripard <maxime.ripard@bootlin.com>
    Cc: Sean Paul <sean@poorly.run>
    Cc: David Airlie <airlied@linux.ie>
    Cc: Daniel Vetter <daniel@ffwll.ch>
    Signed-off-by: default avatarRob Herring <robh@kernel.org>
    Reviewed-by: default avatarSteven Price <steven.price@arm.com>
    Acked-by: default avatarAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20190823021216.5862-6-robh@kernel.org
    dfbc7a46
drm_gem_shmem_helper.c 17.7 KB