On Tue, Feb 21, 2023 at 8:01 AM Sebastian Wick <sebastian.wick@xxxxxxxxxx> wrote: > > On Tue, Feb 21, 2023 at 9:38 AM Pekka Paalanen <ppaalanen@xxxxxxxxx> wrote: > > > > On Mon, 20 Feb 2023 08:14:47 -0800 > > Rob Clark <robdclark@xxxxxxxxx> wrote: > > > > > On Mon, Feb 20, 2023 at 12:53 AM Pekka Paalanen <ppaalanen@xxxxxxxxx> wrote: > > > > > > > > On Sat, 18 Feb 2023 13:15:49 -0800 > > > > Rob Clark <robdclark@xxxxxxxxx> wrote: > > > > > > > > > From: Rob Clark <robdclark@xxxxxxxxxxxx> > > > > > > > > > > Allow userspace to use the EPOLLPRI/POLLPRI flag to indicate an urgent > > > > > wait (as opposed to a "housekeeping" wait to know when to cleanup after > > > > > some work has completed). Usermode components of GPU driver stacks > > > > > often poll() on fence fd's to know when it is safe to do things like > > > > > free or reuse a buffer, but they can also poll() on a fence fd when > > > > > waiting to read back results from the GPU. The EPOLLPRI/POLLPRI flag > > > > > lets the kernel differentiate these two cases. > > > > > > > > > > Signed-off-by: Rob Clark <robdclark@xxxxxxxxxxxx> > > > > > > > > Hi, > > > > > > > > where would the UAPI documentation of this go? > > > > It seems to be missing. > > > > > > Good question, I am not sure. The poll() man page has a description, > > > but my usage doesn't fit that _exactly_ (but OTOH the description is a > > > bit vague). > > > > > > > If a Wayland compositor is polling application fences to know which > > > > client buffer to use in its rendering, should the compositor poll with > > > > PRI or not? If a compositor polls with PRI, then all fences from all > > > > applications would always be PRI. Would that be harmful somehow or > > > > would it be beneficial? > > > > > > I think a compositor would rather use the deadline ioctl and then poll > > > without PRI. Otherwise you are giving an urgency signal to the fence > > > signaller which might not necessarily be needed. > > > > > > The places where I expect PRI to be useful is more in mesa (things > > > like glFinish(), readpix, and other similar sorts of blocking APIs) > > > > Sounds good. Docs... ;-) > > > > Hmm, so a compositor should set the deadline when it processes the > > wl_surface.commit, and not when it actually starts repainting, to give > > time for the driver to react and the GPU to do some more work. The > > deadline would be the time when the compositor starts its repaint, so > > it knows if the buffer is ready or not. > > Technically we don't know when the commit is supposed to be shown. > Just passing a deadline of the next possible deadline however is > probably a good enough guess for this feature to be useful. > > One thing that neither API allows us to do is tell the kernel in > advance when we're going to submit work and what the deadline for it > is and unfortunately that work is the most timing sensitive. Presumably you are talking about the final compositing step? Elsewhere in this series that atomic wait-for-fences step sets the deadline hint. BR, -R > > > > > > Thanks, > > pq > > > > > > > > > > BR, > > > -R > > > > > > > > > > > > > > > Thanks, > > > > pq > > > > > > > > > --- > > > > > drivers/dma-buf/sync_file.c | 8 ++++++++ > > > > > 1 file changed, 8 insertions(+) > > > > > > > > > > diff --git a/drivers/dma-buf/sync_file.c b/drivers/dma-buf/sync_file.c > > > > > index fb6ca1032885..c30b2085ee0a 100644 > > > > > --- a/drivers/dma-buf/sync_file.c > > > > > +++ b/drivers/dma-buf/sync_file.c > > > > > @@ -192,6 +192,14 @@ static __poll_t sync_file_poll(struct file *file, poll_table *wait) > > > > > { > > > > > struct sync_file *sync_file = file->private_data; > > > > > > > > > > + /* > > > > > + * The POLLPRI/EPOLLPRI flag can be used to signal that > > > > > + * userspace wants the fence to signal ASAP, express this > > > > > + * as an immediate deadline. > > > > > + */ > > > > > + if (poll_requested_events(wait) & EPOLLPRI) > > > > > + dma_fence_set_deadline(sync_file->fence, ktime_get()); > > > > > + > > > > > poll_wait(file, &sync_file->wq, wait); > > > > > > > > > > if (list_empty(&sync_file->cb.node) && > > > > > > >