Commit-ID:  f550e4692749a909d3f5453ef11b4c8ab2071070
Gitweb:     http://git.kernel.org/tip/f550e4692749a909d3f5453ef11b4c8ab2071070
Author:     tra...@sgi.com <tra...@sgi.com>
AuthorDate: Wed, 25 Jan 2017 10:35:21 -0600
Committer:  Ingo Molnar <mi...@kernel.org>
CommitDate: Wed, 1 Feb 2017 10:21:00 +0100

x86/platform/UV: Verify NMI action is valid, default is standard

Verify that the NMI action being set is valid.  The default NMI action
changes from the non-standard 'kdb' to the more standard 'dump'.

Signed-off-by: Mike Travis <tra...@sgi.com>
Reviewed-by: Russ Anderson <r...@hpe.com>
Reviewed-by: Alex Thorlton <athorl...@sgi.com>
Acked-by: Thomas Gleixner <t...@linutronix.de>
Acked-by: Dimitri Sivanich <sivan...@hpe.com>
Cc: Linus Torvalds <torva...@linux-foundation.org>
Cc: Peter Zijlstra <pet...@infradead.org>
Link: http://lkml.kernel.org/r/20170125163517.922751...@asylum.americas.sgi.com
Signed-off-by: Ingo Molnar <mi...@kernel.org>
---
 arch/x86/platform/uv/uv_nmi.c | 69 ++++++++++++++++++++++++++++++++++++-------
 1 file changed, 58 insertions(+), 11 deletions(-)

diff --git a/arch/x86/platform/uv/uv_nmi.c b/arch/x86/platform/uv/uv_nmi.c
index 8a4aa5b..c10e00b 100644
--- a/arch/x86/platform/uv/uv_nmi.c
+++ b/arch/x86/platform/uv/uv_nmi.c
@@ -169,17 +169,64 @@ module_param_named(debug, uv_nmi_debug, int, 0644);
                        pr_info(fmt, ##__VA_ARGS__);    \
        } while (0)
 
-/*
- * Valid NMI Actions:
- *  "dump"     - dump process stack for each cpu
- *  "ips"      - dump IP info for each cpu
- *  "kdump"    - do crash dump
- *  "kdb"      - enter KDB (default)
- *  "kgdb"     - enter KGDB
- *  "health"   - check if CPUs respond to NMI
- */
-static char uv_nmi_action[8] = "kdb";
-module_param_string(action, uv_nmi_action, sizeof(uv_nmi_action), 0644);
+/* Valid NMI Actions */
+#define        ACTION_LEN      16
+static struct nmi_action {
+       char    *action;
+       char    *desc;
+} valid_acts[] = {
+       {       "kdump",        "do kernel crash dump"                  },
+       {       "dump",         "dump process stack for each cpu"       },
+       {       "ips",          "dump Inst Ptr info for each cpu"       },
+       {       "kdb",          "enter KDB (needs kgdboc= assignment)"  },
+       {       "kgdb",         "enter KGDB (needs gdb target remote)"  },
+       {       "health",       "check if CPUs respond to NMI"          },
+};
+typedef char action_t[ACTION_LEN];
+static action_t uv_nmi_action = { "dump" };
+
+static int param_get_action(char *buffer, const struct kernel_param *kp)
+{
+       return sprintf(buffer, "%s\n", uv_nmi_action);
+}
+
+static int param_set_action(const char *val, const struct kernel_param *kp)
+{
+       int i;
+       int n = ARRAY_SIZE(valid_acts);
+       char arg[ACTION_LEN], *p;
+
+       /* (remove possible '\n') */
+       strncpy(arg, val, ACTION_LEN - 1);
+       arg[ACTION_LEN - 1] = '\0';
+       p = strchr(arg, '\n');
+       if (p)
+               *p = '\0';
+
+       for (i = 0; i < n; i++)
+               if (!strcmp(arg, valid_acts[i].action))
+                       break;
+
+       if (i < n) {
+               strcpy(uv_nmi_action, arg);
+               pr_info("UV: New NMI action:%s\n", uv_nmi_action);
+               return 0;
+       }
+
+       pr_err("UV: Invalid NMI action:%s, valid actions are:\n", arg);
+       for (i = 0; i < n; i++)
+               pr_err("UV: %-8s - %s\n",
+                       valid_acts[i].action, valid_acts[i].desc);
+       return -EINVAL;
+}
+
+static const struct kernel_param_ops param_ops_action = {
+       .get = param_get_action,
+       .set = param_set_action,
+};
+#define param_check_action(name, p) __param_check(name, p, action_t)
+
+module_param_named(action, uv_nmi_action, action, 0644);
 
 static inline bool uv_nmi_action_is(const char *action)
 {

Reply via email to