Ilia Mirkin
2020-Aug-16 03:23 UTC
[Nouveau] [PATCH 1/2] drmmode: make event handler leave a note that there are stuck events
We don't really expect to have too many events in the queue. If there are, then the algorithm we use isn't appropriate. Add a warning when the queue gets very long, as it's an indication of something having gone wrong. Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> --- src/drmmode_display.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 2d3229c..45292c4 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -159,6 +159,8 @@ drmmode_events = { .prev = &drmmode_events, }; +static bool warned = false; + static void drmmode_event_handler(int fd, unsigned int frame, unsigned int tv_sec, unsigned int tv_usec, void *event_data) @@ -166,7 +168,10 @@ drmmode_event_handler(int fd, unsigned int frame, unsigned int tv_sec, const uint64_t ust = (uint64_t)tv_sec * 1000000 + tv_usec; struct drmmode_event *e = event_data; + int counter = 0; + xorg_list_for_each_entry(e, &drmmode_events, head) { + counter++; if (e == event_data) { xorg_list_del(&e->head); e->func((void *)(e + 1), e->name, ust, frame); @@ -174,6 +179,12 @@ drmmode_event_handler(int fd, unsigned int frame, unsigned int tv_sec, break; } } + + if (counter > 100 && !warned) { + xf86DrvMsg(0, X_WARNING, + "Event handler iterated %d times\n", counter); + warned = true; + } } void -- 2.26.2
Ilia Mirkin
2020-Aug-16 03:23 UTC
[Nouveau] [PATCH 2/2] present: fix handling of drmWaitVBlank failures
When drmWaitVBlank fails, make sure to remove the event from the queue. Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu> --- Note this needs a bit more testing, and also double-checking what the "correct" way of dealing with these errors is. I was able to trigger errors with "xset dpms force off", but perhaps there are also other conditions. src/nouveau_present.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/nouveau_present.c b/src/nouveau_present.c index 8167fd8..15516d6 100644 --- a/src/nouveau_present.c +++ b/src/nouveau_present.c @@ -113,8 +113,19 @@ nouveau_present_vblank_queue(RRCrtcPtr rrcrtc, uint64_t event_id, uint64_t msc) args.request.signal = (unsigned long)token; while ((ret = drmWaitVBlank(pNv->dev->fd, &args)) != 0) { - if (errno != EBUSY || drmmode_event_flush(crtc->scrn) < 0) + if (errno != EBUSY) { + xf86DrvMsg(crtc->scrn->scrnIndex, X_DEBUG, + "PRESENT: Wait for VBlank failed: %s\n", strerror(errno)); + drmmode_event_abort(crtc->scrn, event_id, false); return BadAlloc; + } + ret = drmmode_event_flush(crtc->scrn); + if (ret < 0) { + xf86DrvMsg(crtc->scrn->scrnIndex, X_DEBUG, + "PRESENT: Event flush failed\n"); + drmmode_event_abort(crtc->scrn, event_id, false); + return BadAlloc; + } } return Success; -- 2.26.2
Seemingly Similar Threads
- Accumulating CPU load from Xorg process with DRI3
- [PATCH 1/2] present: Fixup return type of nouveau_present_init()
- Accumulating CPU load from Xorg process with DRI3
- Accumulating CPU load from Xorg process with DRI3
- [PATCH 2/2] present: build only when glamor is enabled