All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3.7+] HID: magicmouse: fix race between input_register() and probe()
@ 2013-04-02  9:11 Benjamin Tissoires
  2013-04-04  7:51 ` Jiri Kosina
  0 siblings, 1 reply; 3+ messages in thread
From: Benjamin Tissoires @ 2013-04-02  9:11 UTC (permalink / raw)
  To: Benjamin Tissoires, Jiri Kosina, linux-input, linux-kernel
  Cc: Benjamin Tissoires

Since kernel 3.7, it appears that the input registration occured before
the end of magicmouse_setup_input(). This is shown by receiving a lot of
"EV_SYN SYN_REPORT 1" instead of normal "EV_SYN SYN_REPORT 0".
This value means that the output buffer is full, and the user space
is loosing events.

Using .input_configured guarantees that the race is not occuring, and that
the call of "input_set_events_per_packet(input, 60)" is taken into account
by input_register().

Fixes:
https://bugzilla.redhat.com/show_bug.cgi?id=908604

Reported-and-Tested-By: Clarke Wixon <cwixon@usa.net>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
---

Hi Jiri,

this one can goes to stable (so 3.8) as well.

Cheers,
Benjamin

 drivers/hid/hid-magicmouse.c | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c
index ef89573..5bc3734 100644
--- a/drivers/hid/hid-magicmouse.c
+++ b/drivers/hid/hid-magicmouse.c
@@ -461,6 +461,21 @@ static int magicmouse_input_mapping(struct hid_device *hdev,
 	return 0;
 }
 
+static void magicmouse_input_configured(struct hid_device *hdev,
+		struct hid_input *hi)
+
+{
+	struct magicmouse_sc *msc = hid_get_drvdata(hdev);
+
+	int ret = magicmouse_setup_input(msc->input, hdev);
+	if (ret) {
+		hid_err(hdev, "magicmouse setup input failed (%d)\n", ret);
+		/* clean msc->input to notify probe() of the failure */
+		msc->input = NULL;
+	}
+}
+
+
 static int magicmouse_probe(struct hid_device *hdev,
 	const struct hid_device_id *id)
 {
@@ -492,15 +507,10 @@ static int magicmouse_probe(struct hid_device *hdev,
 		goto err_free;
 	}
 
-	/* We do this after hid-input is done parsing reports so that
-	 * hid-input uses the most natural button and axis IDs.
-	 */
-	if (msc->input) {
-		ret = magicmouse_setup_input(msc->input, hdev);
-		if (ret) {
-			hid_err(hdev, "magicmouse setup input failed (%d)\n", ret);
-			goto err_stop_hw;
-		}
+	if (!msc->input) {
+		hid_err(hdev, "magicmouse input not registered\n");
+		ret = -ENOMEM;
+		goto err_stop_hw;
 	}
 
 	if (id->product == USB_DEVICE_ID_APPLE_MAGICMOUSE)
@@ -567,6 +577,7 @@ static struct hid_driver magicmouse_driver = {
 	.remove = magicmouse_remove,
 	.raw_event = magicmouse_raw_event,
 	.input_mapping = magicmouse_input_mapping,
+	.input_configured = magicmouse_input_configured,
 };
 module_hid_driver(magicmouse_driver);
 
-- 
1.8.1.4


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v3.7+] HID: magicmouse: fix race between input_register() and probe()
  2013-04-02  9:11 [PATCH v3.7+] HID: magicmouse: fix race between input_register() and probe() Benjamin Tissoires
@ 2013-04-04  7:51 ` Jiri Kosina
  2013-04-04  7:52   ` Benjamin Tissoires
  0 siblings, 1 reply; 3+ messages in thread
From: Jiri Kosina @ 2013-04-04  7:51 UTC (permalink / raw)
  To: Benjamin Tissoires; +Cc: Benjamin Tissoires, linux-input, linux-kernel

On Tue, 2 Apr 2013, Benjamin Tissoires wrote:

> Since kernel 3.7, it appears that the input registration occured before
> the end of magicmouse_setup_input(). This is shown by receiving a lot of
> "EV_SYN SYN_REPORT 1" instead of normal "EV_SYN SYN_REPORT 0".
> This value means that the output buffer is full, and the user space
> is loosing events.
> 
> Using .input_configured guarantees that the race is not occuring, and that
> the call of "input_set_events_per_packet(input, 60)" is taken into account
> by input_register().
> 
> Fixes:
> https://bugzilla.redhat.com/show_bug.cgi?id=908604
> 
> Reported-and-Tested-By: Clarke Wixon <cwixon@usa.net>
> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
> ---
> 
> Hi Jiri,
> 
> this one can goes to stable (so 3.8) as well.

Applied, and will push for 3.9 still.

Thanks.

-- 
Jiri Kosina
SUSE Labs

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v3.7+] HID: magicmouse: fix race between input_register() and probe()
  2013-04-04  7:51 ` Jiri Kosina
@ 2013-04-04  7:52   ` Benjamin Tissoires
  0 siblings, 0 replies; 3+ messages in thread
From: Benjamin Tissoires @ 2013-04-04  7:52 UTC (permalink / raw)
  To: Jiri Kosina; +Cc: Benjamin Tissoires, linux-input, linux-kernel

On 04/04/2013 09:51 AM, Jiri Kosina wrote:
> On Tue, 2 Apr 2013, Benjamin Tissoires wrote:
> 
>> Since kernel 3.7, it appears that the input registration occured before
>> the end of magicmouse_setup_input(). This is shown by receiving a lot of
>> "EV_SYN SYN_REPORT 1" instead of normal "EV_SYN SYN_REPORT 0".
>> This value means that the output buffer is full, and the user space
>> is loosing events.
>>
>> Using .input_configured guarantees that the race is not occuring, and that
>> the call of "input_set_events_per_packet(input, 60)" is taken into account
>> by input_register().
>>
>> Fixes:
>> https://bugzilla.redhat.com/show_bug.cgi?id=908604
>>
>> Reported-and-Tested-By: Clarke Wixon <cwixon@usa.net>
>> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
>> ---
>>
>> Hi Jiri,
>>
>> this one can goes to stable (so 3.8) as well.
> 
> Applied, and will push for 3.9 still.

Ok, thanks Jiri.

Cheers,
Benjamin

> 
> Thanks.
> 


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-04-04  7:52 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-04-02  9:11 [PATCH v3.7+] HID: magicmouse: fix race between input_register() and probe() Benjamin Tissoires
2013-04-04  7:51 ` Jiri Kosina
2013-04-04  7:52   ` Benjamin Tissoires

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.