mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 22:02:02 +00:00
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
3 changed files with 23 additions and 5 deletions
|
@ -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 a new issue