Skip to content

Commit 79be336

Browse files
committed
drm/xe: Implement xe_pagefault_reset
Squash any pending faults on the GT being reset by setting the GT field in struct xe_pagefault to NULL. v4: - Only do reset it page faults queues initialized (CI) Signed-off-by: Matthew Brost <matthew.brost@intel.com> Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com> Tested-by: Francois Dugast <francois.dugast@intel.com> Link: https://patch.msgid.link/20251031165416.2871503-4-matthew.brost@intel.com
1 parent 1919d16 commit 79be336

2 files changed

Lines changed: 28 additions & 1 deletion

File tree

drivers/gpu/drm/xe/xe_gt.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include "xe_map.h"
5050
#include "xe_migrate.h"
5151
#include "xe_mmio.h"
52+
#include "xe_pagefault.h"
5253
#include "xe_pat.h"
5354
#include "xe_pm.h"
5455
#include "xe_mocs.h"
@@ -853,6 +854,7 @@ static void gt_reset_worker(struct work_struct *w)
853854

854855
xe_uc_gucrc_disable(&gt->uc);
855856
xe_uc_stop_prepare(&gt->uc);
857+
xe_pagefault_reset(gt_to_xe(gt), gt);
856858
xe_gt_pagefault_reset(gt);
857859

858860
xe_uc_stop(&gt->uc);

drivers/gpu/drm/xe/xe_pagefault.c

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,28 @@ int xe_pagefault_init(struct xe_device *xe)
129129
return err;
130130
}
131131

132+
static void xe_pagefault_queue_reset(struct xe_device *xe, struct xe_gt *gt,
133+
struct xe_pagefault_queue *pf_queue)
134+
{
135+
u32 i;
136+
137+
/* Driver load failure guard / USM not enabled guard */
138+
if (!pf_queue->data)
139+
return;
140+
141+
/* Squash all pending faults on the GT */
142+
143+
spin_lock_irq(&pf_queue->lock);
144+
for (i = pf_queue->tail; i != pf_queue->head;
145+
i = (i + xe_pagefault_entry_size()) % pf_queue->size) {
146+
struct xe_pagefault *pf = pf_queue->data + i;
147+
148+
if (pf->gt == gt)
149+
pf->gt = NULL;
150+
}
151+
spin_unlock_irq(&pf_queue->lock);
152+
}
153+
132154
/**
133155
* xe_pagefault_reset() - Page fault reset for a GT
134156
* @xe: xe device instance
@@ -139,7 +161,10 @@ int xe_pagefault_init(struct xe_device *xe)
139161
*/
140162
void xe_pagefault_reset(struct xe_device *xe, struct xe_gt *gt)
141163
{
142-
/* TODO - implement */
164+
int i;
165+
166+
for (i = 0; i < XE_PAGEFAULT_QUEUE_COUNT; ++i)
167+
xe_pagefault_queue_reset(xe, gt, xe->usm.pf_queue + i);
143168
}
144169

145170
/**

0 commit comments

Comments
 (0)