drm/gem-shmem: Acquire reservation lock in GEM pin/unpin callbacks
Export drm_gem_shmem_pin_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 gem-shmem 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-2-tzimmermann@suse.de
This commit is contained in:
parent
8e3ed5440b
commit
ec144244a4
2 changed files with 18 additions and 4 deletions
|
@ -228,7 +228,7 @@ void drm_gem_shmem_put_pages(struct drm_gem_shmem_object *shmem)
|
|||
}
|
||||
EXPORT_SYMBOL(drm_gem_shmem_put_pages);
|
||||
|
||||
static int drm_gem_shmem_pin_locked(struct drm_gem_shmem_object *shmem)
|
||||
int drm_gem_shmem_pin_locked(struct drm_gem_shmem_object *shmem)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -238,13 +238,15 @@ static int drm_gem_shmem_pin_locked(struct drm_gem_shmem_object *shmem)
|
|||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_gem_shmem_pin_locked);
|
||||
|
||||
static void drm_gem_shmem_unpin_locked(struct drm_gem_shmem_object *shmem)
|
||||
void drm_gem_shmem_unpin_locked(struct drm_gem_shmem_object *shmem)
|
||||
{
|
||||
dma_resv_assert_held(shmem->base.resv);
|
||||
|
||||
drm_gem_shmem_put_pages(shmem);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_gem_shmem_unpin_locked);
|
||||
|
||||
/**
|
||||
* drm_gem_shmem_pin - Pin backing pages for a shmem GEM object
|
||||
|
|
|
@ -108,6 +108,9 @@ void drm_gem_shmem_vunmap(struct drm_gem_shmem_object *shmem,
|
|||
struct iosys_map *map);
|
||||
int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shmem, struct vm_area_struct *vma);
|
||||
|
||||
int drm_gem_shmem_pin_locked(struct drm_gem_shmem_object *shmem);
|
||||
void drm_gem_shmem_unpin_locked(struct drm_gem_shmem_object *shmem);
|
||||
|
||||
int drm_gem_shmem_madvise(struct drm_gem_shmem_object *shmem, int madv);
|
||||
|
||||
static inline bool drm_gem_shmem_is_purgeable(struct drm_gem_shmem_object *shmem)
|
||||
|
@ -172,8 +175,15 @@ static inline void drm_gem_shmem_object_print_info(struct drm_printer *p, unsign
|
|||
static inline int drm_gem_shmem_object_pin(struct drm_gem_object *obj)
|
||||
{
|
||||
struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
|
||||
int ret;
|
||||
|
||||
return drm_gem_shmem_pin(shmem);
|
||||
ret = dma_resv_lock_interruptible(shmem->base.resv, NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = drm_gem_shmem_pin_locked(shmem);
|
||||
dma_resv_unlock(shmem->base.resv);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -187,7 +197,9 @@ static inline void drm_gem_shmem_object_unpin(struct drm_gem_object *obj)
|
|||
{
|
||||
struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
|
||||
|
||||
drm_gem_shmem_unpin(shmem);
|
||||
dma_resv_lock(shmem->base.resv, NULL);
|
||||
drm_gem_shmem_unpin_locked(shmem);
|
||||
dma_resv_unlock(shmem->base.resv);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Reference in a new issue