Re: [PATCH] Input: serio - clear serio event queue after sysfs driver rebind
From: Duncan Laurie <hidden>
Date: 2011-02-02 22:41:59
Also in:
lkml
On Tue, Feb 1, 2011 at 1:21 AM, Dmitry Torokhov [off-list ref] wrote:
On Tue, Dec 07, 2010 at 09:12:11PM -0800, Dmitry Torokhov wrote:quoted
On Mon, Nov 29, 2010 at 01:37:35PM -0800, Duncan Laurie wrote:quoted
On Sat, Nov 27, 2010 at 12:41 AM, Dmitry Torokhov [off-list ref] wrote:quoted
Hi Duncan, On Mon, Nov 22, 2010 at 03:09:50PM -0800, Duncan Laurie wrote:quoted
When rebinding a serio driver via sysfs drvctl interface it is possible for an interrupt to trigger after the disconnect of the existing driver and before the binding of the new driver. This will cause the serio interrupt handler to queue a rescan event which will disconnect the new driver immediately after it is attached. This change clears the serio event queue after processing the drvctl request but before releasing the serio mutex, which will clear any queued rescans before they can get processed. Reproduction involves issuing a rebind of device port from psmouse driver to serio_raw driver while generating input to trigger interrupts. Then checking to see if the corresponding i8042/serio4/driver is correctly attached to the serio_raw driver instead of psmouse. Signed-off-by: Duncan Laurie <redacted> --- drivers/input/serio/serio.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c index 405bf21..a66307e 100644 --- a/drivers/input/serio/serio.c +++ b/drivers/input/serio/serio.c@@ -454,6 +454,7 @@ static ssize_t serio_rebind_driver(struct device *dev, struct device_attribute *serio_disconnect_port(serio); error = serio_bind_driver(serio, to_serio_driver(drv)); put_driver(drv); + serio_remove_pending_events(serio);Hmm, makes sense, although should we limit events being removed to rescan events only?That seems reasonable. It would mean adding a new function or a parameter to the existing serio_remove_pending_events function, do you have a preference?I wonder if a boolean parameter (rescan_only) would not be the best option.Hi Duncan, I eneded up with the following patch, could you please try and see if it still works for you?
Hi Dmitry, I tested the patch on a CR-48 device (which is where I was seeing the problem because we switch to serio_raw at boot for the trackpad) and it does fix the problem. Thanks for sending this, it had slipped off my todo list. -duncan -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html