drm/ttm: add TTM_TT_FLAG_EXTERNAL_MAPPABLE
In commit:
commit 667a50db04
Author: Thomas Hellstrom <thellstrom@vmware.com>
Date:   Fri Jan 3 11:17:18 2014 +0100
    drm/ttm: Refuse to fault (prime-) imported pages
we introduced the restriction that imported pages should not be directly
mappable through TTM(this also extends to userptr). In the next patch we
want to introduce a shmem_tt backend, which should follow all the
existing rules with TTM_PAGE_FLAG_EXTERNAL, since it will need to handle
swapping itself, but with the above mapping restriction lifted.
v2(Christian):
  - Don't OR together EXTERNAL and EXTERNAL_MAPPABLE in the definition
    of EXTERNAL_MAPPABLE, just leave it the caller to handle this
    correctly, otherwise we might encounter subtle issues.
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Christian König <christian.koenig@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210929132629.353541-3-matthew.auld@intel.com
Signed-off-by: Christian König <christian.koenig@amd.com>
			
			
This commit is contained in:
		
							parent
							
								
									a5a3dd42fe
								
							
						
					
					
						commit
						49e7f76fc5
					
				| @ -163,8 +163,10 @@ vm_fault_t ttm_bo_vm_reserve(struct ttm_buffer_object *bo, | ||||
| 	 * (if at all) by redirecting mmap to the exporter. | ||||
| 	 */ | ||||
| 	if (bo->ttm && (bo->ttm->page_flags & TTM_TT_FLAG_EXTERNAL)) { | ||||
| 		dma_resv_unlock(bo->base.resv); | ||||
| 		return VM_FAULT_SIGBUS; | ||||
| 		if (!(bo->ttm->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE)) { | ||||
| 			dma_resv_unlock(bo->base.resv); | ||||
| 			return VM_FAULT_SIGBUS; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
|  | ||||
| @ -84,6 +84,9 @@ int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc) | ||||
| 	if (unlikely(bo->ttm == NULL)) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	WARN_ON(bo->ttm->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE && | ||||
| 		!(bo->ttm->page_flags & TTM_TT_FLAG_EXTERNAL)); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -67,13 +67,26 @@ struct ttm_tt { | ||||
| 	 * Note that enum ttm_bo_type.ttm_bo_type_sg objects will always enable | ||||
| 	 * this flag. | ||||
| 	 * | ||||
| 	 * TTM_TT_FLAG_EXTERNAL_MAPPABLE: Same behaviour as | ||||
| 	 * TTM_TT_FLAG_EXTERNAL, but with the reduced restriction that it is | ||||
| 	 * still valid to use TTM to map the pages directly. This is useful when | ||||
| 	 * implementing a ttm_tt backend which still allocates driver owned | ||||
| 	 * pages underneath(say with shmem). | ||||
| 	 * | ||||
| 	 * Note that since this also implies TTM_TT_FLAG_EXTERNAL, the usage | ||||
| 	 * here should always be: | ||||
| 	 * | ||||
| 	 *   page_flags = TTM_TT_FLAG_EXTERNAL | | ||||
| 	 *		  TTM_TT_FLAG_EXTERNAL_MAPPABLE; | ||||
| 	 * | ||||
| 	 * TTM_TT_FLAG_PRIV_POPULATED: TTM internal only. DO NOT USE. This is | ||||
| 	 * set by TTM after ttm_tt_populate() has successfully returned, and is | ||||
| 	 * then unset when TTM calls ttm_tt_unpopulate(). | ||||
| 	 */ | ||||
| #define TTM_TT_FLAG_SWAPPED	(1 << 0) | ||||
| #define TTM_TT_FLAG_ZERO_ALLOC	(1 << 1) | ||||
| #define TTM_TT_FLAG_EXTERNAL	(1 << 2) | ||||
| #define TTM_TT_FLAG_SWAPPED		(1 << 0) | ||||
| #define TTM_TT_FLAG_ZERO_ALLOC		(1 << 1) | ||||
| #define TTM_TT_FLAG_EXTERNAL		(1 << 2) | ||||
| #define TTM_TT_FLAG_EXTERNAL_MAPPABLE	(1 << 3) | ||||
| 
 | ||||
| #define TTM_TT_FLAG_PRIV_POPULATED  (1 << 31) | ||||
| 	uint32_t page_flags; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user