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);
|
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;
|
int ret;
|
||||||
|
|
||||||
|
@ -238,13 +238,15 @@ static int drm_gem_shmem_pin_locked(struct drm_gem_shmem_object *shmem)
|
||||||
|
|
||||||
return ret;
|
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);
|
dma_resv_assert_held(shmem->base.resv);
|
||||||
|
|
||||||
drm_gem_shmem_put_pages(shmem);
|
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
|
* 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);
|
struct iosys_map *map);
|
||||||
int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shmem, struct vm_area_struct *vma);
|
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);
|
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)
|
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)
|
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);
|
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);
|
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