From patchwork Tue Sep 12 16:01:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Michal_Such=C3=A1nek?= X-Patchwork-Id: 812936 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xs8jc36wDz9s7f for ; Wed, 13 Sep 2017 02:03:48 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3xs8jc2BmYzDrMY for ; Wed, 13 Sep 2017 02:03:48 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=suse.de (client-ip=195.135.220.15; helo=mx1.suse.de; envelope-from=msuchanek@suse.de; receiver=) Received: from mx1.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1 with cipher ADH-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3xs8gp1Mf8zDrDg for ; Wed, 13 Sep 2017 02:02:12 +1000 (AEST) X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 52743AD4D; Tue, 12 Sep 2017 16:02:09 +0000 (UTC) From: Michal Suchanek To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , Jonathan Corbet , Jessica Yu , Rusty Russell , Jason Baron , Mahesh Salgaonkar , Hari Bathini , Michal Suchanek , Daniel Axtens , Nicholas Piggin , Andrew Morton , Michael Neuling , Thiago Jung Bauermann , "Sylvain 'ythier' Hitier" , David Howells , Ingo Molnar , Kees Cook , Thomas Gleixner , "Steven Rostedt, " , Michal Hocko , Laura Abbott , Tejun Heo , Tom Lendacky , Viresh Kumar , Lokesh Vutla , Baoquan He , Ilya Matveychikov , linuxppc-dev@lists.ozlabs.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v8 1/6] powerpc/fadump: reduce memory consumption for capture kernel Date: Tue, 12 Sep 2017 18:01:39 +0200 Message-Id: X-Mailer: git-send-email 2.10.2 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.24 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" With fadump (dump capture) kernel booting like a regular kernel, it needs almost the same amount of memory to boot as the production kernel, which is unwarranted for a dump capture kernel. But with no option to disable some of the unnecessary subsystems in fadump kernel, that much memory is wasted on fadump, depriving the production kernel of that memory. Introduce kernel parameter 'fadump_extra_args=' that would take regular parameters as a space separated quoted string, to be enforced when fadump is active. This 'fadump_extra_args=' parameter can be leveraged to pass parameters like nr_cpus=1, cgroup_disable=memory and numa=off, to disable unwarranted resources/subsystems. Also, ensure the log "Firmware-assisted dump is active" is printed early in the boot process to put the subsequent fadump messages in context. Suggested-by: Michael Ellerman Signed-off-by: Hari Bathini Signed-off-by: Michal Suchanek Tested-by: Hari Bathini Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com> Signed-off-by: Michal Suchanek <msuchanek@suse.de> Tested-by: Hari Bathini Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com> Signed-off-by: Michal Suchanek <msuchanek@suse.de> --- Changes from v6: Correct and simplify quote handling. Ideally I would like to extend parse_args to give the length of the original quoted value to callback. However, parse_args removes at most one doubel-quote from the start and one from the end so that is easy to detect. Otherwise all other users will have to be updated to trash the new argument. Changes from v7: Handle leading quote in parameter name. --- arch/powerpc/include/asm/fadump.h | 2 + arch/powerpc/kernel/fadump.c | 122 +++++++++++++++++++++++++++++++++++++- arch/powerpc/kernel/prom.c | 7 +++ 3 files changed, 128 insertions(+), 3 deletions(-) diff --git a/arch/powerpc/include/asm/fadump.h b/arch/powerpc/include/asm/fadump.h index 5a23010af600..41b50b317a67 100644 --- a/arch/powerpc/include/asm/fadump.h +++ b/arch/powerpc/include/asm/fadump.h @@ -208,12 +208,14 @@ extern int early_init_dt_scan_fw_dump(unsigned long node, const char *uname, int depth, void *data); extern int fadump_reserve_mem(void); extern int setup_fadump(void); +extern void enforce_fadump_extra_args(char *cmdline); extern int is_fadump_active(void); extern int should_fadump_crash(void); extern void crash_fadump(struct pt_regs *, const char *); extern void fadump_cleanup(void); #else /* CONFIG_FA_DUMP */ +static inline void enforce_fadump_extra_args(char *cmdline) { } static inline int is_fadump_active(void) { return 0; } static inline int should_fadump_crash(void) { return 0; } static inline void crash_fadump(struct pt_regs *regs, const char *str) { } diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c index e1431800bfb9..0e08f1a80af2 100644 --- a/arch/powerpc/kernel/fadump.c +++ b/arch/powerpc/kernel/fadump.c @@ -78,8 +78,10 @@ int __init early_init_dt_scan_fw_dump(unsigned long node, * dump data waiting for us. */ fdm_active = of_get_flat_dt_prop(node, "ibm,kernel-dump", NULL); - if (fdm_active) + if (fdm_active) { + pr_info("Firmware-assisted dump is active.\n"); fw_dump.dump_active = 1; + } /* Get the sizes required to store dump data for the firmware provided * dump sections. @@ -339,8 +341,11 @@ int __init fadump_reserve_mem(void) { unsigned long base, size, memory_boundary; - if (!fw_dump.fadump_enabled) + if (!fw_dump.fadump_enabled) { + if (fw_dump.dump_active) + pr_warn("Firmware-assisted dump was active but kernel booted with fadump disabled!\n"); return 0; + } if (!fw_dump.fadump_supported) { printk(KERN_INFO "Firmware-assisted dump is not supported on" @@ -380,7 +385,6 @@ int __init fadump_reserve_mem(void) memory_boundary = memblock_end_of_DRAM(); if (fw_dump.dump_active) { - printk(KERN_INFO "Firmware-assisted dump is active.\n"); /* * If last boot has crashed then reserve all the memory * above boot_memory_size so that we don't touch it until @@ -467,6 +471,118 @@ static int __init early_fadump_reserve_mem(char *p) } early_param("fadump_reserve_mem", early_fadump_reserve_mem); +#define FADUMP_EXTRA_ARGS_PARAM "fadump_extra_args=" +#define FADUMP_EXTRA_ARGS_LEN (strlen(FADUMP_EXTRA_ARGS_PARAM) - 1) + +struct param_info { + char *cmdline; + char *tmp_cmdline; + int shortening; +}; + +static void __init fadump_update_params(struct param_info *param_info, + char *param, char *val) +{ + ptrdiff_t param_offset = param - param_info->tmp_cmdline; + size_t vallen = val ? strlen(val) : 0; + char *tgt = param_info->cmdline + param_offset + - param_info->shortening; + int shortening = 0; + int quoted = 0; + + if (!val) + return; + + /* leading '"' removed from parameter */ + if ((param > param_info->tmp_cmdline) && *(param - 1) == '"') { + quoted = 1; + shortening += 1; + tgt--; + } + + /* next_arg removes one leading and one trailing '"' */ + if (*(tgt + FADUMP_EXTRA_ARGS_LEN + 1) == '"') + shortening += 1; + if (*(tgt + FADUMP_EXTRA_ARGS_LEN + 1 + vallen + shortening) == '"') + shortening += 1; + + /* remove one leading and one trailing quote if both are present */ + if ((val[0] == '"') && (val[vallen - 1] == '"')) { + shortening += 2; + vallen -= 2; + val++; + } + + /* some characters were removed - move the trailing part of cmdline */ + if (shortening) { + char *src; + + strncpy(tgt, FADUMP_EXTRA_ARGS_PARAM, FADUMP_EXTRA_ARGS_LEN); + tgt += FADUMP_EXTRA_ARGS_LEN; + *tgt++ = ' '; + + strncpy(tgt, val, vallen); + tgt += vallen; + + src = tgt + shortening; + memmove(tgt, src, strlen(src) + 1); + } else { + /* remove the '=' */ + *(tgt + FADUMP_EXTRA_ARGS_LEN) = ' '; + } + + param_info->shortening += shortening; +} + +/* + * Reworks command line parameters and splits 'fadump_extra_args=' param + * to enforce the parameters passed through it + */ +static int __init fadump_rework_cmdline_params(char *param, char *val, + const char *unused, void *arg) +{ + struct param_info *param_info = (struct param_info *)arg; + + if (strncmp(param, FADUMP_EXTRA_ARGS_PARAM, + strlen(FADUMP_EXTRA_ARGS_PARAM) - 1)) + return 0; + + fadump_update_params(param_info, param, val); + + return 0; +} + +/* + * Replace every occurrence of 'fadump_extra_args="param1 param2 param3"' + * in cmdline with 'fadump_extra_args param1 param2 param3' by stripping + * off '=' and quotes, if any. This ensures that the additional parameters + * passed with 'fadump_extra_args=' are enforced. + */ +void __init enforce_fadump_extra_args(char *cmdline) +{ + static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; + static char init_cmdline[COMMAND_LINE_SIZE] __initdata; + struct param_info param_info; + + if (strstr(cmdline, FADUMP_EXTRA_ARGS_PARAM) == NULL) + return; + + pr_info("Modifying command line to enforce the additional parameters passed through 'fadump_extra_args='"); + + param_info.cmdline = cmdline; + param_info.tmp_cmdline = tmp_cmdline; + param_info.shortening = 0; + + strlcpy(init_cmdline, cmdline, COMMAND_LINE_SIZE); + + strlcpy(tmp_cmdline, cmdline, COMMAND_LINE_SIZE); + parse_args("fadump params", tmp_cmdline, NULL, 0, 0, 0, + ¶m_info, &fadump_rework_cmdline_params); + + pr_info("Original command line: %s\n", init_cmdline); + pr_info("Modified command line: %s\n", cmdline); +} + static int register_fw_dump(struct fadump_mem_struct *fdm) { int rc, err; diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index f83056297441..2e6f40217266 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c @@ -693,6 +693,13 @@ void __init early_init_devtree(void *params) of_scan_flat_dt(early_init_dt_scan_root, NULL); of_scan_flat_dt(early_init_dt_scan_memory_ppc, NULL); + /* + * Look for 'fadump_extra_args=' parameter and enfore the additional + * parameters passed to it if fadump is active. + */ + if (is_fadump_active()) + enforce_fadump_extra_args(boot_command_line); + parse_early_param(); /* make sure we've parsed cmdline for mem= before this */ From patchwork Tue Sep 12 16:01:40 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Michal_Such=C3=A1nek?= X-Patchwork-Id: 812937 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xs8l25bccz9s7f for ; Wed, 13 Sep 2017 02:05:02 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3xs8l24WLyzDrJR for ; Wed, 13 Sep 2017 02:05:02 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=suse.de (client-ip=195.135.220.15; helo=mx1.suse.de; envelope-from=msuchanek@suse.de; receiver=) Received: from mx1.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1 with cipher ADH-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3xs8gp1KkjzDqjt for ; Wed, 13 Sep 2017 02:02:13 +1000 (AEST) X-Virus-Scanned: by amavisd-new at test-mx.suse.de X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "References" Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id E5901ACD9; Tue, 12 Sep 2017 16:02:10 +0000 (UTC) From: Michal Suchanek To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , Jonathan Corbet , Jessica Yu , Rusty Russell , Jason Baron , Mahesh Salgaonkar , Hari Bathini , Michal Suchanek , Daniel Axtens , Nicholas Piggin , Andrew Morton , Michael Neuling , Thiago Jung Bauermann , "Sylvain 'ythier' Hitier" , David Howells , Ingo Molnar , Kees Cook , Thomas Gleixner , "Steven Rostedt, " , Michal Hocko , Laura Abbott , Tejun Heo , Tom Lendacky , Viresh Kumar , Lokesh Vutla , Baoquan He , Ilya Matveychikov , linuxppc-dev@lists.ozlabs.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v8 2/6] powerpc/fadump: update documentation about 'fadump_extra_args=' parameter Date: Tue, 12 Sep 2017 18:01:40 +0200 Message-Id: <5db2fb2d68310ae455eaa5a713358de62ff398d9.1505231820.git.msuchanek@suse.de> X-Mailer: git-send-email 2.10.2 In-Reply-To: References: In-Reply-To: References: X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.24 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" With the introduction of 'fadump_extra_args=' parameter to pass additional parameters to fadump (capture) kernel, update documentation about it. Signed-off-by: Hari Bathini Signed-off-by: Michal Suchanek --- Documentation/powerpc/firmware-assisted-dump.txt | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/Documentation/powerpc/firmware-assisted-dump.txt b/Documentation/powerpc/firmware-assisted-dump.txt index bdd344aa18d9..2df88524d2c7 100644 --- a/Documentation/powerpc/firmware-assisted-dump.txt +++ b/Documentation/powerpc/firmware-assisted-dump.txt @@ -162,7 +162,19 @@ How to enable firmware-assisted dump (fadump): 1. Set config option CONFIG_FA_DUMP=y and build kernel. 2. Boot into linux kernel with 'fadump=on' kernel cmdline option. -3. Optionally, user can also set 'crashkernel=' kernel cmdline +3. A user can pass additional command line parameters as a space + separated quoted list through 'fadump_extra_args=' parameter, + to be enforced when fadump is active. For example, parameter + 'fadump_extra_args="nr_cpus=1 numa=off udev.children-max=2"' + will be changed to 'fadump_extra_args nr_cpus=1 numa=off + udev.children-max=2' in-place when fadump is active. This + parameter has no affect when fadump is not active. Multiple + instances of 'fadump_extra_args=' can be passed. This provision + can be used to reduce memory consumption during dump capture by + disabling unwarranted resources/subsystems like CPUs, NUMA + and such. Value with spaces can be passed as + 'fadump_extra_args=""parameter="value with spaces"""' +4. Optionally, user can also set 'crashkernel=' kernel cmdline to specify size of the memory to reserve for boot memory dump preservation. @@ -172,6 +184,12 @@ NOTE: 1. 'fadump_reserve_mem=' parameter has been deprecated. Instead 2. If firmware-assisted dump fails to reserve memory then it will fallback to existing kdump mechanism if 'crashkernel=' option is set at kernel cmdline. + 3. Special parameters like '--' passed inside fadump_extra_args are also + just left in-place. So, the user is advised to consider this while + specifying such parameters. It may be required to quote the argument + to fadump_extra_args when the bootloader uses double-quotes as + argument delimiter as well. eg + append = " fadump_extra_args=\"nr_cpus=1 numa=off udev.children-max=2\"" Sysfs/debugfs files: ------------ From patchwork Tue Sep 12 16:01:41 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Michal_Such=C3=A1nek?= X-Patchwork-Id: 812938 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xs8mp5d8Pz9s7f for ; Wed, 13 Sep 2017 02:06:34 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3xs8mp4k5GzDrX7 for ; Wed, 13 Sep 2017 02:06:34 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=suse.de (client-ip=195.135.220.15; helo=mx1.suse.de; envelope-from=msuchanek@suse.de; receiver=) Received: from mx1.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1 with cipher ADH-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3xs8gr2QLbzDqjt for ; Wed, 13 Sep 2017 02:02:16 +1000 (AEST) X-Virus-Scanned: by amavisd-new at test-mx.suse.de X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "References" Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 6401EAD65; Tue, 12 Sep 2017 16:02:13 +0000 (UTC) From: Michal Suchanek To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , Jonathan Corbet , Jessica Yu , Rusty Russell , Jason Baron , Mahesh Salgaonkar , Hari Bathini , Michal Suchanek , Daniel Axtens , Nicholas Piggin , Andrew Morton , Michael Neuling , Thiago Jung Bauermann , "Sylvain 'ythier' Hitier" , David Howells , Ingo Molnar , Kees Cook , Thomas Gleixner , "Steven Rostedt, " , Michal Hocko , Laura Abbott , Tejun Heo , Tom Lendacky , Viresh Kumar , Lokesh Vutla , Baoquan He , Ilya Matveychikov , linuxppc-dev@lists.ozlabs.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v8 3/6] lib/cmdline.c: Remove quotes symmetrically. Date: Tue, 12 Sep 2017 18:01:41 +0200 Message-Id: <9ad57a14bf19e798c5a3643e57a28e829a8518a2.1505231820.git.msuchanek@suse.de> X-Mailer: git-send-email 2.10.2 In-Reply-To: References: In-Reply-To: References: X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.24 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Remove quotes from argument value only if there is qoute on both sides. Signed-off-by: Michal Suchanek --- lib/cmdline.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/cmdline.c b/lib/cmdline.c index 171c19b6888e..6d398a8b63fc 100644 --- a/lib/cmdline.c +++ b/lib/cmdline.c @@ -227,14 +227,12 @@ char *next_arg(char *args, char **param, char **val) *val = args + equals + 1; /* Don't include quotes in value. */ - if (**val == '"') { - (*val)++; - if (args[i-1] == '"') - args[i-1] = '\0'; + if ((args[i-1] == '"') && ((quoted) || (**val == '"'))) { + args[i-1] = '\0'; + if (!quoted) + (*val)++; } } - if (quoted && args[i-1] == '"') - args[i-1] = '\0'; if (args[i]) { args[i] = '\0'; From patchwork Tue Sep 12 16:01:42 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Michal_Such=C3=A1nek?= X-Patchwork-Id: 812939 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xs8pK35MBz9s82 for ; Wed, 13 Sep 2017 02:07:53 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3xs8pJ02jVzDrps for ; Wed, 13 Sep 2017 02:07:52 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=suse.de (client-ip=195.135.220.15; helo=mx1.suse.de; envelope-from=msuchanek@suse.de; receiver=) Received: from mx1.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1 with cipher ADH-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3xs8gs684zzDqjt for ; Wed, 13 Sep 2017 02:02:17 +1000 (AEST) X-Virus-Scanned: by amavisd-new at test-mx.suse.de X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "References" Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id EF860AD6A; Tue, 12 Sep 2017 16:02:14 +0000 (UTC) From: Michal Suchanek To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , Jonathan Corbet , Jessica Yu , Rusty Russell , Jason Baron , Mahesh Salgaonkar , Hari Bathini , Michal Suchanek , Daniel Axtens , Nicholas Piggin , Andrew Morton , Michael Neuling , Thiago Jung Bauermann , "Sylvain 'ythier' Hitier" , David Howells , Ingo Molnar , Kees Cook , Thomas Gleixner , "Steven Rostedt, " , Michal Hocko , Laura Abbott , Tejun Heo , Tom Lendacky , Viresh Kumar , Lokesh Vutla , Baoquan He , Ilya Matveychikov , linuxppc-dev@lists.ozlabs.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v8 4/6] powerpc/fadump: update the dequoting logic to match lib/cmdline.c Date: Tue, 12 Sep 2017 18:01:42 +0200 Message-Id: <490bce7afcb8ae57880cb83d5cf1a07ba1a0fc60.1505231820.git.msuchanek@suse.de> X-Mailer: git-send-email 2.10.2 In-Reply-To: References: In-Reply-To: References: X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.24 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Signed-off-by: Michal Suchanek --- arch/powerpc/kernel/fadump.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c index 0e08f1a80af2..b214c1e333dd 100644 --- a/arch/powerpc/kernel/fadump.c +++ b/arch/powerpc/kernel/fadump.c @@ -501,10 +501,12 @@ static void __init fadump_update_params(struct param_info *param_info, } /* next_arg removes one leading and one trailing '"' */ - if (*(tgt + FADUMP_EXTRA_ARGS_LEN + 1) == '"') - shortening += 1; - if (*(tgt + FADUMP_EXTRA_ARGS_LEN + 1 + vallen + shortening) == '"') + if ((*(tgt + FADUMP_EXTRA_ARGS_LEN + 1 + vallen + shortening) == '"') && + (quoted || (*(tgt + FADUMP_EXTRA_ARGS_LEN + 1) == '"'))) { shortening += 1; + if (!quoted) + shortening += 1; + } /* remove one leading and one trailing quote if both are present */ if ((val[0] == '"') && (val[vallen - 1] == '"')) { From patchwork Tue Sep 12 16:01:43 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Michal_Such=C3=A1nek?= X-Patchwork-Id: 812940 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xs8qp1skRz9s7f for ; Wed, 13 Sep 2017 02:09:10 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3xs8qp11RQzDqXn for ; Wed, 13 Sep 2017 02:09:10 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=suse.de (client-ip=195.135.220.15; helo=mx1.suse.de; envelope-from=msuchanek@suse.de; receiver=) Received: from mx1.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1 with cipher ADH-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3xs8gv3mVczDrFJ for ; Wed, 13 Sep 2017 02:02:19 +1000 (AEST) X-Virus-Scanned: by amavisd-new at test-mx.suse.de X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "References" Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id A5921AD6D; Tue, 12 Sep 2017 16:02:16 +0000 (UTC) From: Michal Suchanek To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , Jonathan Corbet , Jessica Yu , Rusty Russell , Jason Baron , Mahesh Salgaonkar , Hari Bathini , Michal Suchanek , Daniel Axtens , Nicholas Piggin , Andrew Morton , Michael Neuling , Thiago Jung Bauermann , "Sylvain 'ythier' Hitier" , David Howells , Ingo Molnar , Kees Cook , Thomas Gleixner , "Steven Rostedt, " , Michal Hocko , Laura Abbott , Tejun Heo , Tom Lendacky , Viresh Kumar , Lokesh Vutla , Baoquan He , Ilya Matveychikov , linuxppc-dev@lists.ozlabs.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v8 5/6] boot/param: add pointer to current and next argument to unknown parameter callback Date: Tue, 12 Sep 2017 18:01:43 +0200 Message-Id: X-Mailer: git-send-email 2.10.2 In-Reply-To: References: In-Reply-To: References: X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.24 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" The fadump parameter processing re-does the logic of next_arg quote stripping to determine where the argument ends. Pass pointer to the current and next argument instead to make this more robust. Signed-off-by: Michal Suchanek --- rebase on master split off changes to fadump.c add pointer to current argument to detect shortening of the parameterer name --- arch/powerpc/kernel/fadump.c | 1 + include/linux/moduleparam.h | 1 + init/main.c | 8 ++++++-- kernel/module.c | 5 +++-- kernel/params.c | 20 +++++++++++++------- lib/dynamic_debug.c | 1 + 6 files changed, 25 insertions(+), 11 deletions(-) diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c index b214c1e333dd..8778e1cc0380 100644 --- a/arch/powerpc/kernel/fadump.c +++ b/arch/powerpc/kernel/fadump.c @@ -541,6 +541,7 @@ static void __init fadump_update_params(struct param_info *param_info, * to enforce the parameters passed through it */ static int __init fadump_rework_cmdline_params(char *param, char *val, + char *currant, char *next, const char *unused, void *arg) { struct param_info *param_info = (struct param_info *)arg; diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h index 1ee7b30dafec..e86f3f830a7f 100644 --- a/include/linux/moduleparam.h +++ b/include/linux/moduleparam.h @@ -327,6 +327,7 @@ extern char *parse_args(const char *name, s16 level_max, void *arg, int (*unknown)(char *param, char *val, + char *currant, char *next, const char *doing, void *arg)); /* Called by module remove. */ diff --git a/init/main.c b/init/main.c index 0ee9c6866ada..9381aa24bca7 100644 --- a/init/main.c +++ b/init/main.c @@ -240,6 +240,7 @@ early_param("loglevel", loglevel); /* Change NUL term back to "=", to make "param" the whole string. */ static int __init repair_env_string(char *param, char *val, + char *unused3, char *unused2, const char *unused, void *arg) { if (val) { @@ -258,6 +259,7 @@ static int __init repair_env_string(char *param, char *val, /* Anything after -- gets handed straight to init. */ static int __init set_init_arg(char *param, char *val, + char *unused3, char *unused2, const char *unused, void *arg) { unsigned int i; @@ -265,7 +267,7 @@ static int __init set_init_arg(char *param, char *val, if (panic_later) return 0; - repair_env_string(param, val, unused, NULL); + repair_env_string(param, val, unused3, unused2, unused, NULL); for (i = 0; argv_init[i]; i++) { if (i == MAX_INIT_ARGS) { @@ -283,9 +285,10 @@ static int __init set_init_arg(char *param, char *val, * unused parameters (modprobe will find them in /proc/cmdline). */ static int __init unknown_bootoption(char *param, char *val, + char *unused3, char *unused2, const char *unused, void *arg) { - repair_env_string(param, val, unused, NULL); + repair_env_string(param, val, unused3, unused2, unused, NULL); /* Handle obsolete-style parameters */ if (obsolete_checksetup(param)) @@ -437,6 +440,7 @@ static noinline void __ref rest_init(void) /* Check for early params. */ static int __init do_early_param(char *param, char *val, + char *unused3, char *unused2, const char *unused, void *arg) { const struct obs_kernel_param *p; diff --git a/kernel/module.c b/kernel/module.c index 40f983cbea81..0f74718f8934 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -3609,8 +3609,9 @@ static int prepare_coming_module(struct module *mod) return 0; } -static int unknown_module_param_cb(char *param, char *val, const char *modname, - void *arg) +static int unknown_module_param_cb(char *param, char *val, + char *unused, char *unused2, + const char *modname, void *arg) { struct module *mod = arg; int ret; diff --git a/kernel/params.c b/kernel/params.c index 60b2d8101355..c0e0c65f460b 100644 --- a/kernel/params.c +++ b/kernel/params.c @@ -119,6 +119,8 @@ static void param_check_unsafe(const struct kernel_param *kp) static int parse_one(char *param, char *val, + char *currant, + char *next, const char *doing, const struct kernel_param *params, unsigned num_params, @@ -126,7 +128,8 @@ static int parse_one(char *param, s16 max_level, void *arg, int (*handle_unknown)(char *param, char *val, - const char *doing, void *arg)) + char *currant, char *next, + const char *doing, void *arg)) { unsigned int i; int err; @@ -153,7 +156,7 @@ static int parse_one(char *param, if (handle_unknown) { pr_debug("doing %s: %s='%s'\n", doing, param, val); - return handle_unknown(param, val, doing, arg); + return handle_unknown(param, val, currant, next, doing, arg); } pr_debug("Unknown argument '%s'\n", param); @@ -169,9 +172,10 @@ char *parse_args(const char *doing, s16 max_level, void *arg, int (*unknown)(char *param, char *val, + char *currant, char *next, const char *doing, void *arg)) { - char *param, *val, *err = NULL; + char *param, *val, *next, *err = NULL; /* Chew leading spaces */ args = skip_spaces(args); @@ -179,16 +183,18 @@ char *parse_args(const char *doing, if (*args) pr_debug("doing %s, parsing ARGS: '%s'\n", doing, args); - while (*args) { + next = next_arg(args, ¶m, &val); + do { int ret; int irq_was_disabled; - args = next_arg(args, ¶m, &val); + args = next; + next = next_arg(args, ¶m, &val); /* Stop at -- */ if (!val && strcmp(param, "--") == 0) return err ?: args; irq_was_disabled = irqs_disabled(); - ret = parse_one(param, val, doing, params, num, + ret = parse_one(param, val, args, next, doing, params, num, min_level, max_level, arg, unknown); if (irq_was_disabled && !irqs_disabled()) pr_warn("%s: option '%s' enabled irq's!\n", @@ -211,7 +217,7 @@ char *parse_args(const char *doing, } err = ERR_PTR(ret); - } + } while (*next); return err; } diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index da796e2dc4f5..dec7f40c3f47 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -889,6 +889,7 @@ static int ddebug_dyndbg_param_cb(char *param, char *val, /* handle both dyndbg and $module.dyndbg params at boot */ static int ddebug_dyndbg_boot_param_cb(char *param, char *val, + char *unused3, char *unused2, const char *unused, void *arg) { vpr_info("%s=\"%s\"\n", param, val); From patchwork Tue Sep 12 16:01:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Michal_Such=C3=A1nek?= X-Patchwork-Id: 812941 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xs8sG6XT6z9s7f for ; Wed, 13 Sep 2017 02:10:26 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3xs8sG5jKrzDrLH for ; Wed, 13 Sep 2017 02:10:26 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=suse.de (client-ip=195.135.220.15; helo=mx1.suse.de; envelope-from=msuchanek@suse.de; receiver=) Received: from mx1.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1 with cipher ADH-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3xs8gx0N09zDrFq for ; Wed, 13 Sep 2017 02:02:21 +1000 (AEST) X-Virus-Scanned: by amavisd-new at test-mx.suse.de X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "References" Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 33344AD6F; Tue, 12 Sep 2017 16:02:18 +0000 (UTC) From: Michal Suchanek To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , Jonathan Corbet , Jessica Yu , Rusty Russell , Jason Baron , Mahesh Salgaonkar , Hari Bathini , Michal Suchanek , Daniel Axtens , Nicholas Piggin , Andrew Morton , Michael Neuling , Thiago Jung Bauermann , "Sylvain 'ythier' Hitier" , David Howells , Ingo Molnar , Kees Cook , Thomas Gleixner , "Steven Rostedt, " , Michal Hocko , Laura Abbott , Tejun Heo , Tom Lendacky , Viresh Kumar , Lokesh Vutla , Baoquan He , Ilya Matveychikov , linuxppc-dev@lists.ozlabs.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v8 6/6] powerpc/fadump: use the new parse_args callback arguments Date: Tue, 12 Sep 2017 18:01:44 +0200 Message-Id: <4fabdf584ad18d6aae61e331f783a5020567f634.1505231820.git.msuchanek@suse.de> X-Mailer: git-send-email 2.10.2 In-Reply-To: References: In-Reply-To: References: X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.24 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Signed-off-by: Michal Suchanek --- arch/powerpc/kernel/fadump.c | 47 ++++++++++++-------------------------------- 1 file changed, 13 insertions(+), 34 deletions(-) diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c index 8778e1cc0380..1678d99ea835 100644 --- a/arch/powerpc/kernel/fadump.c +++ b/arch/powerpc/kernel/fadump.c @@ -481,33 +481,19 @@ struct param_info { }; static void __init fadump_update_params(struct param_info *param_info, - char *param, char *val) + char *param, char *val, + char *currant, char *next) { - ptrdiff_t param_offset = param - param_info->tmp_cmdline; + ptrdiff_t param_offset = currant - param_info->tmp_cmdline; size_t vallen = val ? strlen(val) : 0; char *tgt = param_info->cmdline + param_offset - param_info->shortening; - int shortening = 0; - int quoted = 0; + int shortening = ((next - 1) - (currant)) + - (FADUMP_EXTRA_ARGS_LEN + 1 + vallen); if (!val) return; - /* leading '"' removed from parameter */ - if ((param > param_info->tmp_cmdline) && *(param - 1) == '"') { - quoted = 1; - shortening += 1; - tgt--; - } - - /* next_arg removes one leading and one trailing '"' */ - if ((*(tgt + FADUMP_EXTRA_ARGS_LEN + 1 + vallen + shortening) == '"') && - (quoted || (*(tgt + FADUMP_EXTRA_ARGS_LEN + 1) == '"'))) { - shortening += 1; - if (!quoted) - shortening += 1; - } - /* remove one leading and one trailing quote if both are present */ if ((val[0] == '"') && (val[vallen - 1] == '"')) { shortening += 2; @@ -515,22 +501,15 @@ static void __init fadump_update_params(struct param_info *param_info, val++; } - /* some characters were removed - move the trailing part of cmdline */ - if (shortening) { - char *src; + strncpy(tgt, FADUMP_EXTRA_ARGS_PARAM, FADUMP_EXTRA_ARGS_LEN); + tgt += FADUMP_EXTRA_ARGS_LEN; + *tgt++ = ' '; + strncpy(tgt, val, vallen); + tgt += vallen; - strncpy(tgt, FADUMP_EXTRA_ARGS_PARAM, FADUMP_EXTRA_ARGS_LEN); - tgt += FADUMP_EXTRA_ARGS_LEN; - *tgt++ = ' '; - - strncpy(tgt, val, vallen); - tgt += vallen; - - src = tgt + shortening; + if (shortening) { + char *src = tgt + shortening; memmove(tgt, src, strlen(src) + 1); - } else { - /* remove the '=' */ - *(tgt + FADUMP_EXTRA_ARGS_LEN) = ' '; } param_info->shortening += shortening; @@ -550,7 +529,7 @@ static int __init fadump_rework_cmdline_params(char *param, char *val, strlen(FADUMP_EXTRA_ARGS_PARAM) - 1)) return 0; - fadump_update_params(param_info, param, val); + fadump_update_params(param_info, param, val, currant, next); return 0; }