mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
drm/xe: Force user context allocations in user VRAM
In general, kernel structures should be allocated in the kernel-dedicated VRAM region. However, userspace context data - while used by the kernel - does not need to reside there. Let's force the allocation of such data in the general-purpose VRAM region accessible to userspace. Signed-off-by: Piotr Piórkowski <piotr.piorkowski@intel.com> Cc: Matthew Auld <matthew.auld@intel.com> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com> Link: https://lore.kernel.org/r/20251003162619.1984236-4-piotr.piorkowski@intel.com
This commit is contained in:
committed by
Michal Wajdeczko
parent
9d290ab0b5
commit
3f6cd669d5
@@ -183,7 +183,7 @@ static struct xe_exec_queue *__xe_exec_queue_alloc(struct xe_device *xe,
|
|||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __xe_exec_queue_init(struct xe_exec_queue *q)
|
static int __xe_exec_queue_init(struct xe_exec_queue *q, u32 exec_queue_flags)
|
||||||
{
|
{
|
||||||
int i, err;
|
int i, err;
|
||||||
u32 flags = 0;
|
u32 flags = 0;
|
||||||
@@ -202,6 +202,9 @@ static int __xe_exec_queue_init(struct xe_exec_queue *q)
|
|||||||
flags |= XE_LRC_CREATE_RUNALONE;
|
flags |= XE_LRC_CREATE_RUNALONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(exec_queue_flags & EXEC_QUEUE_FLAG_KERNEL))
|
||||||
|
flags |= XE_LRC_CREATE_USER_CTX;
|
||||||
|
|
||||||
for (i = 0; i < q->width; ++i) {
|
for (i = 0; i < q->width; ++i) {
|
||||||
q->lrc[i] = xe_lrc_create(q->hwe, q->vm, SZ_16K, q->msix_vec, flags);
|
q->lrc[i] = xe_lrc_create(q->hwe, q->vm, SZ_16K, q->msix_vec, flags);
|
||||||
if (IS_ERR(q->lrc[i])) {
|
if (IS_ERR(q->lrc[i])) {
|
||||||
@@ -248,7 +251,7 @@ struct xe_exec_queue *xe_exec_queue_create(struct xe_device *xe, struct xe_vm *v
|
|||||||
if (IS_ERR(q))
|
if (IS_ERR(q))
|
||||||
return q;
|
return q;
|
||||||
|
|
||||||
err = __xe_exec_queue_init(q);
|
err = __xe_exec_queue_init(q, flags);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_post_alloc;
|
goto err_post_alloc;
|
||||||
|
|
||||||
|
|||||||
@@ -1415,6 +1415,9 @@ static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe,
|
|||||||
if (vm && vm->xef) /* userspace */
|
if (vm && vm->xef) /* userspace */
|
||||||
bo_flags |= XE_BO_FLAG_PINNED_LATE_RESTORE;
|
bo_flags |= XE_BO_FLAG_PINNED_LATE_RESTORE;
|
||||||
|
|
||||||
|
if (init_flags & XE_LRC_CREATE_USER_CTX)
|
||||||
|
bo_flags |= XE_BO_FLAG_FORCE_USER_VRAM;
|
||||||
|
|
||||||
lrc->bo = xe_bo_create_pin_map_novm(xe, tile,
|
lrc->bo = xe_bo_create_pin_map_novm(xe, tile,
|
||||||
bo_size,
|
bo_size,
|
||||||
ttm_bo_type_kernel,
|
ttm_bo_type_kernel,
|
||||||
|
|||||||
@@ -44,8 +44,10 @@ struct xe_lrc_snapshot {
|
|||||||
|
|
||||||
#define LRC_WA_BB_SIZE SZ_4K
|
#define LRC_WA_BB_SIZE SZ_4K
|
||||||
|
|
||||||
#define XE_LRC_CREATE_RUNALONE 0x1
|
#define XE_LRC_CREATE_RUNALONE BIT(0)
|
||||||
#define XE_LRC_CREATE_PXP 0x2
|
#define XE_LRC_CREATE_PXP BIT(1)
|
||||||
|
#define XE_LRC_CREATE_USER_CTX BIT(2)
|
||||||
|
|
||||||
struct xe_lrc *xe_lrc_create(struct xe_hw_engine *hwe, struct xe_vm *vm,
|
struct xe_lrc *xe_lrc_create(struct xe_hw_engine *hwe, struct xe_vm *vm,
|
||||||
u32 ring_size, u16 msix_vec, u32 flags);
|
u32 ring_size, u16 msix_vec, u32 flags);
|
||||||
void xe_lrc_destroy(struct kref *ref);
|
void xe_lrc_destroy(struct kref *ref);
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ struct xe_pt *xe_pt_create(struct xe_vm *vm, struct xe_tile *tile,
|
|||||||
XE_BO_FLAG_IGNORE_MIN_PAGE_SIZE |
|
XE_BO_FLAG_IGNORE_MIN_PAGE_SIZE |
|
||||||
XE_BO_FLAG_NO_RESV_EVICT | XE_BO_FLAG_PAGETABLE;
|
XE_BO_FLAG_NO_RESV_EVICT | XE_BO_FLAG_PAGETABLE;
|
||||||
if (vm->xef) /* userspace */
|
if (vm->xef) /* userspace */
|
||||||
bo_flags |= XE_BO_FLAG_PINNED_LATE_RESTORE;
|
bo_flags |= XE_BO_FLAG_PINNED_LATE_RESTORE | XE_BO_FLAG_FORCE_USER_VRAM;
|
||||||
|
|
||||||
pt->level = level;
|
pt->level = level;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user