mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-14 10:19:08 +08:00
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
This commit is contained in:
@@ -257,24 +257,24 @@ static void pin_obj_locked(struct drm_gem_object *obj)
|
||||
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;
|
||||
|
||||
msm_gem_lock(obj);
|
||||
msm_gem_assert_locked(obj);
|
||||
|
||||
p = msm_gem_get_pages_locked(obj, MSM_MADV_WILLNEED);
|
||||
if (!IS_ERR(p))
|
||||
pin_obj_locked(obj);
|
||||
msm_gem_unlock(obj);
|
||||
|
||||
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_unlock(obj);
|
||||
}
|
||||
|
||||
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,
|
||||
void msm_gem_unpin_iova(struct drm_gem_object *obj,
|
||||
struct msm_gem_address_space *aspace);
|
||||
void msm_gem_pin_obj_locked(struct drm_gem_object *obj);
|
||||
struct page **msm_gem_pin_pages(struct drm_gem_object *obj);
|
||||
void msm_gem_unpin_pages(struct drm_gem_object *obj);
|
||||
struct page **msm_gem_pin_pages_locked(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,
|
||||
struct drm_mode_create_dumb *args);
|
||||
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,
|
||||
|
||||
int msm_gem_prime_pin(struct drm_gem_object *obj)
|
||||
{
|
||||
if (!obj->import_attach)
|
||||
msm_gem_pin_pages(obj);
|
||||
return 0;
|
||||
struct page **pages;
|
||||
int ret = 0;
|
||||
|
||||
if (obj->import_attach)
|
||||
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)
|
||||
{
|
||||
if (!obj->import_attach)
|
||||
msm_gem_unpin_pages(obj);
|
||||
if (obj->import_attach)
|
||||
return;
|
||||
|
||||
msm_gem_lock(obj);
|
||||
msm_gem_unpin_pages_locked(obj);
|
||||
msm_gem_unlock(obj);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user