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

Configure Feed

Select the types of activity you want to include in your feed.

drm/msm: Acquire reservation lock in GEM pin/unpin callback

Export msm_gem_pin_pages_locked() and acquire the reservation lock
directly in GEM pin callback. Same for unpin. Prepares for further
changes.

Dma-buf locking semantics require callers to hold the buffer's
reservation lock when invoking the pin and unpin callbacks. Prepare
msm accordingly by pushing locking out of the implementation. A
follow-up patch will fix locking for all GEM code at once.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> # virtio-gpu
Acked-by: Christian König <christian.koenig@amd.com>
Acked-by: Zack Rusin <zack.rusin@broadcom.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240227113853.8464-5-tzimmermann@suse.de

+27 -13
+6 -6
drivers/gpu/drm/msm/msm_gem.c
··· 257 257 mutex_unlock(&priv->lru.lock); 258 258 } 259 259 260 - struct page **msm_gem_pin_pages(struct drm_gem_object *obj) 260 + struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj) 261 261 { 262 262 struct page **p; 263 263 264 - msm_gem_lock(obj); 264 + msm_gem_assert_locked(obj); 265 + 265 266 p = msm_gem_get_pages_locked(obj, MSM_MADV_WILLNEED); 266 267 if (!IS_ERR(p)) 267 268 pin_obj_locked(obj); 268 - msm_gem_unlock(obj); 269 269 270 270 return p; 271 271 } 272 272 273 - void msm_gem_unpin_pages(struct drm_gem_object *obj) 273 + void msm_gem_unpin_pages_locked(struct drm_gem_object *obj) 274 274 { 275 - msm_gem_lock(obj); 275 + msm_gem_assert_locked(obj); 276 + 276 277 msm_gem_unpin_locked(obj); 277 - msm_gem_unlock(obj); 278 278 } 279 279 280 280 static pgprot_t msm_gem_pgprot(struct msm_gem_object *msm_obj, pgprot_t prot)
+2 -2
drivers/gpu/drm/msm/msm_gem.h
··· 140 140 void msm_gem_unpin_iova(struct drm_gem_object *obj, 141 141 struct msm_gem_address_space *aspace); 142 142 void msm_gem_pin_obj_locked(struct drm_gem_object *obj); 143 - struct page **msm_gem_pin_pages(struct drm_gem_object *obj); 144 - void msm_gem_unpin_pages(struct drm_gem_object *obj); 143 + struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj); 144 + void msm_gem_unpin_pages_locked(struct drm_gem_object *obj); 145 145 int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev, 146 146 struct drm_mode_create_dumb *args); 147 147 int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
+19 -5
drivers/gpu/drm/msm/msm_gem_prime.c
··· 47 47 48 48 int msm_gem_prime_pin(struct drm_gem_object *obj) 49 49 { 50 - if (!obj->import_attach) 51 - msm_gem_pin_pages(obj); 52 - return 0; 50 + struct page **pages; 51 + int ret = 0; 52 + 53 + if (obj->import_attach) 54 + return 0; 55 + 56 + msm_gem_lock(obj); 57 + pages = msm_gem_pin_pages_locked(obj); 58 + if (IS_ERR(pages)) 59 + ret = PTR_ERR(pages); 60 + msm_gem_unlock(obj); 61 + 62 + return ret; 53 63 } 54 64 55 65 void msm_gem_prime_unpin(struct drm_gem_object *obj) 56 66 { 57 - if (!obj->import_attach) 58 - msm_gem_unpin_pages(obj); 67 + if (obj->import_attach) 68 + return; 69 + 70 + msm_gem_lock(obj); 71 + msm_gem_unpin_pages_locked(obj); 72 + msm_gem_unlock(obj); 59 73 }