Skip to content

Commit 83318d0

Browse files
committed
Merge tag 'drm-xe-fixes-2026-03-26' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-fixes
- Fix UAF in SRIOV migration restore (Winiarski) - Updates to HW W/a (Roper) - VMBind remap fix (Auld) Signed-off-by: Dave Airlie <[email protected]> From: Rodrigo Vivi <[email protected]> Link: https://patch.msgid.link/[email protected]
2 parents aab01a8 + bfe9e31 commit 83318d0

6 files changed

Lines changed: 33 additions & 11 deletions

File tree

drivers/gpu/drm/xe/regs/xe_gt_regs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,7 @@
553553
#define ENABLE_SMP_LD_RENDER_SURFACE_CONTROL REG_BIT(44 - 32)
554554
#define FORCE_SLM_FENCE_SCOPE_TO_TILE REG_BIT(42 - 32)
555555
#define FORCE_UGM_FENCE_SCOPE_TO_TILE REG_BIT(41 - 32)
556+
#define L3_128B_256B_WRT_DIS REG_BIT(40 - 32)
556557
#define MAXREQS_PER_BANK REG_GENMASK(39 - 32, 37 - 32)
557558
#define DISABLE_128B_EVICTION_COMMAND_UDW REG_BIT(36 - 32)
558559

