* [PATCH] Input: Optimize input_to_handler and input_pass_values function
@ 2014-12-30 5:33 Anshul, Garg
0 siblings, 0 replies; 4+ messages in thread
From: Anshul, Garg @ 2014-12-30 5:33 UTC (permalink / raw)
To: dmitry.torokhov, dtor, linux-input; +Cc: aksgarg1989, anshul.g, p.shailesh
From: Anshul Garg <anshul.g@samsung.com>
As input_pass_values function is called everytime when EV_SYN is sent from
input driver or input event buffer becomes full.
1. In case of regular handler, event filter code should not run so added check
whether handler supports filter or not.
2. If input device doesn't support EV_KEY event type avoid running auto repeat code.
Signed-off-by: Anshul Garg <anshul.g@samsung.com>
---
drivers/input/input.c | 37 +++++++++++++++++++++----------------
1 file changed, 21 insertions(+), 16 deletions(-)
diff --git a/drivers/input/input.c b/drivers/input/input.c
index bbec2dc..9d6609b 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,10 @@ 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)
count = input_to_handler(handle, vals, count);
+ else
+ break;
}
rcu_read_unlock();
@@ -152,12 +155,14 @@ static void input_pass_values(struct input_dev *dev,
add_input_randomness(vals->type, vals->code, vals->value);
/* trigger auto repeat for key events */
- for (v = vals; v != vals + count; v++) {
- if (v->type == EV_KEY && v->value != 2) {
- if (v->value)
- input_start_autorepeat(dev, v->code);
- else
- input_stop_autorepeat(dev);
+ if (test_bit(EV_KEY, dev->evbit)) {
+ for (v = vals; v != vals + count; v++) {
+ if (v->type == EV_KEY && v->value != 2) {
+ if (v->value)
+ input_start_autorepeat(dev, v->code);
+ else
+ input_stop_autorepeat(dev);
+ }
}
}
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH] Input: Optimize input_to_handler and input_pass_values function
@ 2014-12-30 5:49 anshul.g
2015-01-04 22:57 ` Dmitry Torokhov
0 siblings, 1 reply; 4+ messages in thread
From: anshul.g @ 2014-12-30 5:49 UTC (permalink / raw)
To: dmitry.torokhov, dtor, linux-input; +Cc: aksgarg1989, anshul.g, p.shailesh
From: Anshul Garg <anshul.g@samsung.com>
As input_pass_values function is called everytime when EV_SYN is sent from
input driver or input event buffer becomes full.
1. In case of regular handler, event filter code should not run so added check
whether handler supports filter or not.
2. If input device doesn't support EV_KEY event type avoid running auto repeat code.
Signed-off-by: Anshul Garg <anshul.g@samsung.com>
---
drivers/input/input.c | 37 +++++++++++++++++++++----------------
1 file changed, 21 insertions(+), 16 deletions(-)
diff --git a/drivers/input/input.c b/drivers/input/input.c
index bbec2dc..9d6609b 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,10 @@ 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)
count = input_to_handler(handle, vals, count);
+ else
+ break;
}
rcu_read_unlock();
@@ -152,12 +155,14 @@ static void input_pass_values(struct input_dev *dev,
add_input_randomness(vals->type, vals->code, vals->value);
/* trigger auto repeat for key events */
- for (v = vals; v != vals + count; v++) {
- if (v->type == EV_KEY && v->value != 2) {
- if (v->value)
- input_start_autorepeat(dev, v->code);
- else
- input_stop_autorepeat(dev);
+ if (test_bit(EV_KEY, dev->evbit)) {
+ for (v = vals; v != vals + count; v++) {
+ if (v->type == EV_KEY && v->value != 2) {
+ if (v->value)
+ input_start_autorepeat(dev, v->code);
+ else
+ input_stop_autorepeat(dev);
+ }
}
}
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] Input: Optimize input_to_handler and input_pass_values function
2014-12-30 5:49 [PATCH] Input: Optimize input_to_handler and input_pass_values function anshul.g
@ 2015-01-04 22:57 ` Dmitry Torokhov
2015-01-05 16:10 ` Anshul Garg
0 siblings, 1 reply; 4+ messages in thread
From: Dmitry Torokhov @ 2015-01-04 22:57 UTC (permalink / raw)
To: anshul.g; +Cc: linux-input, aksgarg1989, p.shailesh
On Tue, Dec 30, 2014 at 11:19:53AM +0530, anshul.g@samsung.com wrote:
> From: Anshul Garg <anshul.g@samsung.com>
>
> As input_pass_values function is called everytime when EV_SYN is sent from
> input driver or input event buffer becomes full.
>
> 1. In case of regular handler, event filter code should not run so added check
> whether handler supports filter or not.
> 2. If input device doesn't support EV_KEY event type avoid running auto repeat code.
Can you please split it in 2 patches?
>
> Signed-off-by: Anshul Garg <anshul.g@samsung.com>
> ---
> drivers/input/input.c | 37 +++++++++++++++++++++----------------
> 1 file changed, 21 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/input/input.c b/drivers/input/input.c
> index bbec2dc..9d6609b 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,10 @@ 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)
> count = input_to_handler(handle, vals, count);
> + else
> + break;
This is not correct. You'll stop delivering events at the very first
closed handle, which is not what we want. We need:
if (handle->open) {
count = input_to_handler(handle, vals, count);
if (count == 0)
break;
}
> }
>
> rcu_read_unlock();
> @@ -152,12 +155,14 @@ static void input_pass_values(struct input_dev *dev,
> add_input_randomness(vals->type, vals->code, vals->value);
>
> /* trigger auto repeat for key events */
> - for (v = vals; v != vals + count; v++) {
> - if (v->type == EV_KEY && v->value != 2) {
> - if (v->value)
> - input_start_autorepeat(dev, v->code);
> - else
> - input_stop_autorepeat(dev);
> + if (test_bit(EV_KEY, dev->evbit)) {
You might want to test for presence of EV_REP as well.
> + for (v = vals; v != vals + count; v++) {
> + if (v->type == EV_KEY && v->value != 2) {
> + if (v->value)
> + input_start_autorepeat(dev, v->code);
> + else
> + input_stop_autorepeat(dev);
> + }
> }
> }
> }
> --
> 1.7.9.5
>
Thanks.
--
Dmitry
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] Input: Optimize input_to_handler and input_pass_values function
2015-01-04 22:57 ` Dmitry Torokhov
@ 2015-01-05 16:10 ` Anshul Garg
0 siblings, 0 replies; 4+ messages in thread
From: Anshul Garg @ 2015-01-05 16:10 UTC (permalink / raw)
To: Dmitry Torokhov; +Cc: anshul.g@samsung.com, linux-input, p.shailesh
Dear Mr Dimtry ,
Thanks for the suggestions.
I will send you the updated patch soon.
On Mon, Jan 5, 2015 at 4:27 AM, Dmitry Torokhov
<dmitry.torokhov@gmail.com> wrote:
> On Tue, Dec 30, 2014 at 11:19:53AM +0530, anshul.g@samsung.com wrote:
>> From: Anshul Garg <anshul.g@samsung.com>
>>
>> As input_pass_values function is called everytime when EV_SYN is sent from
>> input driver or input event buffer becomes full.
>>
>> 1. In case of regular handler, event filter code should not run so added check
>> whether handler supports filter or not.
>> 2. If input device doesn't support EV_KEY event type avoid running auto repeat code.
>
> Can you please split it in 2 patches?
>
>>
>> Signed-off-by: Anshul Garg <anshul.g@samsung.com>
>> ---
>> drivers/input/input.c | 37 +++++++++++++++++++++----------------
>> 1 file changed, 21 insertions(+), 16 deletions(-)
>>
>> diff --git a/drivers/input/input.c b/drivers/input/input.c
>> index bbec2dc..9d6609b 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,10 @@ 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)
>> count = input_to_handler(handle, vals, count);
>> + else
>> + break;
>
> This is not correct. You'll stop delivering events at the very first
> closed handle, which is not what we want. We need:
>
> if (handle->open) {
> count = input_to_handler(handle, vals, count);
> if (count == 0)
> break;
> }
>
>> }
>>
>> rcu_read_unlock();
>> @@ -152,12 +155,14 @@ static void input_pass_values(struct input_dev *dev,
>> add_input_randomness(vals->type, vals->code, vals->value);
>>
>> /* trigger auto repeat for key events */
>> - for (v = vals; v != vals + count; v++) {
>> - if (v->type == EV_KEY && v->value != 2) {
>> - if (v->value)
>> - input_start_autorepeat(dev, v->code);
>> - else
>> - input_stop_autorepeat(dev);
>> + if (test_bit(EV_KEY, dev->evbit)) {
>
> You might want to test for presence of EV_REP as well.
>
>> + for (v = vals; v != vals + count; v++) {
>> + if (v->type == EV_KEY && v->value != 2) {
>> + if (v->value)
>> + input_start_autorepeat(dev, v->code);
>> + else
>> + input_stop_autorepeat(dev);
>> + }
>> }
>> }
>> }
>> --
>> 1.7.9.5
>>
>
> Thanks.
>
> --
> Dmitry
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2015-01-05 16:10 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-12-30 5:49 [PATCH] Input: Optimize input_to_handler and input_pass_values function anshul.g
2015-01-04 22:57 ` Dmitry Torokhov
2015-01-05 16:10 ` Anshul Garg
-- strict thread matches above, loose matches on Subject: below --
2014-12-30 5:33 Anshul, Garg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).