From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.9 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0F487C3F2CD for ; Mon, 2 Mar 2020 17:51:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CD4342173E for ; Mon, 2 Mar 2020 17:51:47 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=arista.com header.i=@arista.com header.b="cY3FpIMe" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727401AbgCBRvq (ORCPT ); Mon, 2 Mar 2020 12:51:46 -0500 Received: from mail-wm1-f65.google.com ([209.85.128.65]:54416 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727196AbgCBRvq (ORCPT ); Mon, 2 Mar 2020 12:51:46 -0500 Received: by mail-wm1-f65.google.com with SMTP id z12so226624wmi.4 for ; Mon, 02 Mar 2020 09:51:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arista.com; s=googlenew; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=6Kx8nmukttqpHZuRHsPDhtzyv3nWI/Y/L038RHlsnVE=; b=cY3FpIMeyInIz2doBDLxFNAFHqc1qD0znP6ZLavRTpcOQcgXbOs42hRxp/v3oCNQTC gNZMqt0kIvodHf6h1byZ/YfxeVdI9edWJH/rNJ/eiwnWkhz+WE7JsS/+QuczW+PrTEEb C94HRXntlxPyf8uzT1p4+Lfr7XHukd6lFAJR/rsjNyAKcZ0IsnYXOBQeNuXiVlRf+AVA wW4ydVDlTj89sbZMiF9VnmL2IBus+WHKWJ5p1UDZ2Ayixu/1FOoAwOxAFUaF4R0JuCKm QnjRugMytS0vjHaljWCNKaJdIPUYkY+eFg1UxLq0EIj16qbO2eXh7HGtIUeu4FvsPGj3 /C/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=6Kx8nmukttqpHZuRHsPDhtzyv3nWI/Y/L038RHlsnVE=; b=Ps/5fk7SKkhqy8cS8kjjC3k/lrbnHj/20vEnSffkS2+9lkAyc/vqEx9vJpgd8nKqj6 aiUro/bKkfJ9mfRHbqkkBFRpCyKzQY5+GybP5jH4l2kctCJHCRv5ZCFZyNpYl3nvrZiv vJU7sxJGa6qZukFZ+MiyxGWQCr9rv2L6KEL+Efp+L/YDuMNRGidT/VZ5kLQ9z7SYrKDH BYEkrtzr5WdIZ7uTKhMzdXqHgCofhxu36L6qFQC6rQHs4RzZXZ2Dt5v5DePO8UFrZ5uQ h+ACdXQgZlmFq9iEemkdLcvdjqAR4MnbOKUImB5sDDdG3radZNS8v7bsiKuBTFrvaFVS tEKg== X-Gm-Message-State: ANhLgQ0iEaHymzZbcFr5NUb1Ghd50u9s1JH2Fmdz/cocJmH3izWLFV1t 4R3OeGcAyNMWGgp0Ee79+B7ebBZ2iDQ= X-Google-Smtp-Source: ADFU+vtgPa2Arj/pPLh1i+Bqz7hGA3XBaKwKSk813DrexkuAYMePD9J51tk5ngXW0YRa/3R5XgCfXg== X-Received: by 2002:a7b:cb46:: with SMTP id v6mr238182wmj.0.1583171503168; Mon, 02 Mar 2020 09:51:43 -0800 (PST) Received: from Mindolluin.ire.aristanetworks.com ([217.173.96.166]) by smtp.gmail.com with ESMTPSA id b10sm163234wmh.48.2020.03.02.09.51.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2020 09:51:42 -0800 (PST) From: Dmitry Safonov To: linux-kernel@vger.kernel.org Cc: Dmitry Safonov <0x7f454c46@gmail.com>, Dmitry Safonov , Greg Kroah-Hartman , Iurii Zaikin , Jiri Slaby , Joe Perches , Randy Dunlap , Vasiliy Khoruzhick , linux-serial@vger.kernel.org, Luis Chamberlain , Kees Cook , linux-fsdevel@vger.kernel.org Subject: [PATCHv3 1/2] sysctl/sysrq: Remove __sysrq_enabled copy Date: Mon, 2 Mar 2020 17:51:34 +0000 Message-Id: <20200302175135.269397-2-dima@arista.com> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200302175135.269397-1-dima@arista.com> References: <20200302175135.269397-1-dima@arista.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 Cc: Jiri Slaby Cc: Luis Chamberlain Cc: Kees Cook Cc: linux-fsdevel@vger.kernel.org Signed-off-by: Dmitry Safonov --- 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