mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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…
	
		Reference in a new issue