On Sat, Oct 17, 2026 at 06:02:26PM -0700, Matthew Brost wrote:
> On Sat, Oct 17, 2026 at 11:31:06PM +0200, Danilo Krummrich wrote:
> > On Fri Oct 2, 2026 at 12:06 AM CEST, Matthew Brost wrote:
> > > @@ -1187,6 +1187,27 @@ bind_validate_region(struct nouveau_job *job)
> > > return 0;
> > > }
> > >
> > > +/*
> > > + * Lock the VM's common dma-resv together with the one of @obj, as
> > > needed to
> > > + * drop what may be the last reference of a &drm_gpuvm_bo.
> > > + */
> > > +static void
> > > +nouveau_uvmm_lock_vm_and_obj(struct nouveau_uvmm *uvmm, struct drm_exec
> > > *exec,
> > > + struct drm_gem_object *obj)
> > > +{
> > > + int ret;
> > > +
> > > + drm_exec_init(exec, DRM_EXEC_IGNORE_DUPLICATES, 2);
> > > + drm_exec_until_all_locked(exec) {
> > > + ret = drm_exec_lock_obj(exec, drm_gpuvm_resv_obj(&uvmm->base));
> > > + if (!ret)
> > > + ret = drm_exec_lock_obj(exec, obj);
> >
> > What happens if we reach this with ENOMEM? In such a case we may return
> > without
>
> Right, valid issue. Sashiko flagged this too.
>
> Originally, I thought we would need to open-code the WW transaction, but
> instead I ended up fixing drm_exec [1].
>
> So I think we should merge [1] and run the MSM and Nouveau work in a
> no-failure mode.
>
> One thing I'd add is an assert(!ret) if Nouveau has support for that
> (see xe_assert.h for what we do in Xe so our CI can catch things we
> believe are impossible). I suppose the open-coded version would be a
> WARN_ON() or WARN_ON_ONCE().
>
> Also likey a BUILD_BUG_ON(2 <= DRM_EXEC_INLINE_OBJECTS).
>
Ugh, logic inversion.
Rather:
BUILD_BUG_ON(2 > DRM_EXEC_INLINE_OBJECTS)
Matt
> Let me know if you want me to respin with these changes.
>
> Matt
>
> [1] https://patchwork.freedesktop.org/series/175390/
>
> > any locks being held and nouveau would just continue calling into function
> > that
> > expect locks to be held and hence produced UB, right?
> >
> > (I think there is a similar case in MSM, but it was pre-existing, so I
> > picked all
> > other patches.)
> >
> > > + drm_exec_retry_on_contention(exec);
> > > + if (drm_WARN_ON(uvmm->base.drm, ret))
> > > + break;
> > > + }
> > > +}