On 3/10/20 1:20 PM, Andy Shevchenko wrote: > Compiler is not happy about using ARRAY_SIZE() in comparison to smaller type: > > CC drivers/tty/serial/serial_core.o > .../serial_core.c: In function ‘uart_try_toggle_sysrq’: > .../serial_core.c:3222:24: warning: comparison is always false due to limited range of data type [-Wtype-limits] > 3222 | if (++port->sysrq_seq < (ARRAY_SIZE(sysrq_toggle_seq) - 1)) { > | ^ > > Looking at the code it appears that there is an additional weirdness, > i.e. use ARRAY_SIZE() against simple string literal. Yes, the idea probably > was to allow '\0' in the sequence, but it's impractical: kernel configuration > won't accept it to begin with followed by a comment about '\0' before > comparison in question. > > Drop all these by switching to strlen() and convert code accordingly. > > Fixes: 68af43173d3f ("serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE") > Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> Reviewed-by: Dmitry Safonov <0x7f454c46@xxxxxxxxx> Thanks! > --- > drivers/tty/serial/serial_core.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c > index aec98db45406..ec3b833e9f22 100644 > --- a/drivers/tty/serial/serial_core.c > +++ b/drivers/tty/serial/serial_core.c > @@ -3209,7 +3209,9 @@ static DECLARE_WORK(sysrq_enable_work, uart_sysrq_on); > */ > static bool uart_try_toggle_sysrq(struct uart_port *port, unsigned int ch) > { > - if (ARRAY_SIZE(sysrq_toggle_seq) <= 1) > + int sysrq_toggle_seq_len = strlen(sysrq_toggle_seq); > + > + if (!sysrq_toggle_seq_len) > return false; > > BUILD_BUG_ON(ARRAY_SIZE(sysrq_toggle_seq) >= U8_MAX); > @@ -3218,8 +3220,7 @@ static bool uart_try_toggle_sysrq(struct uart_port *port, unsigned int ch) > return false; > } > > - /* Without the last \0 */ > - if (++port->sysrq_seq < (ARRAY_SIZE(sysrq_toggle_seq) - 1)) { > + if (++port->sysrq_seq < sysrq_toggle_seq_len) { > port->sysrq = jiffies + SYSRQ_TIMEOUT; > return true; > } > -- Dima