Commit 45a10ad4 authored by Thomas Zimmermann's avatar Thomas Zimmermann

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: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarDmitry Osipenko <dmitry.osipenko@collabora.com>
Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> # virtio-gpu
Acked-by: default avatarChristian König <christian.koenig@amd.com>
Acked-by: default avatarZack Rusin <zack.rusin@broadcom.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240227113853.8464-5-tzimmermann@suse.de
parent cf91c165
...@@ -257,24 +257,24 @@ static void pin_obj_locked(struct drm_gem_object *obj) ...@@ -257,24 +257,24 @@ static void pin_obj_locked(struct drm_gem_object *obj)
mutex_unlock(&priv->lru.lock); mutex_unlock(&priv->lru.lock);
} }
struct page **msm_gem_pin_pages(struct drm_gem_object *obj) struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj)
{ {
struct page **p; struct page **p;
msm_gem_lock(obj); msm_gem_assert_locked(obj);
p = msm_gem_get_pages_locked(obj, MSM_MADV_WILLNEED); p = msm_gem_get_pages_locked(obj, MSM_MADV_WILLNEED);
if (!IS_ERR(p)) if (!IS_ERR(p))
pin_obj_locked(obj); pin_obj_locked(obj);
msm_gem_unlock(obj);
return p; return p;
} }
void msm_gem_unpin_pages(struct drm_gem_object *obj) void msm_gem_unpin_pages_locked(struct drm_gem_object *obj)
{ {
msm_gem_lock(obj); msm_gem_assert_locked(obj);
msm_gem_unpin_locked(obj); msm_gem_unpin_locked(obj);
msm_gem_unlock(obj);
} }
static pgprot_t msm_gem_pgprot(struct msm_gem_object *msm_obj, pgprot_t prot) static pgprot_t msm_gem_pgprot(struct msm_gem_object *msm_obj, pgprot_t prot)
......
...@@ -140,8 +140,8 @@ int msm_gem_get_and_pin_iova(struct drm_gem_object *obj, ...@@ -140,8 +140,8 @@ int msm_gem_get_and_pin_iova(struct drm_gem_object *obj,
void msm_gem_unpin_iova(struct drm_gem_object *obj, void msm_gem_unpin_iova(struct drm_gem_object *obj,
struct msm_gem_address_space *aspace); struct msm_gem_address_space *aspace);
void msm_gem_pin_obj_locked(struct drm_gem_object *obj); void msm_gem_pin_obj_locked(struct drm_gem_object *obj);
struct page **msm_gem_pin_pages(struct drm_gem_object *obj); struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj);
void msm_gem_unpin_pages(struct drm_gem_object *obj); void msm_gem_unpin_pages_locked(struct drm_gem_object *obj);
int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev, int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
struct drm_mode_create_dumb *args); struct drm_mode_create_dumb *args);
int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev, int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
......
...@@ -47,13 +47,27 @@ struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev, ...@@ -47,13 +47,27 @@ struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
int msm_gem_prime_pin(struct drm_gem_object *obj) int msm_gem_prime_pin(struct drm_gem_object *obj)
{ {
if (!obj->import_attach) struct page **pages;
msm_gem_pin_pages(obj); int ret = 0;
if (obj->import_attach)
return 0; return 0;
msm_gem_lock(obj);
pages = msm_gem_pin_pages_locked(obj);
if (IS_ERR(pages))
ret = PTR_ERR(pages);
msm_gem_unlock(obj);
return ret;
} }
void msm_gem_prime_unpin(struct drm_gem_object *obj) void msm_gem_prime_unpin(struct drm_gem_object *obj)
{ {
if (!obj->import_attach) if (obj->import_attach)
msm_gem_unpin_pages(obj); return;
msm_gem_lock(obj);
msm_gem_unpin_pages_locked(obj);
msm_gem_unlock(obj);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment