Commit 49e7f76f authored by Matthew Auld's avatar Matthew Auld Committed by Christian König
Browse files

drm/ttm: add TTM_TT_FLAG_EXTERNAL_MAPPABLE



In commit:

commit 667a50db
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: default avatarMatthew 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: default avatarChristian König <christian.koenig@amd.com>
parent a5a3dd42
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -163,9 +163,11 @@ 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)) {
		if (!(bo->ttm->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE)) {
			dma_resv_unlock(bo->base.resv);
			return VM_FAULT_SIGBUS;
		}
	}

	return 0;
}
+3 −0
Original line number Diff line number Diff line
@@ -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;
}

+16 −3
Original line number Diff line number Diff line
@@ -67,6 +67,18 @@ 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().
@@ -74,6 +86,7 @@ struct ttm_tt {
#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;