[PATCH v2 6/6] drm: add drm_mode_atomic_commit event
Daniel Vetter
daniel at ffwll.ch
Fri Feb 16 16:37:23 UTC 2024
On Tue, Feb 13, 2024 at 11:20:17AM -0500, Steven Rostedt wrote:
> On Tue, 13 Feb 2024 16:50:31 +0100
> Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com> wrote:
>
> > @@ -1503,6 +1504,24 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
> > drm_mode_object_put(obj);
> > }
> >
> > + if (trace_drm_mode_atomic_commit_enabled()) {
> > + struct drm_crtc_state *crtc_state;
> > + struct drm_crtc *crtc;
> > + int *crtcs;
> > + int i, num_crtcs;
> > +
> > + crtcs = kcalloc(dev->mode_config.num_crtc, sizeof(int),
> > + GFP_KERNEL);
>
> If the above allocation fails, this will cause a NULL kernel dereference.
Yeah can't we somehow iterate directly into the trace subsystem? If
nothing else works I guess just a per-crtc event should do.
The more fundamental issue: I don't get how this works. For atomic we
have:
- explicitly handed in in-fences as dependencies with the IN_FENCE
property
- dependencies that drivers fish out of the dma_resv object of the
underlying gem buffer objects for each framebuffer. That has become
pretty much entirely generic code since everyone uses the same, and so
imo the dependency tracking should be fully generic too
- atomic has an out-fence too, so we could even do the full fence->fence
dependency tracking. It's just not created as a userspace object if all
userspace asks for is a drm vblank event, but it is very much there. And
I think if you want fence tracking, we really should have fence tracking
:-) Also the out-fence should be 100% generic (or it's a driver bug)
because the driver functions hide the differences between generating a
vblank event and signalling a dma_fence.
Cheers, Sima
>
> -- Steve
>
> > +
> > + num_crtcs = 0;
> > + for_each_new_crtc_in_state(state, crtc, crtc_state, i)
> > + crtcs[num_crtcs++] = drm_crtc_index(crtc);
> > +
> > + trace_drm_mode_atomic_commit(file_priv, crtcs, num_crtcs, arg->flags);
> > +
> > + kfree(crtcs);
> > + }
> > +
> > ret = prepare_signaling(dev, state, arg, file_priv, &fence_state,
> > &num_fences);
> > if (ret)
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
More information about the amd-gfx
mailing list