Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp364812ybv; Thu, 13 Feb 2020 01:52:30 -0800 (PST) X-Google-Smtp-Source: APXvYqwfbA/HDTKsGJsN0tYnpeeJfTaw1i55ILepHhtz9dIku/iwc2KPwMs3uhWRbmNK1Mq3xjQV X-Received: by 2002:a05:6808:48e:: with SMTP id z14mr2396753oid.26.1581587550142; Thu, 13 Feb 2020 01:52:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1581587550; cv=none; d=google.com; s=arc-20160816; b=Mlg53ktsSARil1tVqw+fKdGzJYRdlTYMFzUjbFsaZVFh1Rkw9ACCiWw7Hlw95SX5h8 dkEQCOSbvl0JlwctuLb40sO12sag8sjx0ntZtVsp2zltqHULvJMh7RFgDmHsje83u9PH 9Va4TFTabe/1UB2vU+EfL0q6GIgfXtSwDBXIDvei+TtUquhLZlYTQRnfqgsyx1BaGQmP dx0U3DGTV1yfa6k9v7NAkCgovzLWHFSgF7tA6Cxw0QnT3w3LyqJoADukhgPYDu2uMdRe 40bVe3MtRrMBh0P/+lzNrh1yiYjqEQj9FteEsg9E2HNrudK3bnVrsQlAe4jV0IxYgDjK qrQA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=HiHautZQfM36XQB5R1voetpKnqJZA9hng+W0LDPyz/E=; b=PysonjR7Mb3EMpWkAqfGDXjhNtl01xnIcJ3Co0oPOvKX8d114Rh1GDZbn7gYxeIPbL IxQdczX3W07WDS/2NxtZbu7qKcyr+eHs79JkGwfTz3eYu3JjOTKdqjVQqOXzFzq9tTIz 8iF3f49N6a5gtYg2SxzkzcXtYtwGRPE3OkQD2fNye6c3uG0n2HOU1d0j4CjabPJXLP3C 1GgMnPjVSWrA9CwUVTHAgeO/xoyPlrMAMiUpLhLw21sWaiO8PdzbMxFJY3Mol8SdbCJo kAevoazVAkmOW0LdgMGJZdL06+cjyZE9ZacNKZx9L0KmKPGNvTF0k0TBCtVnBIm72DKz kfYg== ARC-Authentication-Results: i=1; mx.google.com; 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 j9si839492oiw.133.2020.02.13.01.52.17; Thu, 13 Feb 2020 01:52:30 -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; 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 S1729817AbgBMJvz (ORCPT + 99 others); Thu, 13 Feb 2020 04:51:55 -0500 Received: from mx2.suse.de ([195.135.220.15]:41188 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729805AbgBMJvy (ORCPT ); Thu, 13 Feb 2020 04:51:54 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 0B73FB196; Thu, 13 Feb 2020 09:51:53 +0000 (UTC) From: Petr Mladek To: Sergey Senozhatsky , Steven Rostedt , Benjamin Herrenschmidt Cc: Peter Zijlstra , John Ogness , linux-kernel@vger.kernel.org Subject: [PATCH v4 1/3] printk: Move console matching logic into a separate function Date: Thu, 13 Feb 2020 10:51:31 +0100 Message-Id: <20200213095133.23176-2-pmladek@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20200213095133.23176-1-pmladek@suse.com> References: <20200213095133.23176-1-pmladek@suse.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Benjamin Herrenschmidt This moves the loop that tries to match a newly registered console with the command line or add_preferred_console list into a separate helper, in order to be able to call it multiple times in subsequent patches. Signed-off-by: Benjamin Herrenschmidt Reviewed-by: Petr Mladek Reviewed-by: Sergey Senozhatsky --- kernel/printk/printk.c | 105 ++++++++++++++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 40 deletions(-) diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index fada22dc4ab6..0ebcdf53e75d 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -280,6 +280,7 @@ static struct console *exclusive_console; static struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES]; static int preferred_console = -1; +static bool has_preferred_console; int console_set_on_cmdline; EXPORT_SYMBOL(console_set_on_cmdline); @@ -2626,6 +2627,60 @@ static int __init keep_bootcon_setup(char *str) early_param("keep_bootcon", keep_bootcon_setup); +/* + * This is called by register_console() to try to match + * the newly registered console with any of the ones selected + * by either the command line or add_preferred_console() and + * setup/enable it. + * + * Care need to be taken with consoles that are statically + * enabled such as netconsole + */ +static int try_enable_new_console(struct console *newcon) +{ + struct console_cmdline *c; + int i; + + for (i = 0, c = console_cmdline; + i < MAX_CMDLINECONSOLES && c->name[0]; + i++, c++) { + if (!newcon->match || + newcon->match(newcon, c->name, c->index, c->options) != 0) { + /* default matching */ + BUILD_BUG_ON(sizeof(c->name) != sizeof(newcon->name)); + if (strcmp(c->name, newcon->name) != 0) + continue; + if (newcon->index >= 0 && + newcon->index != c->index) + continue; + if (newcon->index < 0) + newcon->index = c->index; + + if (_braille_register_console(newcon, c)) + return 0; + + if (newcon->setup && + newcon->setup(newcon, c->options) != 0) + return -EIO; + } + newcon->flags |= CON_ENABLED; + if (i == preferred_console) { + newcon->flags |= CON_CONSDEV; + has_preferred_console = true; + } + return 0; + } + + /* + * Some consoles, such as pstore and netconsole, can be enabled even + * without matching. + */ + if (newcon->flags & CON_ENABLED) + return 0; + + return -ENOENT; +} + /* * The console driver calls this routine during kernel initialization * to register the console printing procedure with printk() and to @@ -2647,11 +2702,9 @@ early_param("keep_bootcon", keep_bootcon_setup); */ void register_console(struct console *newcon) { - int i; unsigned long flags; struct console *bcon = NULL; - struct console_cmdline *c; - static bool has_preferred; + int err; if (console_drivers) for_each_console(bcon) @@ -2678,15 +2731,15 @@ void register_console(struct console *newcon) if (console_drivers && console_drivers->flags & CON_BOOT) bcon = console_drivers; - if (!has_preferred || bcon || !console_drivers) - has_preferred = preferred_console >= 0; + if (!has_preferred_console || bcon || !console_drivers) + has_preferred_console = preferred_console >= 0; /* * See if we want to use this console driver. If we * didn't select a console we take the first one * that registers here. */ - if (!has_preferred) { + if (!has_preferred_console) { if (newcon->index < 0) newcon->index = 0; if (newcon->setup == NULL || @@ -2694,47 +2747,19 @@ void register_console(struct console *newcon) newcon->flags |= CON_ENABLED; if (newcon->device) { newcon->flags |= CON_CONSDEV; - has_preferred = true; + has_preferred_console = true; } } } /* - * See if this console matches one we selected on - * the command line. + * See if this console matches one we selected on + * the command line or if it was statically enabled */ - for (i = 0, c = console_cmdline; - i < MAX_CMDLINECONSOLES && c->name[0]; - i++, c++) { - if (!newcon->match || - newcon->match(newcon, c->name, c->index, c->options) != 0) { - /* default matching */ - BUILD_BUG_ON(sizeof(c->name) != sizeof(newcon->name)); - if (strcmp(c->name, newcon->name) != 0) - continue; - if (newcon->index >= 0 && - newcon->index != c->index) - continue; - if (newcon->index < 0) - newcon->index = c->index; - - if (_braille_register_console(newcon, c)) - return; - - if (newcon->setup && - newcon->setup(newcon, c->options) != 0) - break; - } - - newcon->flags |= CON_ENABLED; - if (i == preferred_console) { - newcon->flags |= CON_CONSDEV; - has_preferred = true; - } - break; - } + err = try_enable_new_console(newcon); - if (!(newcon->flags & CON_ENABLED)) + /* printk() messages are not printed to the Braille console. */ + if (err || newcon->flags & CON_BRL) return; /* -- 2.16.4