Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dma-resv: lockdep-prime address_space->i_mmap_rwsem for dma-resv

GPU drivers need this in their shrinkers, to be able to throw out
mmap'ed buffers. Note that we also need dma_resv_lock in shrinkers,
but that loop is resolved by trylocking in shrinkers.

So full hierarchy is now (ignore some of the other branches we already
have primed):

mmap_read_lock -> dma_resv -> shrinkers -> i_mmap_lock_write

I hope that's not inconsistent with anything mm or fs does, adding
relevant people.

Reviewed-by: Thomas Hellström <thomas.hellstrom@intel.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Cc: Sumit Semwal <sumit.semwal@linaro.org>
Cc: "Christian König" <christian.koenig@amd.com>
Cc: linux-media@vger.kernel.org
Cc: linaro-mm-sig@lists.linaro.org
Cc: Dave Chinner <david@fromorbit.com>
Cc: Qian Cai <cai@lca.pw>
Cc: linux-xfs@vger.kernel.org
Cc: linux-fsdevel@vger.kernel.org
Cc: Thomas Hellström (Intel) <thomas_os@shipmail.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jason Gunthorpe <jgg@mellanox.com>
Cc: linux-mm@kvack.org
Cc: linux-rdma@vger.kernel.org
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200728135839.1035515-1-daniel.vetter@ffwll.ch

+5
+5
drivers/dma-buf/dma-resv.c
··· 98 98 struct mm_struct *mm = mm_alloc(); 99 99 struct ww_acquire_ctx ctx; 100 100 struct dma_resv obj; 101 + struct address_space mapping; 101 102 int ret; 102 103 103 104 if (!mm) 104 105 return -ENOMEM; 105 106 106 107 dma_resv_init(&obj); 108 + address_space_init_once(&mapping); 107 109 108 110 mmap_read_lock(mm); 109 111 ww_acquire_init(&ctx, &reservation_ww_class); ··· 113 111 if (ret == -EDEADLK) 114 112 dma_resv_lock_slow(&obj, &ctx); 115 113 fs_reclaim_acquire(GFP_KERNEL); 114 + /* for unmap_mapping_range on trylocked buffer objects in shrinkers */ 115 + i_mmap_lock_write(&mapping); 116 + i_mmap_unlock_write(&mapping); 116 117 #ifdef CONFIG_MMU_NOTIFIER 117 118 lock_map_acquire(&__mmu_notifier_invalidate_range_start_map); 118 119 __dma_fence_might_wait();