提交 e8ef4347 编写于 作者: D Dmitry Torokhov

Input: serio - remove pending events when unregistering driver

That fixes an opps when driver is repeatedly loaded and unloaded in
a tight loop.
Tested-by: NRoland Kletzing <devzero@web.de>
Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
上级 f6d65610
...@@ -331,9 +331,10 @@ static void serio_handle_event(void) ...@@ -331,9 +331,10 @@ static void serio_handle_event(void)
} }
/* /*
* Remove all events that have been submitted for a given serio port. * Remove all events that have been submitted for a given
* object, be it serio port or driver.
*/ */
static void serio_remove_pending_events(struct serio *serio) static void serio_remove_pending_events(void *object)
{ {
struct list_head *node, *next; struct list_head *node, *next;
struct serio_event *event; struct serio_event *event;
...@@ -343,7 +344,7 @@ static void serio_remove_pending_events(struct serio *serio) ...@@ -343,7 +344,7 @@ static void serio_remove_pending_events(struct serio *serio)
list_for_each_safe(node, next, &serio_event_list) { list_for_each_safe(node, next, &serio_event_list) {
event = list_entry(node, struct serio_event, node); event = list_entry(node, struct serio_event, node);
if (event->object == serio) { if (event->object == object) {
list_del_init(node); list_del_init(node);
serio_free_event(event); serio_free_event(event);
} }
...@@ -837,7 +838,9 @@ void serio_unregister_driver(struct serio_driver *drv) ...@@ -837,7 +838,9 @@ void serio_unregister_driver(struct serio_driver *drv)
struct serio *serio; struct serio *serio;
mutex_lock(&serio_mutex); mutex_lock(&serio_mutex);
drv->manual_bind = 1; /* so serio_find_driver ignores it */ drv->manual_bind = 1; /* so serio_find_driver ignores it */
serio_remove_pending_events(drv);
start_over: start_over:
list_for_each_entry(serio, &serio_list, node) { list_for_each_entry(serio, &serio_list, node) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册