Input: do not try to filter out events if handler is not a filter
authorAnshul Garg <aksgarg1989@gmail.com>
Thu, 8 Jan 2015 21:47:37 +0000 (13:47 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 8 Jan 2015 21:53:34 +0000 (13:53 -0800)
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>
drivers/input/input.c

index 26199abee36c6e6ad6febb9cc90c3a25dc864942..cc357f1516a78c14ec9a279cce8c1dfe9ac53d1a 100644 (file)
@@ -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();