Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp912651ybl; Fri, 10 Jan 2020 08:48:06 -0800 (PST) X-Google-Smtp-Source: APXvYqzgEoo/5gEq7856yeQYrKz80v0QzmrC7kIoB+mKZBdtu7BzrKNDJXwD8gRNpMzGJyASk5hA X-Received: by 2002:a9d:4796:: with SMTP id b22mr3157110otf.353.1578674886141; Fri, 10 Jan 2020 08:48:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578674886; cv=none; d=google.com; s=arc-20160816; b=otiHCxDrm9pDyQ7NVVAsBH6fvNeQwnkpIhrswSt2eJQw9w9R9sJkN9glWskNAj+nsV b6/zQ86dIZyUprRzLDAXeoQeFu32ShjUoW3AH3AXmIQrcBIalZN2JVoieroqTFMJaiai 4p74OVO1gz59fSAhkCiH4mymwh96jzChIlAP3fNo6POBuQTSN8mCzSZy28SW7laObcTb DOtTxz/O2EWyCVRchjqpLwdHm8e2Ui2zqIe4E8yMaqBaOsZWRHz178PogQQNjml1hhlX oDTHlhByU+cN3mSaB3gdTJrlZFviBNOS4gSGXGICbVkpIZMLOtZcVVNlkesM0JjyxgWi XaDw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :dkim-signature; bh=oOj96mJ0YXFyBK0JV4a449MroEhfoHL75A1AQ+he6dk=; b=X2mXKp2o03IUXP4hq2SXeXlnpAHi3Osyx3gr2kHcJZH5TxXhO1yyM5pinzvCKHYEeN Pp9ftLOxO0ckgyQaBk64W4ao4+Gfe8MKJzpYnsl4tylE9zAGpSyFbuZBnTBxSMNur+H5 /RyG7MxbyYRJMZ67yS0J3uhHuR6qCidjOxwi8RMvTKweT18S7CkAk5kEsUhKFRyZv2QU Q0wqmovuzDDlrbH8eL1QjcwU4jyMQZFB4ZAUQ4CKDAC7j6/IUQcx12LPf29Q4QIXlz+Y Hg7I1Dvf8mPms/HU6W1lMmm3EhHThzg9pfpDc+oHOHUJstr3dt3vOb5RwBji3oJldPaY twMw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=C6qapw4F; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e24si1485171otl.62.2020.01.10.08.47.54; Fri, 10 Jan 2020 08:48:06 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=C6qapw4F; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728936AbgAJQqq (ORCPT + 99 others); Fri, 10 Jan 2020 11:46:46 -0500 Received: from mail.kernel.org ([198.145.29.99]:46950 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728542AbgAJQqq (ORCPT ); Fri, 10 Jan 2020 11:46:46 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 2313E206ED; Fri, 10 Jan 2020 16:46:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1578674805; bh=Q/Krz5L+BywpaikQwEhNbMRsDEYYow+J/SrLX6ewYgQ=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=C6qapw4FSUm8G59HZSFHuh7wITftQUYHbB9z1x0GHpLzHlao5WNjcBK3Iz0Vo1+Pq SMKJn8i2w9EUbERHVRA+ByX51UowC2/LKSZZgKh9Ey3KBtm6n5ZN9nO4Vs5V1763FX y3fRHs+j4rKAby/QG6P4yvnp163bsNFbsygjdQ5M= Date: Fri, 10 Jan 2020 17:46:43 +0100 From: Greg Kroah-Hartman To: Dmitry Safonov Cc: linux-kernel@vger.kernel.org, Dmitry Safonov <0x7f454c46@gmail.com>, Jiri Slaby , Vasiliy Khoruzhick , linux-serial@vger.kernel.org Subject: Re: [PATCH-next 3/3] serial/sysrq: Add MAGIC_SYSRQ_SERIAL_SEQUENCE Message-ID: <20200110164643.GB1822445@kroah.com> References: <20200109215444.95995-1-dima@arista.com> <20200109215444.95995-4-dima@arista.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200109215444.95995-4-dima@arista.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Jan 09, 2020 at 09:54:44PM +0000, Dmitry Safonov wrote: > 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 > Signed-off-by: Dmitry Safonov > --- > drivers/tty/serial/serial_core.c | 52 ++++++++++++++++++++++++++++---- > include/linux/serial_core.h | 2 +- > lib/Kconfig.debug | 8 +++++ > 3 files changed, 55 insertions(+), 7 deletions(-) > > diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c > index 6ac9dfed3423..f70eba032d0b 100644 > --- a/drivers/tty/serial/serial_core.c > +++ b/drivers/tty/serial/serial_core.c > @@ -3081,6 +3081,38 @@ void uart_insert_char(struct uart_port *port, unsigned int status, > } > EXPORT_SYMBOL_GPL(uart_insert_char); > > +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 sequience on serial\n"); Do we want to say what serial port it is enabled on? And why is this done in a workqueue? > +} > +static DECLARE_WORK(sysrq_enable_work, uart_sysrq_on); > + > +static int uart_try_toggle_sysrq(struct uart_port *port, unsigned int ch) > +{ > + if (sysrq_toggle_seq[0] == '\0') > + return 0; Is constantly checking the data stream like this going to slow things down overall? Ah, we are just checking this after BREAK, right? So that hopefully will not be that bad... > + > + BUILD_BUG_ON(ARRAY_SIZE(sysrq_toggle_seq) >= sizeof(port->sysrq_seq)*U8_MAX); > + if (sysrq_toggle_seq[port->sysrq_seq] != ch) { > + port->sysrq_seq = 0; > + return 0; > + } > + > + /* Without the last \0 */ > + if (++port->sysrq_seq < (ARRAY_SIZE(sysrq_toggle_seq) - 1)) { > + port->sysrq = jiffies + HZ*5; 5 second delay? You should document what this value is for somewhere here... > + return 1; > + } > + > + schedule_work(&sysrq_enable_work); > + > + port->sysrq = 0; > + return 1; > +} > + > int uart_handle_sysrq_char(struct uart_port *port, unsigned int ch) > { > if (!IS_ENABLED(CONFIG_MAGIC_SYSRQ_SERIAL)) > @@ -3090,9 +3122,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_get_mask()) { > + handle_sysrq(ch); > + port->sysrq = 0; > + return 1; > + } Isn't this change to test for sysrq_get_mask() a different change than checking for the "magic" data stream? > + if (uart_try_toggle_sysrq(port, ch)) > + return 1; > } > port->sysrq = 0; > > @@ -3109,9 +3145,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_get_mask()) { > + port->sysrq_ch = ch; > + port->sysrq = 0; > + return 1; > + } > + if (uart_try_toggle_sysrq(port, ch)) > + return 1; > } > port->sysrq = 0; > > diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h > index 255e86a474e9..1f4443db5474 100644 > --- a/include/linux/serial_core.h > +++ b/include/linux/serial_core.h > @@ -243,10 +243,10 @@ 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; > - unsigned char unused; This is an unrelated change, let's leave it for a different patch that cleans up the layout of this structure, ok? thanks, greg k-h