On Fri, 09 Jan 2026 20:38:37 +0100 "Danilo Krummrich" <[email protected]> wrote:
> On Fri Jan 9, 2026 at 2:07 PM CET, Boris Brezillon wrote: > > When the VM is protected with the root object resv, evicted extobjs > > are not inserted in the evict list. > > I'd rather say: "When the evicted object list is protected with the root > object > reservation lock, ...". > > > Make sure we record when the extobj > > list contains evicted BOs that are not already in the evict list so we > > can validate those when drm_gpuvm_validate() is called. > > Why is this necessary in the first place? drm_gpuvm_prepare_objects() picks up > the affected external objects already. Oops, that's correct. Was looking for something calling ->vm_bo_validate() on evicted objects, but those are added to the evict list instead. I'll drop this patch. Thanks, Boris > > > Signed-off-by: Boris Brezillon <[email protected]> > > --- > > drivers/gpu/drm/drm_gpuvm.c | 23 ++++++++++++++++++++++- > > include/drm/drm_gpuvm.h | 6 ++++++ > > 2 files changed, 28 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/gpu/drm/drm_gpuvm.c b/drivers/gpu/drm/drm_gpuvm.c > > index 0bb115b6b59c..95f0a1c843ad 100644 > > --- a/drivers/gpu/drm/drm_gpuvm.c > > +++ b/drivers/gpu/drm/drm_gpuvm.c > > @@ -1505,6 +1505,22 @@ drm_gpuvm_validate_locked(struct drm_gpuvm *gpuvm, > > struct drm_exec *exec) > > drm_gpuvm_bo_list_del_init(vm_bo, evict, false); > > } > > > > + if (READ_ONCE(gpuvm->extobj.check_evicted)) { > > + list_for_each_entry_safe(vm_bo, next, &gpuvm->extobj.list, > > + list.entry.extobj) { > > Running the external object list (again) seems wasteful given that this case > can > never happen when drm_gpuvm_prepare_objects() is called before (which has to > be > the case, given that somehow the objects have to be locked). > > And even if for some reason you open code this, it would be much better to > add a > helper doing the check when the object is locked. > > > + dma_resv_assert_held(vm_bo->obj->resv); > > + > > + if (!vm_bo->evicted) > > + continue; > > + > > + ret = ops->vm_bo_validate(vm_bo, exec); > > + if (ret) > > + break; > > + } > > + > > + WRITE_ONCE(gpuvm->extobj.check_evicted, false); > > Why do we need READ_ONCE() and WRITE_ONCE() here? Don't we hold the object's > reservation lock whenever we touch check_evicted anyways? >
