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) {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.