Re: [PATCH V15 06/14] drm/xe: Guard teardown paths against purged BOs
"Ghimiray, Himal Prasad" <[email protected]>
| Newsgroups | org.freedesktop.lists.intel-xe |
|---|---|
| Message-ID | <[email protected]> |
On 11-08-2026 18:10, Tejas Upadhyay wrote: > VRAM page offlining can purge BOs that are still referenced by page > tables, exec queues, and DMA-buf exports. Add xe_bo_is_purged() > guards in the teardown paths to prevent unpinning or mapping an > already-purged BO: > > - xe_bo_unpin_map_no_vm(): skip unpin if purged > - xe_dma_buf_map(): return -ENOENT early if purged > - xe_exec_queue_update_run_ticks(): skip LRC timestamp read if purged > - xe_pt_destroy(): skip unpin if purged > > Signed-off-by: Tejas Upadhyay <[email protected]> > --- > drivers/gpu/drm/xe/xe_bo.h | 3 ++- > drivers/gpu/drm/xe/xe_dma_buf.c | 3 +++ > drivers/gpu/drm/xe/xe_exec_queue.c | 8 ++++++-- > drivers/gpu/drm/xe/xe_pt.c | 3 ++- > 4 files changed, 13 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h > index eede678ad303..dfcd0e57073b 100644 > --- a/drivers/gpu/drm/xe/xe_bo.h > +++ b/drivers/gpu/drm/xe/xe_bo.h > @@ -364,7 +364,8 @@ static inline void xe_bo_unpin_map_no_vm(struct xe_bo *bo) > { > if (likely(bo)) { > xe_bo_lock(bo, false); > - xe_bo_unpin(bo); > + if (!xe_bo_is_purged(bo)) > + xe_bo_unpin(bo); > xe_bo_unlock(bo); > > xe_bo_put(bo); > diff --git a/drivers/gpu/drm/xe/xe_dma_buf.c b/drivers/gpu/drm/xe/xe_dma_buf.c > index bf0728838ead..5d9f1cd24b7f 100644 > --- a/drivers/gpu/drm/xe/xe_dma_buf.c > +++ b/drivers/gpu/drm/xe/xe_dma_buf.c > @@ -104,6 +104,9 @@ static struct sg_table *xe_dma_buf_map(struct dma_buf_attachment *attach, > struct sg_table *sgt; > int r = 0; > > + if (xe_bo_is_purged(bo)) > + return ERR_PTR(-ENOENT); > + > if (!attach->peer2peer && !xe_bo_can_migrate(bo, XE_PL_TT)) > return ERR_PTR(-EOPNOTSUPP); > > diff --git a/drivers/gpu/drm/xe/xe_exec_queue.c b/drivers/gpu/drm/xe/xe_exec_queue.c > index d6c7f346f49b..5432710c1cfb 100644 > --- a/drivers/gpu/drm/xe/xe_exec_queue.c > +++ b/drivers/gpu/drm/xe/xe_exec_queue.c > @@ -1575,8 +1575,12 @@ void xe_exec_queue_update_run_ticks(struct xe_exec_queue *q) > * errors. > */ > lrc = q->lrc[0]; > - new_ts = xe_lrc_update_timestamp(lrc, &old_ts); > - q->xef->run_ticks[q->class] += (new_ts - old_ts) * q->width; > + xe_bo_lock(lrc->bo, false); > + if (!xe_bo_is_purged(lrc->bo)) { > + new_ts = xe_lrc_update_timestamp(lrc, &old_ts); > + q->xef->run_ticks[q->class] += (new_ts - old_ts) * q->width; > + } > + xe_bo_unlock(lrc->bo); > > drm_dev_exit(idx); > } > diff --git a/drivers/gpu/drm/xe/xe_pt.c b/drivers/gpu/drm/xe/xe_pt.c > index 5d990c1c3740..dbf1aa26a21b 100644 > --- a/drivers/gpu/drm/xe/xe_pt.c > +++ b/drivers/gpu/drm/xe/xe_pt.c > @@ -212,7 +212,8 @@ void xe_pt_destroy(struct xe_pt *pt, u32 flags, struct llist_head *deferred) > return; > > XE_WARN_ON(!list_empty(&pt->bo->ttm.base.gpuva.list)); no dma_resv lock ? > - xe_bo_unpin(pt->bo); > + if (!xe_bo_is_purged(pt->bo)) > + xe_bo_unpin(pt->bo); > xe_bo_put_deferred(pt->bo, deferred); > > if (pt->level > 0 && pt->num_live) {