drivers/gpu/drm/xe/xe_pt.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1442,9 +1442,9 @@ static int op_check_svm_userptr(struct xe_vm *vm, struct xe_vma_op *op,
14421442
err = vma_check_userptr(vm, op->map.vma, pt_update);
14431443
break;
14441444
case DRM_GPUVA_OP_REMAP:
1445-
if (op->remap.prev)
1445+
if (op->remap.prev && !op->remap.skip_prev)
14461446
err = vma_check_userptr(vm, op->remap.prev, pt_update);
1447-
if (!err && op->remap.next)
1447+
if (!err && op->remap.next && !op->remap.skip_next)
14481448
err = vma_check_userptr(vm, op->remap.next, pt_update);
14491449
break;
14501450
case DRM_GPUVA_OP_UNMAP:
@@ -2198,12 +2198,12 @@ static int op_prepare(struct xe_vm *vm,
21982198

21992199
err = unbind_op_prepare(tile, pt_update_ops, old);
22002200

2201-
if (!err && op->remap.prev) {
2201+
if (!err && op->remap.prev && !op->remap.skip_prev) {
22022202
err = bind_op_prepare(vm, tile, pt_update_ops,
22032203
op->remap.prev, false);
22042204
pt_update_ops->wait_vm_bookkeep = true;
22052205
}
2206-
if (!err && op->remap.next) {
2206+
if (!err && op->remap.next && !op->remap.skip_next) {
22072207
err = bind_op_prepare(vm, tile, pt_update_ops,
22082208
op->remap.next, false);
22092209
pt_update_ops->wait_vm_bookkeep = true;
@@ -2428,10 +2428,10 @@ static void op_commit(struct xe_vm *vm,
24282428

24292429
unbind_op_commit(vm, tile, pt_update_ops, old, fence, fence2);
24302430

2431-
if (op->remap.prev)
2431+
if (op->remap.prev && !op->remap.skip_prev)
24322432
bind_op_commit(vm, tile, pt_update_ops, op->remap.prev,
24332433
fence, fence2, false);
2434-
if (op->remap.next)
2434+
if (op->remap.next && !op->remap.skip_next)
24352435
bind_op_commit(vm, tile, pt_update_ops, op->remap.next,
24362436
fence, fence2, false);
24372437
break;

drivers/gpu/drm/xe/xe_sriov_packet.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,8 @@ ssize_t xe_sriov_packet_write_single(struct xe_device *xe, unsigned int vfid,
341341
ret = xe_sriov_pf_migration_restore_produce(xe, vfid, *data);
342342
if (ret) {
343343
xe_sriov_packet_free(*data);
344+
*data = NULL;
345+
344346
return ret;
345347
}
346348

drivers/gpu/drm/xe/xe_vm.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2554,7 +2554,6 @@ static int xe_vma_op_commit(struct xe_vm *vm, struct xe_vma_op *op)
25542554
if (!err && op->remap.skip_prev) {
25552555
op->remap.prev->tile_present =
25562556
tile_present;
2557-
op->remap.prev = NULL;
25582557
}
25592558
}
25602559
if (op->remap.next) {
@@ -2564,11 +2563,13 @@ static int xe_vma_op_commit(struct xe_vm *vm, struct xe_vma_op *op)
25642563
if (!err && op->remap.skip_next) {
25652564
op->remap.next->tile_present =
25662565
tile_present;
2567-
op->remap.next = NULL;
25682566
}
25692567
}
25702568

2571-
/* Adjust for partial unbind after removing VMA from VM */
2569+
/*
2570+
* Adjust for partial unbind after removing VMA from VM. In case
2571+
* of unwind we might need to undo this later.
2572+
*/
25722573
if (!err) {
25732574
op->base.remap.unmap->va->va.addr = op->remap.start;
25742575
op->base.remap.unmap->va->va.range = op->remap.range;
@@ -2687,6 +2688,8 @@ static int vm_bind_ioctl_ops_parse(struct xe_vm *vm, struct drm_gpuva_ops *ops,
26872688

26882689
op->remap.start = xe_vma_start(old);
26892690
op->remap.range = xe_vma_size(old);
2691+
op->remap.old_start = op->remap.start;
2692+
op->remap.old_range = op->remap.range;
26902693

26912694
flags |= op->base.remap.unmap->va->flags & XE_VMA_CREATE_MASK;
26922695
if (op->base.remap.prev) {
@@ -2835,8 +2838,19 @@ static void xe_vma_op_unwind(struct xe_vm *vm, struct xe_vma_op *op,
28352838
xe_svm_notifier_lock(vm);
28362839
vma->gpuva.flags &= ~XE_VMA_DESTROYED;
28372840
xe_svm_notifier_unlock(vm);
2838-
if (post_commit)
2841+
if (post_commit) {
2842+
/*
2843+
* Restore the old va range, in case of the
2844+
* prev/next skip optimisation. Otherwise what
2845+
* we re-insert here could be smaller than the
2846+
* original range.
2847+
*/
2848+
op->base.remap.unmap->va->va.addr =
2849+
op->remap.old_start;
2850+
op->base.remap.unmap->va->va.range =
2851+
op->remap.old_range;
28392852
xe_vm_insert_vma(vm, vma);
2853+
}
28402854
}
28412855
break;
28422856
}

drivers/gpu/drm/xe/xe_vm_types.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,10 @@ struct xe_vma_op_remap {
373373
u64 start;
374374
/** @range: range of the VMA unmap */
375375
u64 range;
376+
/** @old_start: Original start of the VMA we unmap */
377+
u64 old_start;
378+
/** @old_range: Original range of the VMA we unmap */
379+
u64 old_range;
376380
/** @skip_prev: skip prev rebind */
377381
bool skip_prev;
378382
/** @skip_next: skip next rebind */

drivers/gpu/drm/xe/xe_wa.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,8 @@ static const struct xe_rtp_entry_sr gt_was[] = {
247247
LSN_DIM_Z_WGT_MASK,
248248
LSN_LNI_WGT(1) | LSN_LNE_WGT(1) |
249249
LSN_DIM_X_WGT(1) | LSN_DIM_Y_WGT(1) |
250-
LSN_DIM_Z_WGT(1)))
250+
LSN_DIM_Z_WGT(1)),
251+
SET(LSC_CHICKEN_BIT_0_UDW, L3_128B_256B_WRT_DIS))
251252
},
252253

253254
/* Xe2_HPM */

0 commit comments

Comments
 (0)