From patchwork Thu Apr 30 16:17:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Thompson X-Patchwork-Id: 185931 Delivered-To: patches@linaro.org Received: by 2002:a50:3a95:0:0:0:0:0 with SMTP id v21csp1035315ecc; Thu, 30 Apr 2020 09:18:07 -0700 (PDT) X-Received: by 2002:a5d:4e02:: with SMTP id p2mr5093899wrt.302.1588263487395; Thu, 30 Apr 2020 09:18:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588263487; cv=none; d=google.com; s=arc-20160816; b=bkKd9ABOdBqPhg2rTuow8Cb2XzLH5jcliuEGMD3hWVrUKTkvxHrSDd9DRga6RXMaWp g9XJXdH8aDNzW45BhPYFjbGIb7qUm3ycow2OFs959E1iVhgIn6syqjweevZW7wy9q97l fHiruFzS9jX9vB/EmD0Swsf1fK4npTfBfyinMAmhF0t/ATiuYFd8pFu+Fni8oQh/7Lih 4JurRtG7ltGlZDLkeTQZYk59+Nn4c2Sp1VvIxuZ2gHUWVHl1a4iZFlPAarQX64nSkli7 rIxsQIj1O6f5FsLmx35qQP6pAC9xcZBfbGyceY0UPMaGFCuhdIRCnrCnM38AyM0oRTRx +R1A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=5bAsvHqWCwGkT9CQd5T/W8xxkcoMDs4/cE7bMjlYKe0=; b=j3Zf4+wZD7gOFfPSx/F/8VVxbYevScNbr91ndxjF6Vfbz7eOV6q2CCs/fi3ie7bylF gpRXM798lYDksHF/IZjjqH0QLaqTTi0Ejq1A3f5IotlxMqe939uo1YuYZUH168G87TZj u3o6Dvm1kq9Y9AOeyVOdBMuqC1JhbCwD4SCyLPeWcE3DqleWQNECBH6YLdWkx4cBkgML y3oGOmTmYV7mucqCR0TL/EHCg7YZ8Tx3A5mC3bG52fcJkVnEmdftvS8d/pKVQl6TXRaz RCIM7JlTxR8sK+rktmGyhsC9zqorjSa7L4LTj5s6hFlW2rTasULxu0QhkY8/9BkPo3d/ 4Ibg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=gbHXr1KR; spf=pass (google.com: domain of daniel.thompson@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=daniel.thompson@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id a193sor58737wmd.1.2020.04.30.09.18.06 for (Google Transport Security); Thu, 30 Apr 2020 09:18:06 -0700 (PDT) Received-SPF: pass (google.com: domain of daniel.thompson@linaro.org designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=gbHXr1KR; spf=pass (google.com: domain of daniel.thompson@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=daniel.thompson@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=5bAsvHqWCwGkT9CQd5T/W8xxkcoMDs4/cE7bMjlYKe0=; b=gbHXr1KRjKzHoWccXlTIFlKA6SNRGpxXOO+JrrqgTvF8sYDdJfErPMiJJXwfzBd82v +Bp0Fn/5Bb8Gtwik2V1YrWSCqY7eslqiV5SJZQSfWPtOaDewmOSMtwJ7Bzs9PFtODxoR RH7O/FjGUW8detzTpo+wXVG3U2QUMlLmWBYXJF5Eyzv2rUOCusSe4RelyEqOkdYzr16H 13FPv5lrfR0iidWprYTw97a8ojDJa0Zj30usR+mgFPxUKVVsrJ226gWyB4GvZHeCPtwn AEmL2ybLlvTiEIWqjII/JOaclnZlhSDE4LV+MfUFikvplidy4TPP4nHQM016g7+PbXmc 6Q4g== 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=5bAsvHqWCwGkT9CQd5T/W8xxkcoMDs4/cE7bMjlYKe0=; b=DiwqOOgb1SRbQEka5nv+LLeOduZHdBBdT2Vc7bv42nXA1OBaSgCaOKOYcYyNKo4DG7 /3wLPzVh/2GWbYhuMcDI3xB2Amti0yRJq1Wrsod3aFrr6BiZLrXaKMpM8C4uJGGcLqBQ 4CB5QeBXIyISNacwa5dHIByHPZX+lJDBLQds8jUqLKUfsCNLTNEct9ERrpwZS6RYuull 9rA2z24pf0FXzXAO5r7VzVYWm4Dz6sB/SeH7QwlLiLUzMiZGplZBAmyujfeKu+Ixru6I ScvnGflhFn9ogirMndDbly+UUPq3luExLPkNl9bujsGk9onmJe52IUSpKzBL81LfpRfe 8CyA== X-Gm-Message-State: AGi0PuZg1168gNsqSw0rbJqNZKKDok5l9Z83n3aOQ5ihM4QdYK94BP5U tS5raVqtRGaAu6S37h/GZsxtV6VO X-Google-Smtp-Source: APiQypLdCkOL76wT2MKicI01rEncdS8lGfzgse247Irn4tIefaTYWYzAtLZod6xQ+/HXO2xHj/xMhA== X-Received: by 2002:a1c:1b88:: with SMTP id b130mr3766023wmb.75.1588263486041; Thu, 30 Apr 2020 09:18:06 -0700 (PDT) Return-Path: Received: from wychelm.lan (cpc141214-aztw34-2-0-cust773.18-1.cable.virginm.net. [86.9.19.6]) by smtp.gmail.com with ESMTPSA id y18sm160634wmc.45.2020.04.30.09.18.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Apr 2020 09:18:05 -0700 (PDT) From: Daniel Thompson To: Douglas Anderson Cc: Daniel Thompson , Jason Wessel , Sumit Garg , kgdb-bugreport@lists.sourceforge.net, linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, patches@linaro.org Subject: [PATCH v2] serial: kgdboc: Allow earlycon initialization to be deferred Date: Thu, 30 Apr 2020 17:17:41 +0100 Message-Id: <20200430161741.1832050-1-daniel.thompson@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200429170804.880720-1-daniel.thompson@linaro.org> References: <20200429170804.880720-1-daniel.thompson@linaro.org> MIME-Version: 1.0 Currently there is no guarantee that an earlycon will be initialized before kgdboc tries to adopt it. Almost the opposite: on systems with ACPI then if earlycon has no arguments then it is guaranteed that earlycon will not be initialized. This patch mitigates the problem by giving kgdboc_earlycon a second chance during console_init(). This isn't quite as good as stopping during early parameter parsing but it is still early in the kernel boot. Signed-off-by: Daniel Thompson --- Notes: v2: Simplified, more robust, runs earlier, still has Doug's recent patchset as a prerequisite. What's not to like? More specifically, based on feedback from Doug Anderson, I have replaced the initial hacky implementation with a console initcall. I also made it defer more aggressively after realizing that both earlycon and kgdboc_earlycon are handled as early parameters (meaning I think the current approach relies on the ordering of drivers/tty/serial/Makefile to ensure the earlycon is enabled before kgdboc tries to adopt it). Finally, my apologies to Jason and kgdb ML folks, who are seeing this patch for the first time. I copied the original circulation list from a patch that wasn't kgdb related and forgot to update. drivers/tty/serial/kgdboc.c | 41 +++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) base-commit: 6a8b55ed4056ea5559ebe4f6a4b247f627870d4c prerequisite-patch-id: cbaa70eb783f1f34aec7f5839d1fecbc7616a9f6 prerequisite-patch-id: d7543cdd19fb194ded3361d52818970083efdb06 prerequisite-patch-id: 2238d976451dac9e3ee1bf02a077d633e342aa0c prerequisite-patch-id: 9e4296261b608ee172060d04b3de431a5e370096 prerequisite-patch-id: 2b008e0e14a212072874ecb483d9c6844d161b08 prerequisite-patch-id: f5b692b89c997d828832e3ab27fffb8f770d7b6f prerequisite-patch-id: 851d6f4874aa24540db9d765275ae736e8b2955b prerequisite-patch-id: d3969c2fb7cd320eafebe63d7da270dac5a82fc9 prerequisite-patch-id: e1fc1478b7f75094d263ffc64a9f3528151831cf prerequisite-patch-id: 45fb53996a9f5993e03673c10eebf2834c58307f prerequisite-patch-id: 50ac1ddb52c3cce8b712036f212fdd67d7493112 -- 2.25.1 Reviewed-by: Douglas Anderson diff --git a/drivers/tty/serial/kgdboc.c b/drivers/tty/serial/kgdboc.c index 7aca0a67fc0b..596213272ec3 100644 --- a/drivers/tty/serial/kgdboc.c +++ b/drivers/tty/serial/kgdboc.c @@ -509,6 +509,10 @@ static struct kgdb_io kgdboc_earlycon_io_ops = { .is_console = true, }; +#define MAX_CONSOLE_NAME_LEN (sizeof((struct console *) 0)->name) +static char kgdboc_earlycon_param[MAX_CONSOLE_NAME_LEN] __initdata; +static bool kgdboc_earlycon_late_enable __initdata; + static int __init kgdboc_earlycon_init(char *opt) { struct console *con; @@ -529,7 +533,24 @@ static int __init kgdboc_earlycon_init(char *opt) console_unlock(); if (!con) { - pr_info("Couldn't find kgdb earlycon\n"); + /* + * Both earlycon and kgdboc_earlycon are initialized during + * early parameter parsing. We cannot guarantee earlycon gets + * in first and, in any case, on ACPI systems earlycon may + * defer its own initialization (usually to somewhere within + * setup_arch() ). To cope with either of these situations + * we can defer our own initialization to a little later in + * the boot. + */ + if (!kgdboc_earlycon_late_enable) { + pr_info("No suitable earlycon yet, will try later\n"); + if (opt) + strscpy(kgdboc_earlycon_param, opt, + sizeof(kgdboc_earlycon_param)); + kgdboc_earlycon_late_enable = true; + } else { + pr_info("Couldn't find kgdb earlycon\n"); + } return 0; } @@ -543,8 +564,24 @@ static int __init kgdboc_earlycon_init(char *opt) return 0; } - early_param("kgdboc_earlycon", kgdboc_earlycon_init); + +/* + * This is only intended for the late adoption of an early console. + * + * It is not a reliable way to adopt regular consoles because + * we can not control what order console initcalls are made and + * many regular consoles are registered much later in the boot + * process than the console initcalls! + */ +static int __init kgdboc_earlycon_late_init(void) +{ + if (kgdboc_earlycon_late_enable) + kgdboc_earlycon_init(kgdboc_earlycon_param); + return 0; +} +console_initcall(kgdboc_earlycon_late_init); + #endif /* CONFIG_KGDB_SERIAL_CONSOLE */ module_init(init_kgdboc);