Merge branch 'uaccess.i915' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux-2.6-microblaze.git] / kernel / panic.c
index b69ee9e..85568bb 100644 (file)
 #define PANIC_TIMER_STEP 100
 #define PANIC_BLINK_SPD 18
 
+#ifdef CONFIG_SMP
+/*
+ * Should we dump all CPUs backtraces in an oops event?
+ * Defaults to 0, can be changed via sysctl.
+ */
+unsigned int __read_mostly sysctl_oops_all_cpu_backtrace;
+#endif /* CONFIG_SMP */
+
 int panic_on_oops = CONFIG_PANIC_ON_OOPS_VALUE;
 static unsigned long tainted_mask =
        IS_ENABLED(CONFIG_GCC_PLUGIN_RANDSTRUCT) ? (1 << TAINT_RANDSTRUCT) : 0;
@@ -44,6 +52,8 @@ static int pause_on_oops_flag;
 static DEFINE_SPINLOCK(pause_on_oops_lock);
 bool crash_kexec_post_notifiers;
 int panic_on_warn __read_mostly;
+unsigned long panic_on_taint;
+bool panic_on_taint_nousertaint = false;
 
 int panic_timeout = CONFIG_PANIC_TIMEOUT;
 EXPORT_SYMBOL_GPL(panic_timeout);
@@ -434,6 +444,11 @@ void add_taint(unsigned flag, enum lockdep_ok lockdep_ok)
                pr_warn("Disabling lock debugging due to kernel taint\n");
 
        set_bit(flag, &tainted_mask);
+
+       if (tainted_mask & panic_on_taint) {
+               panic_on_taint = 0;
+               panic("panic_on_taint set ...");
+       }
 }
 EXPORT_SYMBOL(add_taint);
 
@@ -515,6 +530,9 @@ void oops_enter(void)
        /* can't trust the integrity of the kernel anymore: */
        debug_locks_off();
        do_oops_enter_exit();
+
+       if (sysctl_oops_all_cpu_backtrace)
+               trigger_all_cpu_backtrace();
 }
 
 /*
@@ -686,3 +704,30 @@ static int __init oops_setup(char *s)
        return 0;
 }
 early_param("oops", oops_setup);
+
+static int __init panic_on_taint_setup(char *s)
+{
+       char *taint_str;
+
+       if (!s)
+               return -EINVAL;
+
+       taint_str = strsep(&s, ",");
+       if (kstrtoul(taint_str, 16, &panic_on_taint))
+               return -EINVAL;
+
+       /* make sure panic_on_taint doesn't hold out-of-range TAINT flags */
+       panic_on_taint &= TAINT_FLAGS_MAX;
+
+       if (!panic_on_taint)
+               return -EINVAL;
+
+       if (s && !strcmp(s, "nousertaint"))
+               panic_on_taint_nousertaint = true;
+
+       pr_info("panic_on_taint: bitmask=0x%lx nousertaint_mode=%sabled\n",
+               panic_on_taint, panic_on_taint_nousertaint ? "en" : "dis");
+
+       return 0;
+}
+early_param("panic_on_taint", panic_on_taint_setup);