* [PATCHv3 0/2] serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE @ 2020-03-02 17:51 Dmitry Safonov 2020-03-02 17:51 ` [PATCHv3 1/2] sysctl/sysrq: Remove __sysrq_enabled copy Dmitry Safonov 2020-03-02 17:51 ` [PATCHv3 2/2] serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE Dmitry Safonov 0 siblings, 2 replies; 9+ messages in thread From: Dmitry Safonov @ 2020-03-02 17:51 UTC (permalink / raw) To: linux-kernel Cc: Dmitry Safonov, Dmitry Safonov, Greg Kroah-Hartman, Iurii Zaikin, Jiri Slaby, Joe Perches, Randy Dunlap, Vasiliy Khoruzhick, linux-serial, Luis Chamberlain, Kees Cook, linux-fsdevel Magic sysrq has proven for Arista usecases to be useful for debugging issues in field, over serial line when the switch is in such bad state that it can't accept network connections anymore. Unfortunately, having sysrq always enabled doesn't work for some embedded boards that tend to generate garbage on serial line (including BREAKs). Since commit 732dbf3a6104 ("serial: do not accept sysrq characters via serial port"), it's possible to keep sysrq enabled, but over serial line. Add a way to enable sysrq on a uart, where currently it can be constantly either on or off (CONFIG_MAGIC_SYSRQ_SERIAL). While doing so, cleanup __sysrq_enabled and serial_core header file. Changes since v2 [2]: - sysrq_get_mask() renamed to sysrq_mask() as there isn't sysrq_put_mask(); acquired kernel-doc (by Greg's review, thanks) - uart_try_toggle_sysrq() now returns true/false instead 1/0 as it's a bool function (nits by Joe Perches, thanks!) - Dropped "sizeof(port->sysrq_seq)*U8_MAX" and used U8_MAX (Randy Dunlap) Changes since v1 [1]: - Fix typo in pr_info() message (noticed by Randy Dunlap, thanks) - Add SYSRQ_TIMEOUT define for timeout after BREAK and separate removing @unused member of uart_port into cleanup patch (by Greg's review, thanks) - Add const qualifier, make uart_try_toggle_sysrq() bool function (Joe Perches, thanks) - Fix !CONFIG_SYSRQ and CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" build failures (kudos to kbuild test robot) [1]: https://lkml.kernel.org/r/20200109215444.95995-1-dima@arista.com [2]: https://lkml.kernel.org/r/20200114171912.261787-1-dima@arista.com Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Iurii Zaikin <yzaikin@google.com> Cc: Jiri Slaby <jslaby@suse.com> Cc: Joe Perches <joe@perches.com> Cc: Randy Dunlap <rdunlap@infradead.org> Cc: Vasiliy Khoruzhick <vasilykh@arista.com> Cc: linux-serial@vger.kernel.org Thanks, Dmitry Dmitry Safonov (2): sysctl/sysrq: Remove __sysrq_enabled copy serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE drivers/tty/serial/serial_core.c | 75 +++++++++++++++++++++++++++++--- drivers/tty/sysrq.c | 12 +++++ include/linux/serial_core.h | 1 + include/linux/sysrq.h | 7 +++ kernel/sysctl.c | 41 +++++++++-------- lib/Kconfig.debug | 8 ++++ 6 files changed, 118 insertions(+), 26 deletions(-) -- 2.25.0 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCHv3 1/2] sysctl/sysrq: Remove __sysrq_enabled copy 2020-03-02 17:51 [PATCHv3 0/2] serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE Dmitry Safonov @ 2020-03-02 17:51 ` Dmitry Safonov 2020-04-01 12:22 ` Michael Ellerman 2020-03-02 17:51 ` [PATCHv3 2/2] serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE Dmitry Safonov 1 sibling, 1 reply; 9+ messages in thread From: Dmitry Safonov @ 2020-03-02 17:51 UTC (permalink / raw) To: linux-kernel Cc: Dmitry Safonov, Dmitry Safonov, Greg Kroah-Hartman, Iurii Zaikin, Jiri Slaby, Joe Perches, Randy Dunlap, Vasiliy Khoruzhick, linux-serial, Luis Chamberlain, Kees Cook, linux-fsdevel Many embedded boards have a disconnected TTL level serial which can generate some garbage that can lead to spurious false sysrq detects. Currently, sysrq can be either completely disabled for serial console or always disabled (with CONFIG_MAGIC_SYSRQ_SERIAL), since commit 732dbf3a6104 ("serial: do not accept sysrq characters via serial port") At Arista, we have such boards that can generate BREAK and random garbage. While disabling sysrq for serial console would solve the problem with spurious false sysrq triggers, it's also desirable to have a way to enable sysrq back. Having the way to enable sysrq was beneficial to debug lockups with a manual investigation in field and on the other side preventing false sysrq detections. As a preparation to add sysrq_toggle_support() call into uart, remove a private copy of sysrq_enabled from sysctl - it should reflect the actual status of sysrq. Furthermore, the private copy isn't correct already in case sysrq_always_enabled is true. So, remove __sysrq_enabled and use a getter-helper sysrq_mask() to check sysrq_key_op enabled status. Cc: Iurii Zaikin <yzaikin@google.com> Cc: Jiri Slaby <jslaby@suse.com> Cc: Luis Chamberlain <mcgrof@kernel.org> Cc: Kees Cook <keescook@chromium.org> Cc: linux-fsdevel@vger.kernel.org Signed-off-by: Dmitry Safonov <dima@arista.com> --- drivers/tty/sysrq.c | 12 ++++++++++++ include/linux/sysrq.h | 7 +++++++ kernel/sysctl.c | 41 ++++++++++++++++++++++------------------- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c index f724962a5906..5e0d0813da55 100644 --- a/drivers/tty/sysrq.c +++ b/drivers/tty/sysrq.c @@ -63,6 +63,18 @@ static bool sysrq_on(void) return sysrq_enabled || sysrq_always_enabled; } +/** + * sysrq_mask - Getter for sysrq_enabled mask. + * + * Return: 1 if sysrq is always enabled, enabled sysrq_key_op mask otherwise. + */ +int sysrq_mask(void) +{ + if (sysrq_always_enabled) + return 1; + return sysrq_enabled; +} + /* * A value of 1 means 'all', other nonzero values are an op mask: */ diff --git a/include/linux/sysrq.h b/include/linux/sysrq.h index 8c71874e8485..8e159e16850f 100644 --- a/include/linux/sysrq.h +++ b/include/linux/sysrq.h @@ -50,6 +50,7 @@ int unregister_sysrq_key(int key, struct sysrq_key_op *op); struct sysrq_key_op *__sysrq_get_key_op(int key); int sysrq_toggle_support(int enable_mask); +int sysrq_mask(void); #else @@ -71,6 +72,12 @@ static inline int unregister_sysrq_key(int key, struct sysrq_key_op *op) return -EINVAL; } +static inline int sysrq_mask(void) +{ + /* Magic SysRq disabled mask */ + return 0; +} + #endif #endif /* _LINUX_SYSRQ_H */ diff --git a/kernel/sysctl.c b/kernel/sysctl.c index ad5b88a53c5a..94638f695e60 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -229,25 +229,8 @@ static int proc_dopipe_max_size(struct ctl_table *table, int write, void __user *buffer, size_t *lenp, loff_t *ppos); #ifdef CONFIG_MAGIC_SYSRQ -/* Note: sysrq code uses its own private copy */ -static int __sysrq_enabled = CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE; - static int sysrq_sysctl_handler(struct ctl_table *table, int write, - void __user *buffer, size_t *lenp, - loff_t *ppos) -{ - int error; - - error = proc_dointvec(table, write, buffer, lenp, ppos); - if (error) - return error; - - if (write) - sysrq_toggle_support(__sysrq_enabled); - - return 0; -} - + void __user *buffer, size_t *lenp, loff_t *ppos); #endif static struct ctl_table kern_table[]; @@ -747,7 +730,7 @@ static struct ctl_table kern_table[] = { #ifdef CONFIG_MAGIC_SYSRQ { .procname = "sysrq", - .data = &__sysrq_enabled, + .data = NULL, .maxlen = sizeof (int), .mode = 0644, .proc_handler = sysrq_sysctl_handler, @@ -2835,6 +2818,26 @@ static int proc_dostring_coredump(struct ctl_table *table, int write, } #endif +#ifdef CONFIG_MAGIC_SYSRQ +static int sysrq_sysctl_handler(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) +{ + int tmp, ret; + + tmp = sysrq_mask(); + + ret = __do_proc_dointvec(&tmp, table, write, buffer, + lenp, ppos, NULL, NULL); + if (ret || !write) + return ret; + + if (write) + sysrq_toggle_support(tmp); + + return 0; +} +#endif + static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int write, void __user *buffer, size_t *lenp, loff_t *ppos, -- 2.25.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCHv3 1/2] sysctl/sysrq: Remove __sysrq_enabled copy 2020-03-02 17:51 ` [PATCHv3 1/2] sysctl/sysrq: Remove __sysrq_enabled copy Dmitry Safonov @ 2020-04-01 12:22 ` Michael Ellerman 2020-04-01 14:41 ` Dmitry Safonov 0 siblings, 1 reply; 9+ messages in thread From: Michael Ellerman @ 2020-04-01 12:22 UTC (permalink / raw) To: Dmitry Safonov, linux-kernel Cc: Dmitry Safonov, Dmitry Safonov, Greg Kroah-Hartman, Iurii Zaikin, Jiri Slaby, Joe Perches, Randy Dunlap, Vasiliy Khoruzhick, linux-serial, Luis Chamberlain, Kees Cook, linux-fsdevel Dmitry Safonov <dima@arista.com> writes: > Many embedded boards have a disconnected TTL level serial which can > generate some garbage that can lead to spurious false sysrq detects. > > Currently, sysrq can be either completely disabled for serial console > or always disabled (with CONFIG_MAGIC_SYSRQ_SERIAL), since > commit 732dbf3a6104 ("serial: do not accept sysrq characters via serial port") > > At Arista, we have such boards that can generate BREAK and random > garbage. While disabling sysrq for serial console would solve > the problem with spurious false sysrq triggers, it's also desirable > to have a way to enable sysrq back. > > Having the way to enable sysrq was beneficial to debug lockups with > a manual investigation in field and on the other side preventing false > sysrq detections. > > As a preparation to add sysrq_toggle_support() call into uart, > remove a private copy of sysrq_enabled from sysctl - it should reflect > the actual status of sysrq. > > Furthermore, the private copy isn't correct already in case > sysrq_always_enabled is true. So, remove __sysrq_enabled and use a > getter-helper sysrq_mask() to check sysrq_key_op enabled status. > > Cc: Iurii Zaikin <yzaikin@google.com> > Cc: Jiri Slaby <jslaby@suse.com> > Cc: Luis Chamberlain <mcgrof@kernel.org> > Cc: Kees Cook <keescook@chromium.org> > Cc: linux-fsdevel@vger.kernel.org > Signed-off-by: Dmitry Safonov <dima@arista.com> > --- > drivers/tty/sysrq.c | 12 ++++++++++++ > include/linux/sysrq.h | 7 +++++++ > kernel/sysctl.c | 41 ++++++++++++++++++++++------------------- > 3 files changed, 41 insertions(+), 19 deletions(-) > > diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c > index f724962a5906..5e0d0813da55 100644 > --- a/drivers/tty/sysrq.c > +++ b/drivers/tty/sysrq.c > @@ -63,6 +63,18 @@ static bool sysrq_on(void) > return sysrq_enabled || sysrq_always_enabled; > } > > +/** > + * sysrq_mask - Getter for sysrq_enabled mask. > + * > + * Return: 1 if sysrq is always enabled, enabled sysrq_key_op mask otherwise. > + */ > +int sysrq_mask(void) > +{ > + if (sysrq_always_enabled) > + return 1; > + return sysrq_enabled; > +} This seems to have broken several configs, when serial_core is modular, with: ERROR: modpost: "sysrq_mask" [drivers/tty/serial/serial_core.ko] undefined! See: http://kisskb.ellerman.id.au/kisskb/buildresult/14169386/ It's also being reported by the kernelci bot: https://lore.kernel.org/linux-next/5e677bd0.1c69fb81.c43fe.7f7d@mx.google.com/ cheers ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCHv3 1/2] sysctl/sysrq: Remove __sysrq_enabled copy 2020-04-01 12:22 ` Michael Ellerman @ 2020-04-01 14:41 ` Dmitry Safonov 0 siblings, 0 replies; 9+ messages in thread From: Dmitry Safonov @ 2020-04-01 14:41 UTC (permalink / raw) To: Michael Ellerman, linux-kernel Cc: Dmitry Safonov, Greg Kroah-Hartman, Iurii Zaikin, Jiri Slaby, Joe Perches, Randy Dunlap, Vasiliy Khoruzhick, linux-serial, Luis Chamberlain, Kees Cook, linux-fsdevel Hi Michael, On 4/1/20 1:22 PM, Michael Ellerman wrote: [..] >> >> +/** >> + * sysrq_mask - Getter for sysrq_enabled mask. >> + * >> + * Return: 1 if sysrq is always enabled, enabled sysrq_key_op mask otherwise. >> + */ >> +int sysrq_mask(void) >> +{ >> + if (sysrq_always_enabled) >> + return 1; >> + return sysrq_enabled; >> +} > > This seems to have broken several configs, when serial_core is modular, with: > > ERROR: modpost: "sysrq_mask" [drivers/tty/serial/serial_core.ko] undefined! > > See: > > http://kisskb.ellerman.id.au/kisskb/buildresult/14169386/ > > It's also being reported by the kernelci bot: > > https://lore.kernel.org/linux-next/5e677bd0.1c69fb81.c43fe.7f7d@mx.google.com/ Thanks for reporting this, I've reproduced it and sent a fix: https://lkml.kernel.org/r/20200401143904.423450-1-dima@arista.com Thanks, Dmitry ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCHv3 2/2] serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE 2020-03-02 17:51 [PATCHv3 0/2] serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE Dmitry Safonov 2020-03-02 17:51 ` [PATCHv3 1/2] sysctl/sysrq: Remove __sysrq_enabled copy Dmitry Safonov @ 2020-03-02 17:51 ` Dmitry Safonov 2020-03-03 4:31 ` kbuild test robot 2020-03-06 12:55 ` Greg Kroah-Hartman 1 sibling, 2 replies; 9+ messages in thread From: Dmitry Safonov @ 2020-03-02 17:51 UTC (permalink / raw) To: linux-kernel Cc: Dmitry Safonov, Dmitry Safonov, Greg Kroah-Hartman, Iurii Zaikin, Jiri Slaby, Joe Perches, Randy Dunlap, Vasiliy Khoruzhick, linux-serial Many embedded boards have a disconnected TTL level serial which can generate some garbage that can lead to spurious false sysrq detects. Currently, sysrq can be either completely disabled for serial console or always disabled (with CONFIG_MAGIC_SYSRQ_SERIAL), since commit 732dbf3a6104 ("serial: do not accept sysrq characters via serial port") At Arista, we have such boards that can generate BREAK and random garbage. While disabling sysrq for serial console would solve the problem with spurious false sysrq triggers, it's also desirable to have a way to enable sysrq back. As a measure of balance between on and off options, add MAGIC_SYSRQ_SERIAL_SEQUENCE which is a string sequence that can enable sysrq if it follows BREAK on a serial line. The longer the string - the less likely it may be in the garbage. Having the way to enable sysrq was beneficial to debug lockups with a manual investigation in field and on the other side preventing false sysrq detections. Based-on-patch-by: Vasiliy Khoruzhick <vasilykh@arista.com> Signed-off-by: Dmitry Safonov <dima@arista.com> --- drivers/tty/serial/serial_core.c | 75 +++++++++++++++++++++++++++++--- include/linux/serial_core.h | 1 + lib/Kconfig.debug | 8 ++++ 3 files changed, 77 insertions(+), 7 deletions(-) diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c index 76e506ee335c..83151da74a15 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c @@ -20,6 +20,7 @@ #include <linux/device.h> #include <linux/serial.h> /* for serial_state and serial_icounter_struct */ #include <linux/serial_core.h> +#include <linux/sysrq.h> #include <linux/delay.h> #include <linux/mutex.h> #include <linux/security.h> @@ -40,6 +41,8 @@ static struct lock_class_key port_lock_key; #define HIGH_BITS_OFFSET ((sizeof(long)-sizeof(int))*8) +#define SYSRQ_TIMEOUT (HZ * 5) + static void uart_change_speed(struct tty_struct *tty, struct uart_state *state, struct ktermios *old_termios); static void uart_wait_until_sent(struct tty_struct *tty, int timeout); @@ -3082,6 +3085,56 @@ void uart_insert_char(struct uart_port *port, unsigned int status, } EXPORT_SYMBOL_GPL(uart_insert_char); +#ifdef CONFIG_MAGIC_SYSRQ_SERIAL +static const char sysrq_toggle_seq[] = CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE; + +static void uart_sysrq_on(struct work_struct *w) +{ + sysrq_toggle_support(1); + pr_info("SysRq is enabled by magic sequence on serial\n"); +} +static DECLARE_WORK(sysrq_enable_work, uart_sysrq_on); + +/** + * uart_try_toggle_sysrq - Enables SysRq from serial line + * @port: uart_port structure where char(s) after BREAK met + * @ch: new character in the sequence after received BREAK + * + * Enables magic SysRq when the required sequence is met on port + * (see CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE). + * + * Returns false if @ch is out of enabling sequence and should be + * handled some other way, true if @ch was consumed. + */ +static bool uart_try_toggle_sysrq(struct uart_port *port, unsigned int ch) +{ + if (ARRAY_SIZE(sysrq_toggle_seq) <= 1) + return false; + + BUILD_BUG_ON(ARRAY_SIZE(sysrq_toggle_seq) >= U8_MAX); + if (sysrq_toggle_seq[port->sysrq_seq] != ch) { + port->sysrq_seq = 0; + return false; + } + + /* Without the last \0 */ + if (++port->sysrq_seq < (ARRAY_SIZE(sysrq_toggle_seq) - 1)) { + port->sysrq = jiffies + SYSRQ_TIMEOUT; + return true; + } + + schedule_work(&sysrq_enable_work); + + port->sysrq = 0; + return true; +} +#else +static inline bool uart_try_toggle_sysrq(struct uart_port *port, unsigned int ch) +{ + return false; +} +#endif + int uart_handle_sysrq_char(struct uart_port *port, unsigned int ch) { if (!IS_ENABLED(CONFIG_MAGIC_SYSRQ_SERIAL)) @@ -3091,9 +3144,13 @@ int uart_handle_sysrq_char(struct uart_port *port, unsigned int ch) return 0; if (ch && time_before(jiffies, port->sysrq)) { - handle_sysrq(ch); - port->sysrq = 0; - return 1; + if (sysrq_mask()) { + handle_sysrq(ch); + port->sysrq = 0; + return 1; + } + if (uart_try_toggle_sysrq(port, ch)) + return 1; } port->sysrq = 0; @@ -3110,9 +3167,13 @@ int uart_prepare_sysrq_char(struct uart_port *port, unsigned int ch) return 0; if (ch && time_before(jiffies, port->sysrq)) { - port->sysrq_ch = ch; - port->sysrq = 0; - return 1; + if (sysrq_mask()) { + port->sysrq_ch = ch; + port->sysrq = 0; + return 1; + } + if (uart_try_toggle_sysrq(port, ch)) + return 1; } port->sysrq = 0; @@ -3152,7 +3213,7 @@ int uart_handle_break(struct uart_port *port) if (port->has_sysrq) { if (port->cons && port->cons->index == port->line) { if (!port->sysrq) { - port->sysrq = jiffies + HZ*5; + port->sysrq = jiffies + SYSRQ_TIMEOUT; return 1; } port->sysrq = 0; diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index 52404ef1694e..1f4443db5474 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -243,6 +243,7 @@ struct uart_port { unsigned long sysrq; /* sysrq timeout */ unsigned int sysrq_ch; /* char for sysrq */ unsigned char has_sysrq; + unsigned char sysrq_seq; /* index in sysrq_toggle_seq */ unsigned char hub6; /* this should be in the 8250 driver */ unsigned char suspended; diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 69def4a9df00..38a8f3c99579 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -431,6 +431,14 @@ config MAGIC_SYSRQ_SERIAL This option allows you to decide whether you want to enable the magic SysRq key. +config MAGIC_SYSRQ_SERIAL_SEQUENCE + string "Char sequence that enables magic SysRq over serial" + depends on MAGIC_SYSRQ_SERIAL + default "" + help + Specifies a sequence of characters that can follow BREAK to enable + SysRq on a serial console. + config DEBUG_FS bool "Debug Filesystem" help -- 2.25.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCHv3 2/2] serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE 2020-03-02 17:51 ` [PATCHv3 2/2] serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE Dmitry Safonov @ 2020-03-03 4:31 ` kbuild test robot 2020-03-03 18:06 ` Dmitry Safonov 2020-03-06 12:55 ` Greg Kroah-Hartman 1 sibling, 1 reply; 9+ messages in thread From: kbuild test robot @ 2020-03-03 4:31 UTC (permalink / raw) To: Dmitry Safonov; +Cc: kbuild-all, linux-kernel Hi Dmitry, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on tty/tty-testing] [also build test WARNING on usb/usb-testing linus/master v5.6-rc4 next-20200302] [cannot apply to linux/master] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system. BTW, we also suggest to use '--base' option to specify the base tree in git format-patch, please see https://stackoverflow.com/a/37406982] url: https://github.com/0day-ci/linux/commits/Dmitry-Safonov/serial-sysrq-Add-MAGIC_SYSRQ_SERIAL_SEQUENCE/20200303-041809 base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git tty-testing If you fix the issue, kindly add following tag Reported-by: kbuild test robot <lkp@intel.com> New smatch warnings: drivers/tty/serial/serial_core.c:3123 uart_try_toggle_sysrq() warn: unsigned '++port->sysrq_seq' is never less than zero. Old smatch warnings: drivers/tty/serial/serial_core.c:298 uart_shutdown() error: we previously assumed 'uport' could be null (see line 294) drivers/tty/serial/serial_core.c:2741 iomem_base_show() warn: argument 4 to %lX specifier is cast from pointer vim +3123 drivers/tty/serial/serial_core.c 3099 3100 /** 3101 * uart_try_toggle_sysrq - Enables SysRq from serial line 3102 * @port: uart_port structure where char(s) after BREAK met 3103 * @ch: new character in the sequence after received BREAK 3104 * 3105 * Enables magic SysRq when the required sequence is met on port 3106 * (see CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE). 3107 * 3108 * Returns false if @ch is out of enabling sequence and should be 3109 * handled some other way, true if @ch was consumed. 3110 */ 3111 static bool uart_try_toggle_sysrq(struct uart_port *port, unsigned int ch) 3112 { 3113 if (ARRAY_SIZE(sysrq_toggle_seq) <= 1) 3114 return false; 3115 3116 BUILD_BUG_ON(ARRAY_SIZE(sysrq_toggle_seq) >= U8_MAX); 3117 if (sysrq_toggle_seq[port->sysrq_seq] != ch) { 3118 port->sysrq_seq = 0; 3119 return false; 3120 } 3121 3122 /* Without the last \0 */ > 3123 if (++port->sysrq_seq < (ARRAY_SIZE(sysrq_toggle_seq) - 1)) { 3124 port->sysrq = jiffies + SYSRQ_TIMEOUT; 3125 return true; 3126 } 3127 3128 schedule_work(&sysrq_enable_work); 3129 3130 port->sysrq = 0; 3131 return true; 3132 } 3133 #else 3134 static inline bool uart_try_toggle_sysrq(struct uart_port *port, unsigned int ch) 3135 { 3136 return false; 3137 } 3138 #endif 3139 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCHv3 2/2] serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE 2020-03-03 4:31 ` kbuild test robot @ 2020-03-03 18:06 ` Dmitry Safonov 0 siblings, 0 replies; 9+ messages in thread From: Dmitry Safonov @ 2020-03-03 18:06 UTC (permalink / raw) To: kbuild test robot; +Cc: kbuild-all, linux-kernel On 3/3/20 4:31 AM, kbuild test robot wrote: > Hi Dmitry, [..] > New smatch warnings: > drivers/tty/serial/serial_core.c:3123 uart_try_toggle_sysrq() warn: unsigned '++port->sysrq_seq' is never less than zero. False-positive as just a few lines above: : if (ARRAY_SIZE(sysrq_toggle_seq) <= 1) : return false; I hope it's fine just to ignore this rather than complicate anyhow code to suppress the warning. Thanks, Dmitry ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCHv3 2/2] serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE 2020-03-02 17:51 ` [PATCHv3 2/2] serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE Dmitry Safonov 2020-03-03 4:31 ` kbuild test robot @ 2020-03-06 12:55 ` Greg Kroah-Hartman 2020-03-06 14:50 ` Dmitry Safonov 1 sibling, 1 reply; 9+ messages in thread From: Greg Kroah-Hartman @ 2020-03-06 12:55 UTC (permalink / raw) To: Dmitry Safonov Cc: linux-kernel, Dmitry Safonov, Iurii Zaikin, Jiri Slaby, Joe Perches, Randy Dunlap, Vasiliy Khoruzhick, linux-serial On Mon, Mar 02, 2020 at 05:51:35PM +0000, Dmitry Safonov wrote: > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug > index 69def4a9df00..38a8f3c99579 100644 > --- a/lib/Kconfig.debug > +++ b/lib/Kconfig.debug > @@ -431,6 +431,14 @@ config MAGIC_SYSRQ_SERIAL > This option allows you to decide whether you want to enable the > magic SysRq key. > > +config MAGIC_SYSRQ_SERIAL_SEQUENCE > + string "Char sequence that enables magic SysRq over serial" > + depends on MAGIC_SYSRQ_SERIAL > + default "" > + help > + Specifies a sequence of characters that can follow BREAK to enable > + SysRq on a serial console. Can you send a follow-on patch that adds some more text here. Something like : If you do not know what to do, just select an empty string and the option will not be enabled. or something like that to make it more obvious what almost everyone will want to do here. thanks, greg k-h ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCHv3 2/2] serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE 2020-03-06 12:55 ` Greg Kroah-Hartman @ 2020-03-06 14:50 ` Dmitry Safonov 0 siblings, 0 replies; 9+ messages in thread From: Dmitry Safonov @ 2020-03-06 14:50 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: linux-kernel, Dmitry Safonov, Iurii Zaikin, Jiri Slaby, Joe Perches, Randy Dunlap, Vasiliy Khoruzhick, linux-serial On 3/6/20 12:55 PM, Greg Kroah-Hartman wrote: > On Mon, Mar 02, 2020 at 05:51:35PM +0000, Dmitry Safonov wrote: >> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug >> index 69def4a9df00..38a8f3c99579 100644 >> --- a/lib/Kconfig.debug >> +++ b/lib/Kconfig.debug >> @@ -431,6 +431,14 @@ config MAGIC_SYSRQ_SERIAL >> This option allows you to decide whether you want to enable the >> magic SysRq key. >> >> +config MAGIC_SYSRQ_SERIAL_SEQUENCE >> + string "Char sequence that enables magic SysRq over serial" >> + depends on MAGIC_SYSRQ_SERIAL >> + default "" >> + help >> + Specifies a sequence of characters that can follow BREAK to enable >> + SysRq on a serial console. > > > Can you send a follow-on patch that adds some more text here. Something > like : > If you do not know what to do, just select an empty string and > the option will not be enabled. > > or something like that to make it more obvious what almost everyone will > want to do here. Oh yes, makes sense, will send a patch. Thanks, Dmitry ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2020-04-01 14:41 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-03-02 17:51 [PATCHv3 0/2] serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE Dmitry Safonov 2020-03-02 17:51 ` [PATCHv3 1/2] sysctl/sysrq: Remove __sysrq_enabled copy Dmitry Safonov 2020-04-01 12:22 ` Michael Ellerman 2020-04-01 14:41 ` Dmitry Safonov 2020-03-02 17:51 ` [PATCHv3 2/2] serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE Dmitry Safonov 2020-03-03 4:31 ` kbuild test robot 2020-03-03 18:06 ` Dmitry Safonov 2020-03-06 12:55 ` Greg Kroah-Hartman 2020-03-06 14:50 ` Dmitry Safonov
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).