mirror of
https://github.com/torvalds/linux.git
synced 2026-06-06 13:37:36 +02:00
HID: multitouch: Add memory barriers
commitbe6e2b5734upstream. This fixes broken atomic checks which cause a race between the release-timer and processing of hid input. I noticed that contacts were sometimes sticking, even with the "sticky fingers" quirk enabled. This fixes that problem. Cc: stable@vger.kernel.org Fixes:9609827458("HID: multitouch: optimize the sticky fingers timer") Signed-off-by: Andri Yngvason <andri@yngvason.is> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Link: https://lore.kernel.org/r/20220907150159.2285460-1-andri@yngvason.is Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
bfe60d7641
commit
5b1a56beb6
|
|
@ -1155,7 +1155,7 @@ static void mt_touch_report(struct hid_device *hid,
|
||||||
int contact_count = -1;
|
int contact_count = -1;
|
||||||
|
|
||||||
/* sticky fingers release in progress, abort */
|
/* sticky fingers release in progress, abort */
|
||||||
if (test_and_set_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags))
|
if (test_and_set_bit_lock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
scantime = *app->scantime;
|
scantime = *app->scantime;
|
||||||
|
|
@ -1236,7 +1236,7 @@ static void mt_touch_report(struct hid_device *hid,
|
||||||
del_timer(&td->release_timer);
|
del_timer(&td->release_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
clear_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags);
|
clear_bit_unlock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mt_touch_input_configured(struct hid_device *hdev,
|
static int mt_touch_input_configured(struct hid_device *hdev,
|
||||||
|
|
@ -1671,11 +1671,11 @@ static void mt_expired_timeout(struct timer_list *t)
|
||||||
* An input report came in just before we release the sticky fingers,
|
* An input report came in just before we release the sticky fingers,
|
||||||
* it will take care of the sticky fingers.
|
* it will take care of the sticky fingers.
|
||||||
*/
|
*/
|
||||||
if (test_and_set_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags))
|
if (test_and_set_bit_lock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags))
|
||||||
return;
|
return;
|
||||||
if (test_bit(MT_IO_FLAGS_PENDING_SLOTS, &td->mt_io_flags))
|
if (test_bit(MT_IO_FLAGS_PENDING_SLOTS, &td->mt_io_flags))
|
||||||
mt_release_contacts(hdev);
|
mt_release_contacts(hdev);
|
||||||
clear_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags);
|
clear_bit_unlock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user