summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnshul Garg <aksgarg1989@gmail.com>2015-01-08 22:47:37 +0100
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2015-01-08 22:53:34 +0100
commit2c50ad340c246b7f58f2d916006afe2d85d60698 (patch)
treeb810cc1e06366b50eaba8d5ef71f71758b99c87a
parentInput: small tweak to autorepeat handling (diff)
downloadlinux-2c50ad340c246b7f58f2d916006afe2d85d60698.tar.xz
linux-2c50ad340c246b7f58f2d916006afe2d85d60698.zip
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>
-rw-r--r--drivers/input/input.c24
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();