diff options
author | Anshul Garg <aksgarg1989@gmail.com> | 2015-01-08 13:47:37 -0800 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2015-01-08 13:53:34 -0800 |
commit | 2c50ad340c246b7f58f2d916006afe2d85d60698 (patch) | |
tree | b810cc1e06366b50eaba8d5ef71f71758b99c87a /drivers/input/input.c | |
parent | 5ab17145708e6ad4582b0372fb3a171be3379293 (diff) |
Input: do not try to filter out events if handler is not a filter
If given input handler is not a filter there is no point is iterating list
of events in a packet to see if some of them need to be filtered out.
Signed-off-by: Anshul Garg <anshul.g@samsung.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input/input.c')
-rw-r--r-- | drivers/input/input.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/input/input.c b/drivers/input/input.c index 26199abee36c..cc357f1516a7 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c @@ -100,23 +100,24 @@ static unsigned int input_to_handler(struct input_handle *handle, struct input_value *end = vals; struct input_value *v; - for (v = vals; v != vals + count; v++) { - if (handler->filter && - handler->filter(handle, v->type, v->code, v->value)) - continue; - if (end != v) - *end = *v; - end++; + if (handler->filter) { + for (v = vals; v != vals + count; v++) { + if (handler->filter(handle, v->type, v->code, v->value)) + continue; + if (end != v) + *end = *v; + end++; + } + count = end - vals; } - count = end - vals; if (!count) return 0; if (handler->events) handler->events(handle, vals, count); else if (handler->event) - for (v = vals; v != end; v++) + for (v = vals; v != vals + count; v++) handler->event(handle, v->type, v->code, v->value); return count; @@ -143,8 +144,11 @@ static void input_pass_values(struct input_dev *dev, count = input_to_handler(handle, vals, count); } else { list_for_each_entry_rcu(handle, &dev->h_list, d_node) - if (handle->open) + if (handle->open) { count = input_to_handler(handle, vals, count); + if (!count) + break; + } } rcu_read_unlock(); |