touchpad: ratelimit the touch jump tests
authorPeter Hutterer <peter.hutterer@who-t.net>
Sat, 21 Mar 2020 11:03:32 +0000 (21:03 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Sat, 21 Mar 2020 23:34:22 +0000 (09:34 +1000)
In most cases these days touch jumps aren't actually fixable, they don't have
any good heuristics we can employ to remove them. And, luckily, in most cases
it doesn't matter because the users only notice the issue because of the error
message. To avoid spamming the user's log, let's ratelimit it.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
doc/user/touchpad-jumping-cursors.rst
src/evdev-mt-touchpad.c
src/evdev-mt-touchpad.h

index d09cd4445a827132f18b9cd1707a56b2aa06a456..50df67150039cae6e91f29b49ee7442d1ae814d3 100644 (file)
@@ -14,6 +14,9 @@ position.
 When libinput detects a cursor jump it prints a bug warning to the log with
 the text **"Touch jump detected and discarded."** and a link to this page.
 
+.. note:: This warning is ratelimited and will stop appearing after a few
+         times, even if the touchpad jumps continue.
+
 In most cases, this is a bug in the kernel driver and to libinput it appears
 that the touch point moves from its previous position. The pointer jump can
 usually be seen in the :ref:`libinput record <libinput-record>` output for the device:
index c3da8f9dd5ecac658e89703b96cb5ae4b8c89ea2..38745cdfb6590963c30439d674be5a4b10704b73 100644 (file)
@@ -1718,10 +1718,11 @@ tp_process_state(struct tp_dispatch *tp, uint64_t time)
 
                if (tp_detect_jumps(tp, t, time)) {
                        if (!tp->semi_mt)
-                               evdev_log_bug_kernel(tp->device,
-                                              "Touch jump detected and discarded.\n"
-                                              "See %stouchpad-jumping-cursors.html for details\n",
-                                              HTTP_DOC_LINK);
+                               evdev_log_bug_kernel_ratelimit(tp->device,
+                                               &tp->jump.warning,
+                                               "Touch jump detected and discarded.\n"
+                                               "See %stouchpad-jumping-cursors.html for details\n",
+                                               HTTP_DOC_LINK);
                        tp_motion_history_reset(t);
                }
 
@@ -3581,6 +3582,9 @@ tp_init(struct tp_dispatch *tp,
        if (!use_touch_size)
                tp_init_pressure(tp, device);
 
+       /* 5 warnings per 2 hours should be enough */
+       ratelimit_init(&tp->jump.warning, s2us(2 * 60 * 60), 5);
+
        /* Set the dpi to that of the x axis, because that's what we normalize
           to when needed*/
        device->dpi = device->abs.absinfo_x->resolution * 25.4;
index 0099c0ae275349ac9732bd24537704ceb18ef818..b981a61092ea03716054dd9880486d746ba792b4 100644 (file)
@@ -279,6 +279,10 @@ struct tp_dispatch {
         */
        unsigned int fake_touches;
 
+       struct {
+               struct ratelimit warning;
+       } jump;
+
        /* if pressure goes above high -> touch down,
           if pressure then goes below low -> touch up */
        struct {