RE: [PATCH V15 06/14] drm/xe: Guard teardown paths against purged BOs
"Upadhyay, Tejas" <[email protected]>
| Newsgroups | org.freedesktop.lists.intel-xe |
|---|---|
| Message-ID | <DS0PR11MB871813DB5B8C0291088A343181DC2@DS0PR11MB8718.namprd11.prod.outlook.com> |
> -----Original Message----- > From: Ghimiray, Himal Prasad <[email protected]> > Sent: 12 August 2026 08:54 > To: Upadhyay, Tejas <[email protected]>; intel- > [email protected] > Subject: Re: [PATCH V15 06/14] drm/xe: Guard teardown paths against > purged BOs > > > > 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 ? Ack, lock is needed. Will take care in next rev. Tejas > > > - 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) {