* [REGRESSION] disabling and re-enabling magic sysrq fails after kernel 6.11 @ 2024-10-27 2:15 Ned T. Crigler 2024-10-27 14:06 ` Christian Heusel 0 siblings, 1 reply; 9+ messages in thread From: Ned T. Crigler @ 2024-10-27 2:15 UTC (permalink / raw) To: Dmitry Torokhov; +Cc: linux-input, linux-kernel, regressions Hi, It looks like starting with kernel 6.11, disabling and re-enabling magic sysrq fails with these errors in dmesg: kernel: input: input_handler_check_methods: only one event processing method can be defined (sysrq) kernel: sysrq: Failed to register input handler, error -22 after doing: # echo 0 > /proc/sys/kernel/sysrq # echo 438 > /proc/sys/kernel/sysrq # echo 0 > /proc/sys/kernel/sysrq # echo 438 > /proc/sys/kernel/sysrq # echo 0 > /proc/sys/kernel/sysrq # echo 438 > /proc/sys/kernel/sysrq -- Ned T. Crigler ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [REGRESSION] disabling and re-enabling magic sysrq fails after kernel 6.11 2024-10-27 2:15 [REGRESSION] disabling and re-enabling magic sysrq fails after kernel 6.11 Ned T. Crigler @ 2024-10-27 14:06 ` Christian Heusel 2024-10-27 15:37 ` Peter Seiderer 0 siblings, 1 reply; 9+ messages in thread From: Christian Heusel @ 2024-10-27 14:06 UTC (permalink / raw) To: Ned T. Crigler Cc: Dmitry Torokhov, linux-input, linux-kernel, regressions, Jeff LaBundy, Benjamin Tissoires [-- Attachment #1: Type: text/plain, Size: 967 bytes --] On 24/10/26 07:15PM, Ned T. Crigler wrote: > Hi, Hey Ned, > It looks like starting with kernel 6.11, disabling and re-enabling > magic > sysrq fails with these errors in dmesg: > > kernel: input: input_handler_check_methods: only one event processing > method can be defined (sysrq) > kernel: sysrq: Failed to register input handler, error -22 > > after doing: > > # echo 0 > /proc/sys/kernel/sysrq > # echo 438 > /proc/sys/kernel/sysrq > # echo 0 > /proc/sys/kernel/sysrq > # echo 438 > /proc/sys/kernel/sysrq > # echo 0 > /proc/sys/kernel/sysrq > # echo 438 > /proc/sys/kernel/sysrq I have found that this issue is also present in the latest mainline release and bisected it to the following commit: d469647bafd9 ("Input: simplify event handling logic") The additional authors / maintainers have been added to the recipients lists. I hope I didn't overlook any pending fixes. > -- > Ned T. Crigler Cheers, Chris [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [REGRESSION] disabling and re-enabling magic sysrq fails after kernel 6.11 2024-10-27 14:06 ` Christian Heusel @ 2024-10-27 15:37 ` Peter Seiderer 2024-10-27 17:02 ` Ned T. Crigler 0 siblings, 1 reply; 9+ messages in thread From: Peter Seiderer @ 2024-10-27 15:37 UTC (permalink / raw) To: Christian Heusel Cc: Ned T. Crigler, Dmitry Torokhov, linux-input, linux-kernel, regressions, Jeff LaBundy, Benjamin Tissoires Hello Ned, Christian, *, On Sun, 27 Oct 2024 15:06:09 +0100, Christian Heusel <christian@heusel.eu> wrote: > On 24/10/26 07:15PM, Ned T. Crigler wrote: > > Hi, > > Hey Ned, > > > It looks like starting with kernel 6.11, disabling and re-enabling > > magic > > sysrq fails with these errors in dmesg: > > > > kernel: input: input_handler_check_methods: only one event processing > > method can be defined (sysrq) > > kernel: sysrq: Failed to register input handler, error -22 > > > > after doing: > > > > # echo 0 > /proc/sys/kernel/sysrq > > # echo 438 > /proc/sys/kernel/sysrq > > # echo 0 > /proc/sys/kernel/sysrq > > # echo 438 > /proc/sys/kernel/sysrq > > # echo 0 > /proc/sys/kernel/sysrq > > # echo 438 > /proc/sys/kernel/sysrq > > I have found that this issue is also present in the latest mainline > release and bisected it to the following commit: > > d469647bafd9 ("Input: simplify event handling logic") > After the mentioned commit a call sysrq_register_handler() --> input_register_handler(&sysrq_handler) with sysrq_handler.filter set will result in sysrq_handler.events set to input_handler_events_filter, see drivers/input/input.c (line 2607 to 2608): 2596 int input_register_handler(struct input_handler *handler) 2597 { 2598 struct input_dev *dev; 2599 int error; 2600 2601 error = input_handler_check_methods(handler); 2602 if (error) 2603 return error; 2604 2605 INIT_LIST_HEAD(&handler->h_list); 2606 2607 if (handler->filter) 2608 handler->events = input_handler_events_filter; 2609 else if (handler->event) 2610 handler->events = input_handler_events_default; 2611 else if (!handler->events) 2612 handler->events = input_handler_events_null; So the second call will fail at the check 'input_handler_check_methods(handler)' which only allows one method to be set, see drivers/input/input.c: 2517 static int input_handler_check_methods(const struct input_handler *handler) 2518 { 2519 int count = 0; 2520 2521 if (handler->filter) 2522 count++; 2523 if (handler->events) 2524 count++; 2525 if (handler->event) 2526 count++; 2527 2528 if (count > 1) { 2529 pr_err("%s: only one event processing method can be defined (%s)\n", 2530 __func__, handler->name); 2531 return -EINVAL; 2532 } 2533 2534 return 0; 2535 } A quick fix/hack for the sysrq case: --- a/drivers/tty/sysrq.c +++ b/drivers/tty/sysrq.c @@ -1045,7 +1045,7 @@ static inline void sysrq_register_handler(void) int error; sysrq_of_get_keyreset_config(); - + sysrq_handler.events = NULL; error = input_register_handler(&sysrq_handler); if (error) pr_err("Failed to register input handler, error %d", error); lines 1-13/13 (END) Regards, Peter > The additional authors / maintainers have been added to the recipients > lists. > > I hope I didn't overlook any pending fixes. > > > -- > > Ned T. Crigler > > Cheers, > Chris ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [REGRESSION] disabling and re-enabling magic sysrq fails after kernel 6.11 2024-10-27 15:37 ` Peter Seiderer @ 2024-10-27 17:02 ` Ned T. Crigler 2024-10-28 5:30 ` Dmitry Torokhov 0 siblings, 1 reply; 9+ messages in thread From: Ned T. Crigler @ 2024-10-27 17:02 UTC (permalink / raw) To: Peter Seiderer Cc: Christian Heusel, Dmitry Torokhov, linux-input, linux-kernel, regressions, Jeff LaBundy, Benjamin Tissoires Hi Peter, Christian, On Sun, Oct 27, 2024 at 04:37:44PM +0100, Peter Seiderer wrote: > Hello Ned, Christian, *, > > On Sun, 27 Oct 2024 15:06:09 +0100, Christian Heusel <christian@heusel.eu> wrote: > > > On 24/10/26 07:15PM, Ned T. Crigler wrote: > > > Hi, > > > > Hey Ned, > > > > > It looks like starting with kernel 6.11, disabling and re-enabling > > > magic > > > sysrq fails with these errors in dmesg: > > > > > > kernel: input: input_handler_check_methods: only one event processing > > > method can be defined (sysrq) > > > kernel: sysrq: Failed to register input handler, error -22 > > > > > > after doing: > > > > > > # echo 0 > /proc/sys/kernel/sysrq > > > # echo 438 > /proc/sys/kernel/sysrq > > > # echo 0 > /proc/sys/kernel/sysrq > > > # echo 438 > /proc/sys/kernel/sysrq > > > # echo 0 > /proc/sys/kernel/sysrq > > > # echo 438 > /proc/sys/kernel/sysrq > > > > I have found that this issue is also present in the latest mainline > > release and bisected it to the following commit: > > > > d469647bafd9 ("Input: simplify event handling logic") > > > > After the mentioned commit a call sysrq_register_handler() --> > input_register_handler(&sysrq_handler) with sysrq_handler.filter set > will result in sysrq_handler.events set to input_handler_events_filter, > see drivers/input/input.c (line 2607 to 2608): > > 2596 int input_register_handler(struct input_handler *handler) > 2597 { > 2598 struct input_dev *dev; > 2599 int error; > 2600 > 2601 error = input_handler_check_methods(handler); > 2602 if (error) > 2603 return error; > 2604 > 2605 INIT_LIST_HEAD(&handler->h_list); > 2606 > 2607 if (handler->filter) > 2608 handler->events = input_handler_events_filter; > 2609 else if (handler->event) > 2610 handler->events = input_handler_events_default; > 2611 else if (!handler->events) > 2612 handler->events = input_handler_events_null; > > So the second call will fail at the check 'input_handler_check_methods(handler)' > which only allows one method to be set, see drivers/input/input.c: > > 2517 static int input_handler_check_methods(const struct input_handler *handler) > 2518 { > 2519 int count = 0; > 2520 > 2521 if (handler->filter) > 2522 count++; > 2523 if (handler->events) > 2524 count++; > 2525 if (handler->event) > 2526 count++; > 2527 > 2528 if (count > 1) { > 2529 pr_err("%s: only one event processing method can be defined (%s)\n", > 2530 __func__, handler->name); > 2531 return -EINVAL; > 2532 } > 2533 > 2534 return 0; > 2535 } > > > A quick fix/hack for the sysrq case: > > --- a/drivers/tty/sysrq.c > +++ b/drivers/tty/sysrq.c > @@ -1045,7 +1045,7 @@ static inline void sysrq_register_handler(void) > int error; > > sysrq_of_get_keyreset_config(); > - > + sysrq_handler.events = NULL; > error = input_register_handler(&sysrq_handler); > if (error) > pr_err("Failed to register input handler, error %d", error); > lines 1-13/13 (END) > > Regards, > Peter > Thanks for tracking this down. It seems messy that the mentioned commit changes input_register_handler to overwrite ->events for an internal purpose, and callers may expect it to be unchanged, as sysrq does here by reusing sysrq_handler. -- Ned T. Crigler > > > The additional authors / maintainers have been added to the recipients > > lists. > > > > I hope I didn't overlook any pending fixes. > > > > > -- > > > Ned T. Crigler > > > > Cheers, > > Chris > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [REGRESSION] disabling and re-enabling magic sysrq fails after kernel 6.11 2024-10-27 17:02 ` Ned T. Crigler @ 2024-10-28 5:30 ` Dmitry Torokhov 2024-10-28 8:38 ` Peter Seiderer ` (2 more replies) 0 siblings, 3 replies; 9+ messages in thread From: Dmitry Torokhov @ 2024-10-28 5:30 UTC (permalink / raw) To: Ned T. Crigler Cc: Peter Seiderer, Christian Heusel, linux-input, linux-kernel, regressions, Jeff LaBundy, Benjamin Tissoires Hi everyone, On Sun, Oct 27, 2024 at 10:02:24AM -0700, Ned T. Crigler wrote: > Hi Peter, Christian, > > On Sun, Oct 27, 2024 at 04:37:44PM +0100, Peter Seiderer wrote: > > Hello Ned, Christian, *, > > > > On Sun, 27 Oct 2024 15:06:09 +0100, Christian Heusel <christian@heusel.eu> wrote: > > > > > On 24/10/26 07:15PM, Ned T. Crigler wrote: > > > > Hi, > > > > > > Hey Ned, > > > > > > > It looks like starting with kernel 6.11, disabling and re-enabling > > > > magic > > > > sysrq fails with these errors in dmesg: > > > > > > > > kernel: input: input_handler_check_methods: only one event processing > > > > method can be defined (sysrq) > > > > kernel: sysrq: Failed to register input handler, error -22 > > > > > > > > after doing: > > > > > > > > # echo 0 > /proc/sys/kernel/sysrq > > > > # echo 438 > /proc/sys/kernel/sysrq > > > > # echo 0 > /proc/sys/kernel/sysrq > > > > # echo 438 > /proc/sys/kernel/sysrq > > > > # echo 0 > /proc/sys/kernel/sysrq > > > > # echo 438 > /proc/sys/kernel/sysrq > > > > > > I have found that this issue is also present in the latest mainline > > > release and bisected it to the following commit: > > > > > > d469647bafd9 ("Input: simplify event handling logic") > > > > > > > After the mentioned commit a call sysrq_register_handler() --> > > input_register_handler(&sysrq_handler) with sysrq_handler.filter set > > will result in sysrq_handler.events set to input_handler_events_filter, > > see drivers/input/input.c (line 2607 to 2608): > > > > 2596 int input_register_handler(struct input_handler *handler) > > 2597 { > > 2598 struct input_dev *dev; > > 2599 int error; > > 2600 > > 2601 error = input_handler_check_methods(handler); > > 2602 if (error) > > 2603 return error; > > 2604 > > 2605 INIT_LIST_HEAD(&handler->h_list); > > 2606 > > 2607 if (handler->filter) > > 2608 handler->events = input_handler_events_filter; > > 2609 else if (handler->event) > > 2610 handler->events = input_handler_events_default; > > 2611 else if (!handler->events) > > 2612 handler->events = input_handler_events_null; > > > > So the second call will fail at the check 'input_handler_check_methods(handler)' > > which only allows one method to be set, see drivers/input/input.c: > > > > 2517 static int input_handler_check_methods(const struct input_handler *handler) > > 2518 { > > 2519 int count = 0; > > 2520 > > 2521 if (handler->filter) > > 2522 count++; > > 2523 if (handler->events) > > 2524 count++; > > 2525 if (handler->event) > > 2526 count++; > > 2527 > > 2528 if (count > 1) { > > 2529 pr_err("%s: only one event processing method can be defined (%s)\n", > > 2530 __func__, handler->name); > > 2531 return -EINVAL; > > 2532 } > > 2533 > > 2534 return 0; > > 2535 } Yes, I did not consider that we might want to re-register the same input handler, thank you for alerting me about the regression. > > > > > > A quick fix/hack for the sysrq case: > > > > --- a/drivers/tty/sysrq.c > > +++ b/drivers/tty/sysrq.c > > @@ -1045,7 +1045,7 @@ static inline void sysrq_register_handler(void) > > int error; > > > > sysrq_of_get_keyreset_config(); > > - > > + sysrq_handler.events = NULL; > > error = input_register_handler(&sysrq_handler); > > if (error) > > pr_err("Failed to register input handler, error %d", error); > > lines 1-13/13 (END) > > > > Regards, > > Peter > > > > Thanks for tracking this down. It seems messy that the mentioned commit > changes input_register_handler to overwrite ->events for an internal purpose, > and callers may expect it to be unchanged, as sysrq does here by reusing > sysrq_handler. Yes, indeed. I wonder if we can solve this by moving the derived event handler method into input_handle structure, like the patch below. Thanks. -- Dmitry diff --git a/drivers/input/input.c b/drivers/input/input.c index 3c321671793f..3d2cc13e1f32 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c @@ -119,12 +119,12 @@ static void input_pass_values(struct input_dev *dev, handle = rcu_dereference(dev->grab); if (handle) { - count = handle->handler->events(handle, vals, count); + count = handle->handle_events(handle, vals, count); } else { list_for_each_entry_rcu(handle, &dev->h_list, d_node) if (handle->open) { - count = handle->handler->events(handle, vals, - count); + count = handle->handle_events(handle, vals, + count); if (!count) break; } @@ -2537,57 +2537,6 @@ static int input_handler_check_methods(const struct input_handler *handler) return 0; } -/* - * An implementation of input_handler's events() method that simply - * invokes handler->event() method for each event one by one. - */ -static unsigned int input_handler_events_default(struct input_handle *handle, - struct input_value *vals, - unsigned int count) -{ - struct input_handler *handler = handle->handler; - struct input_value *v; - - for (v = vals; v != vals + count; v++) - handler->event(handle, v->type, v->code, v->value); - - return count; -} - -/* - * An implementation of input_handler's events() method that invokes - * handler->filter() method for each event one by one and removes events - * that were filtered out from the "vals" array. - */ -static unsigned int input_handler_events_filter(struct input_handle *handle, - struct input_value *vals, - unsigned int count) -{ - struct input_handler *handler = handle->handler; - struct input_value *end = vals; - struct input_value *v; - - for (v = vals; v != vals + count; v++) { - if (handler->filter(handle, v->type, v->code, v->value)) - continue; - if (end != v) - *end = *v; - end++; - } - - return end - vals; -} - -/* - * An implementation of input_handler's events() method that does nothing. - */ -static unsigned int input_handler_events_null(struct input_handle *handle, - struct input_value *vals, - unsigned int count) -{ - return count; -} - /** * input_register_handler - register a new input handler * @handler: handler to be registered @@ -2607,13 +2556,6 @@ int input_register_handler(struct input_handler *handler) INIT_LIST_HEAD(&handler->h_list); - if (handler->filter) - handler->events = input_handler_events_filter; - else if (handler->event) - handler->events = input_handler_events_default; - else if (!handler->events) - handler->events = input_handler_events_null; - error = mutex_lock_interruptible(&input_mutex); if (error) return error; @@ -2687,6 +2629,75 @@ int input_handler_for_each_handle(struct input_handler *handler, void *data, } EXPORT_SYMBOL(input_handler_for_each_handle); +/* + * An implementation of input_handle's handle_events() method that simply + * invokes handler->event() method for each event one by one. + */ +static unsigned int input_handle_events_default(struct input_handle *handle, + struct input_value *vals, + unsigned int count) +{ + struct input_handler *handler = handle->handler; + struct input_value *v; + + for (v = vals; v != vals + count; v++) + handler->event(handle, v->type, v->code, v->value); + + return count; +} + +/* + * An implementation of input_handle's handle_events() method that invokes + * handler->filter() method for each event one by one and removes events + * that were filtered out from the "vals" array. + */ +static unsigned int input_handle_events_filter(struct input_handle *handle, + struct input_value *vals, + unsigned int count) +{ + struct input_handler *handler = handle->handler; + struct input_value *end = vals; + struct input_value *v; + + for (v = vals; v != vals + count; v++) { + if (handler->filter(handle, v->type, v->code, v->value)) + continue; + if (end != v) + *end = *v; + end++; + } + + return end - vals; +} + +/* + * An implementation of input_handle's handle_events() method that does nothing. + */ +static unsigned int input_handle_events_null(struct input_handle *handle, + struct input_value *vals, + unsigned int count) +{ + return count; +} + +/* + * Sets up appropriate handle->event_handler based on the input_handler + * associated with the handle. + */ +static void input_handle_setup_event_handler(struct input_handle *handle) +{ + struct input_handler *handler = handle->handler; + + if (handler->filter) + handle->handle_events = input_handle_events_filter; + else if (handler->event) + handle->handle_events = input_handle_events_default; + else if (handler->events) + handle->handle_events = handler->events; + else + handle->handle_events = input_handle_events_null; +} + /** * input_register_handle - register a new input handle * @handle: handle to register @@ -2704,6 +2715,7 @@ int input_register_handle(struct input_handle *handle) struct input_dev *dev = handle->dev; int error; + input_handle_setup_event_handler(handle); /* * We take dev->mutex here to prevent race with * input_release_device(). diff --git a/include/linux/input.h b/include/linux/input.h index 89a0be6ee0e2..cd866b020a01 100644 --- a/include/linux/input.h +++ b/include/linux/input.h @@ -339,12 +339,16 @@ struct input_handler { * @name: name given to the handle by handler that created it * @dev: input device the handle is attached to * @handler: handler that works with the device through this handle + * @handle_events: event sequence handler. It is set up by the input core + * according to event handling method specified in the @handler. See + * input_handle_setup_event_handler(). + * This method is being called by the input core with interrupts disabled + * and dev->event_lock spinlock held and so it may not sleep. * @d_node: used to put the handle on device's list of attached handles * @h_node: used to put the handle on handler's list of handles from which * it gets events */ struct input_handle { - void *private; int open; @@ -353,6 +357,10 @@ struct input_handle { struct input_dev *dev; struct input_handler *handler; + unsigned int (*handle_events)(struct input_handle *handle, + struct input_value *vals, + unsigned int count); + struct list_head d_node; struct list_head h_node; }; ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [REGRESSION] disabling and re-enabling magic sysrq fails after kernel 6.11 2024-10-28 5:30 ` Dmitry Torokhov @ 2024-10-28 8:38 ` Peter Seiderer 2024-10-29 0:58 ` Ned T. Crigler 2024-11-04 12:06 ` Christian Heusel 2 siblings, 0 replies; 9+ messages in thread From: Peter Seiderer @ 2024-10-28 8:38 UTC (permalink / raw) To: Dmitry Torokhov Cc: Ned T. Crigler, Christian Heusel, linux-input, linux-kernel, regressions, Jeff LaBundy, Benjamin Tissoires Hello Dmitry, Ned, *, On Sun, 27 Oct 2024 22:30:36 -0700, Dmitry Torokhov <dmitry.torokhov@gmail.com> wrote: > Hi everyone, > > On Sun, Oct 27, 2024 at 10:02:24AM -0700, Ned T. Crigler wrote: > > Hi Peter, Christian, > > > > On Sun, Oct 27, 2024 at 04:37:44PM +0100, Peter Seiderer wrote: > > > Hello Ned, Christian, *, > > > > > > On Sun, 27 Oct 2024 15:06:09 +0100, Christian Heusel <christian@heusel.eu> wrote: > > > > > > > On 24/10/26 07:15PM, Ned T. Crigler wrote: > > > > > Hi, > > > > > > > > Hey Ned, > > > > > > > > > It looks like starting with kernel 6.11, disabling and re-enabling > > > > > magic > > > > > sysrq fails with these errors in dmesg: > > > > > > > > > > kernel: input: input_handler_check_methods: only one event processing > > > > > method can be defined (sysrq) > > > > > kernel: sysrq: Failed to register input handler, error -22 > > > > > > > > > > after doing: > > > > > > > > > > # echo 0 > /proc/sys/kernel/sysrq > > > > > # echo 438 > /proc/sys/kernel/sysrq > > > > > # echo 0 > /proc/sys/kernel/sysrq > > > > > # echo 438 > /proc/sys/kernel/sysrq > > > > > # echo 0 > /proc/sys/kernel/sysrq > > > > > # echo 438 > /proc/sys/kernel/sysrq > > > > > > > > I have found that this issue is also present in the latest mainline > > > > release and bisected it to the following commit: > > > > > > > > d469647bafd9 ("Input: simplify event handling logic") > > > > > > > > > > After the mentioned commit a call sysrq_register_handler() --> > > > input_register_handler(&sysrq_handler) with sysrq_handler.filter set > > > will result in sysrq_handler.events set to input_handler_events_filter, > > > see drivers/input/input.c (line 2607 to 2608): > > > > > > 2596 int input_register_handler(struct input_handler *handler) > > > 2597 { > > > 2598 struct input_dev *dev; > > > 2599 int error; > > > 2600 > > > 2601 error = input_handler_check_methods(handler); > > > 2602 if (error) > > > 2603 return error; > > > 2604 > > > 2605 INIT_LIST_HEAD(&handler->h_list); > > > 2606 > > > 2607 if (handler->filter) > > > 2608 handler->events = input_handler_events_filter; > > > 2609 else if (handler->event) > > > 2610 handler->events = input_handler_events_default; > > > 2611 else if (!handler->events) > > > 2612 handler->events = input_handler_events_null; > > > > > > So the second call will fail at the check 'input_handler_check_methods(handler)' > > > which only allows one method to be set, see drivers/input/input.c: > > > > > > 2517 static int input_handler_check_methods(const struct input_handler *handler) > > > 2518 { > > > 2519 int count = 0; > > > 2520 > > > 2521 if (handler->filter) > > > 2522 count++; > > > 2523 if (handler->events) > > > 2524 count++; > > > 2525 if (handler->event) > > > 2526 count++; > > > 2527 > > > 2528 if (count > 1) { > > > 2529 pr_err("%s: only one event processing method can be defined (%s)\n", > > > 2530 __func__, handler->name); > > > 2531 return -EINVAL; > > > 2532 } > > > 2533 > > > 2534 return 0; > > > 2535 } > > Yes, I did not consider that we might want to re-register the same input > handler, thank you for alerting me about the regression. > > > > > > > > > > A quick fix/hack for the sysrq case: > > > > > > --- a/drivers/tty/sysrq.c > > > +++ b/drivers/tty/sysrq.c > > > @@ -1045,7 +1045,7 @@ static inline void sysrq_register_handler(void) > > > int error; > > > > > > sysrq_of_get_keyreset_config(); > > > - > > > + sysrq_handler.events = NULL; > > > error = input_register_handler(&sysrq_handler); > > > if (error) > > > pr_err("Failed to register input handler, error %d", error); > > > lines 1-13/13 (END) > > > > > > Regards, > > > Peter > > > > > > > Thanks for tracking this down. It seems messy that the mentioned commit > > changes input_register_handler to overwrite ->events for an internal purpose, > > and callers may expect it to be unchanged, as sysrq does here by reusing > > sysrq_handler. > > Yes, indeed. I wonder if we can solve this by moving the derived event > handler method into input_handle structure, like the patch below. Yes, seems reasonable (and works for the sysrq case), you can add my Tested-by: Peter Seiderer <ps.report@gmx.net> Regards, Peter > > Thanks. > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [REGRESSION] disabling and re-enabling magic sysrq fails after kernel 6.11 2024-10-28 5:30 ` Dmitry Torokhov 2024-10-28 8:38 ` Peter Seiderer @ 2024-10-29 0:58 ` Ned T. Crigler 2024-11-04 12:06 ` Christian Heusel 2 siblings, 0 replies; 9+ messages in thread From: Ned T. Crigler @ 2024-10-29 0:58 UTC (permalink / raw) To: Dmitry Torokhov Cc: Peter Seiderer, Christian Heusel, linux-input, linux-kernel, regressions, Jeff LaBundy, Benjamin Tissoires Hi Dmitry, On Sun, Oct 27, 2024 at 10:30:36PM -0700, Dmitry Torokhov wrote: > Hi everyone, > > On Sun, Oct 27, 2024 at 10:02:24AM -0700, Ned T. Crigler wrote: > > Hi Peter, Christian, > > > > On Sun, Oct 27, 2024 at 04:37:44PM +0100, Peter Seiderer wrote: > > > Hello Ned, Christian, *, > > > > > > On Sun, 27 Oct 2024 15:06:09 +0100, Christian Heusel <christian@heusel.eu> wrote: > > > > > > > On 24/10/26 07:15PM, Ned T. Crigler wrote: > > > > > Hi, > > > > > > > > Hey Ned, > > > > > > > > > It looks like starting with kernel 6.11, disabling and re-enabling > > > > > magic > > > > > sysrq fails with these errors in dmesg: > > > > > > > > > > kernel: input: input_handler_check_methods: only one event processing > > > > > method can be defined (sysrq) > > > > > kernel: sysrq: Failed to register input handler, error -22 > > > > > > > > > > after doing: > > > > > > > > > > # echo 0 > /proc/sys/kernel/sysrq > > > > > # echo 438 > /proc/sys/kernel/sysrq > > > > > # echo 0 > /proc/sys/kernel/sysrq > > > > > # echo 438 > /proc/sys/kernel/sysrq > > > > > # echo 0 > /proc/sys/kernel/sysrq > > > > > # echo 438 > /proc/sys/kernel/sysrq > > > > > > > > I have found that this issue is also present in the latest mainline > > > > release and bisected it to the following commit: > > > > > > > > d469647bafd9 ("Input: simplify event handling logic") > > > > > > > > > > After the mentioned commit a call sysrq_register_handler() --> > > > input_register_handler(&sysrq_handler) with sysrq_handler.filter set > > > will result in sysrq_handler.events set to input_handler_events_filter, > > > see drivers/input/input.c (line 2607 to 2608): > > > > > > 2596 int input_register_handler(struct input_handler *handler) > > > 2597 { > > > 2598 struct input_dev *dev; > > > 2599 int error; > > > 2600 > > > 2601 error = input_handler_check_methods(handler); > > > 2602 if (error) > > > 2603 return error; > > > 2604 > > > 2605 INIT_LIST_HEAD(&handler->h_list); > > > 2606 > > > 2607 if (handler->filter) > > > 2608 handler->events = input_handler_events_filter; > > > 2609 else if (handler->event) > > > 2610 handler->events = input_handler_events_default; > > > 2611 else if (!handler->events) > > > 2612 handler->events = input_handler_events_null; > > > > > > So the second call will fail at the check 'input_handler_check_methods(handler)' > > > which only allows one method to be set, see drivers/input/input.c: > > > > > > 2517 static int input_handler_check_methods(const struct input_handler *handler) > > > 2518 { > > > 2519 int count = 0; > > > 2520 > > > 2521 if (handler->filter) > > > 2522 count++; > > > 2523 if (handler->events) > > > 2524 count++; > > > 2525 if (handler->event) > > > 2526 count++; > > > 2527 > > > 2528 if (count > 1) { > > > 2529 pr_err("%s: only one event processing method can be defined (%s)\n", > > > 2530 __func__, handler->name); > > > 2531 return -EINVAL; > > > 2532 } > > > 2533 > > > 2534 return 0; > > > 2535 } > > Yes, I did not consider that we might want to re-register the same input > handler, thank you for alerting me about the regression. > > > > > > > > > > A quick fix/hack for the sysrq case: > > > > > > --- a/drivers/tty/sysrq.c > > > +++ b/drivers/tty/sysrq.c > > > @@ -1045,7 +1045,7 @@ static inline void sysrq_register_handler(void) > > > int error; > > > > > > sysrq_of_get_keyreset_config(); > > > - > > > + sysrq_handler.events = NULL; > > > error = input_register_handler(&sysrq_handler); > > > if (error) > > > pr_err("Failed to register input handler, error %d", error); > > > lines 1-13/13 (END) > > > > > > Regards, > > > Peter > > > > > > > Thanks for tracking this down. It seems messy that the mentioned commit > > changes input_register_handler to overwrite ->events for an internal purpose, > > and callers may expect it to be unchanged, as sysrq does here by reusing > > sysrq_handler. > > Yes, indeed. I wonder if we can solve this by moving the derived event > handler method into input_handle structure, like the patch below. Your patch fixes the sysrq regression, thanks for the fix! Tested-by: Ned T. Crigler <crigler@gmail.com> -- Ned T. Crigler ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [REGRESSION] disabling and re-enabling magic sysrq fails after kernel 6.11 2024-10-28 5:30 ` Dmitry Torokhov 2024-10-28 8:38 ` Peter Seiderer 2024-10-29 0:58 ` Ned T. Crigler @ 2024-11-04 12:06 ` Christian Heusel 2024-11-05 5:43 ` Dmitry Torokhov 2 siblings, 1 reply; 9+ messages in thread From: Christian Heusel @ 2024-11-04 12:06 UTC (permalink / raw) To: Dmitry Torokhov Cc: Ned T. Crigler, Peter Seiderer, linux-input, linux-kernel, regressions, Jeff LaBundy, Benjamin Tissoires [-- Attachment #1: Type: text/plain, Size: 1950 bytes --] On 24/10/27 10:30PM, Dmitry Torokhov wrote: > Hi everyone, > > On Sun, Oct 27, 2024 at 10:02:24AM -0700, Ned T. Crigler wrote: > > Hi Peter, Christian, > > > > On Sun, Oct 27, 2024 at 04:37:44PM +0100, Peter Seiderer wrote: > > > Hello Ned, Christian, *, > > > > > > On Sun, 27 Oct 2024 15:06:09 +0100, Christian Heusel <christian@heusel.eu> wrote: > > > > > > > On 24/10/26 07:15PM, Ned T. Crigler wrote: > > > > > Hi, > > > > > > > > Hey Ned, > > > > > > > > > It looks like starting with kernel 6.11, disabling and re-enabling > > > > > magic > > > > > sysrq fails with these errors in dmesg: > > > > > > > > > > kernel: input: input_handler_check_methods: only one event processing > > > > > method can be defined (sysrq) > > > > > kernel: sysrq: Failed to register input handler, error -22 > > > > > > > > > > after doing: > > > > > > > > > > # echo 0 > /proc/sys/kernel/sysrq > > > > > # echo 438 > /proc/sys/kernel/sysrq > > > > > # echo 0 > /proc/sys/kernel/sysrq > > > > > # echo 438 > /proc/sys/kernel/sysrq > > > > > # echo 0 > /proc/sys/kernel/sysrq > > > > > # echo 438 > /proc/sys/kernel/sysrq > > > > > > > > I have found that this issue is also present in the latest mainline > > > > release and bisected it to the following commit: > > > > > > > > d469647bafd9 ("Input: simplify event handling logic") > > > > > > > > > Yes, I did not consider that we might want to re-register the same input > handler, thank you for alerting me about the regression. > > > > > > > > > > A quick fix/hack for the sysrq case: > > > > > > --- a/drivers/tty/sysrq.c > > > +++ b/drivers/tty/sysrq.c > > > @@ -1045,7 +1045,7 @@ static inline void sysrq_register_handler(void) > > > <snip> Thanks for the patch, are you looking to fix this in a more general way or do you plan on just sending in the above patch? (or did this already happen and I just missed it? :p) Cheers, Chris [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [REGRESSION] disabling and re-enabling magic sysrq fails after kernel 6.11 2024-11-04 12:06 ` Christian Heusel @ 2024-11-05 5:43 ` Dmitry Torokhov 0 siblings, 0 replies; 9+ messages in thread From: Dmitry Torokhov @ 2024-11-05 5:43 UTC (permalink / raw) To: Christian Heusel Cc: Ned T. Crigler, Peter Seiderer, linux-input, linux-kernel, regressions, Jeff LaBundy, Benjamin Tissoires Hi Christian, On Mon, Nov 04, 2024 at 01:06:40PM +0100, Christian Heusel wrote: > On 24/10/27 10:30PM, Dmitry Torokhov wrote: > > Hi everyone, > > > > On Sun, Oct 27, 2024 at 10:02:24AM -0700, Ned T. Crigler wrote: > > > Hi Peter, Christian, > > > > > > On Sun, Oct 27, 2024 at 04:37:44PM +0100, Peter Seiderer wrote: > > > > Hello Ned, Christian, *, > > > > > > > > On Sun, 27 Oct 2024 15:06:09 +0100, Christian Heusel <christian@heusel.eu> wrote: > > > > > > > > > On 24/10/26 07:15PM, Ned T. Crigler wrote: > > > > > > Hi, > > > > > > > > > > Hey Ned, > > > > > > > > > > > It looks like starting with kernel 6.11, disabling and re-enabling > > > > > > magic > > > > > > sysrq fails with these errors in dmesg: > > > > > > > > > > > > kernel: input: input_handler_check_methods: only one event processing > > > > > > method can be defined (sysrq) > > > > > > kernel: sysrq: Failed to register input handler, error -22 > > > > > > > > > > > > after doing: > > > > > > > > > > > > # echo 0 > /proc/sys/kernel/sysrq > > > > > > # echo 438 > /proc/sys/kernel/sysrq > > > > > > # echo 0 > /proc/sys/kernel/sysrq > > > > > > # echo 438 > /proc/sys/kernel/sysrq > > > > > > # echo 0 > /proc/sys/kernel/sysrq > > > > > > # echo 438 > /proc/sys/kernel/sysrq > > > > > > > > > > I have found that this issue is also present in the latest mainline > > > > > release and bisected it to the following commit: > > > > > > > > > > d469647bafd9 ("Input: simplify event handling logic") > > > > > > > > > > > > > Yes, I did not consider that we might want to re-register the same input > > handler, thank you for alerting me about the regression. > > > > > > > > > > > > > > A quick fix/hack for the sysrq case: > > > > > > > > --- a/drivers/tty/sysrq.c > > > > +++ b/drivers/tty/sysrq.c > > > > @@ -1045,7 +1045,7 @@ static inline void sysrq_register_handler(void) > > > > <snip> > > Thanks for the patch, are you looking to fix this in a more general way > or do you plan on just sending in the above patch? (or did this already > happen and I just missed it? :p) I applied the patch that I proposed and Peter and Ned tested. I am not sure about what you mean by fixing this in a more general way, could you please elaborate? Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2024-11-05 5:43 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-10-27 2:15 [REGRESSION] disabling and re-enabling magic sysrq fails after kernel 6.11 Ned T. Crigler 2024-10-27 14:06 ` Christian Heusel 2024-10-27 15:37 ` Peter Seiderer 2024-10-27 17:02 ` Ned T. Crigler 2024-10-28 5:30 ` Dmitry Torokhov 2024-10-28 8:38 ` Peter Seiderer 2024-10-29 0:58 ` Ned T. Crigler 2024-11-04 12:06 ` Christian Heusel 2024-11-05 5:43 ` Dmitry Torokhov
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).