[PATCH libinput] evdev: Log evdev event queue overflows

Derek Foreman derekf at osg.samsung.com
Tue Oct 28 07:32:20 PDT 2014


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.

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

> 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