[PATCH libinput] evdev: Log evdev event queue overflows

Peter Hutterer peter.hutterer at who-t.net
Mon Oct 27 17:11:08 PDT 2014


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 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.

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