[PATCH libinput] evdev: Log evdev event queue overflows
Peter Hutterer
peter.hutterer at who-t.net
Tue Oct 28 20:50:05 PDT 2014
On Tue, Oct 28, 2014 at 09:32:20AM -0500, Derek Foreman wrote:
> On 27/10/14 07:11 PM, Peter Hutterer wrote:
> > On Mon, Oct 27, 2014 at 09:33:45AM -0500, Derek Foreman wrote:
> >> A couple of questions on this one:
> >> Is it ok to limit logging to 10 messages like this?
> >
> > IMO yes.
> >
> >> Should I be doing that on a per device basis instead of globally?
> >
> > you are doing it per-device here, I'm not sure what you mean with the
> > question, sorry.
>
> I'm doing it what I'd consider globally - 10 errors will disable the
> message whether the errors are from the same or different devices.
>
> Per device was intended to mean: adding the variable to the device
> structure so each device (or the same device if it was
> unplugged/re-plugged) would have its own independent 10 errors.
see my comment in the other email, I think that's fine. In most cases people
use one or two devices only anyway.
> >> (I'm totally unattached to the specifics of the log text, I believe X
> >> says something clever about how it's not the X server's fault to avoid
> >> silly bug reports...)
> >
> > that's a different error message, caused when the server-internal EQ
> > overflows. and the reason for the message is because the backtrace that X
> > prints then shows the input code as culprit, when the real issue is 5-6
> > stack frames up the stack. this wouldn't be necessary here, though we could
> > theoretically run into the same issue: if rendering delays reading from the
> > input fds for too long, we can trigger SYN_DROPPED.
>
> Ah, ok.
>
> What I'm seeing is what you describe at the end of the paragraph: the
> (pixman) renderer taking enough time that we trigger SYN_DROPPED.
short of moving input to its own thread, I don't think there's a good
solution to that. X avoids it by using SIGIO which works but is far from
ideal. And libinput is not designed to run in the signal handler anyway.
Cheers,
Peter
> >> On 27/10/14 09:26 AM, Derek Foreman wrote:
> >>> Log a message when the kernel event queue overflows and events are dropped.
> >>> After 10 messages logging stops to avoid flooding the logs if the condition
> >>> is persistent.
> >>> ---
> >>> src/evdev.c | 10 ++++++++++
> >>> 1 file changed, 10 insertions(+)
> >>>
> >>> diff --git a/src/evdev.c b/src/evdev.c
> >>> index 1b4ce10..c786537 100644
> >>> --- a/src/evdev.c
> >>> +++ b/src/evdev.c
> >>> @@ -912,6 +912,7 @@ evdev_sync_device(struct evdev_device *device)
> >>> static void
> >>> evdev_device_dispatch(void *data)
> >>> {
> >>> + static int overflows = 0;
> >>> struct evdev_device *device = data;
> >>> struct libinput *libinput = device->base.seat->libinput;
> >>> struct input_event ev;
> >>> @@ -924,6 +925,15 @@ evdev_device_dispatch(void *data)
> >>> rc = libevdev_next_event(device->evdev,
> >>> LIBEVDEV_READ_FLAG_NORMAL, &ev);
> >>> if (rc == LIBEVDEV_READ_STATUS_SYNC) {
> >>> + if (overflows < 10) {
> >>> + overflows++;
> >>> + log_info(libinput, "Kernel evdev event queue "
> >>> + "overflow for %s\n", device->devname);
> >>> + if (overflows == 10)
> >>> + log_info(libinput, "No longer logging "
> >>> + "evdev event queue overflows\n");
> >>> + }
> >>> +
> >>> /* send one more sync event so we handle all
> >>> currently pending events before we sync up
> >>> to the current state */
> >>>
> >>
>
More information about the wayland-devel
mailing list