taint: add explicit flag to show whether lock dep is still OK.
authorRusty Russell <rusty@rustcorp.com.au>
Mon, 21 Jan 2013 06:47:39 +0000 (17:17 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Mon, 21 Jan 2013 06:47:57 +0000 (17:17 +1030)
Fix up all callers as they were before, with make one change: an
unsigned module taints the kernel, but doesn't turn off lockdep.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
37 files changed:
arch/alpha/kernel/traps.c
arch/arm/kernel/traps.c
arch/arm64/kernel/traps.c
arch/avr32/kernel/traps.c
arch/hexagon/kernel/traps.c
arch/ia64/kernel/traps.c
arch/m68k/kernel/traps.c
arch/mips/kernel/traps.c
arch/parisc/kernel/traps.c
arch/powerpc/kernel/traps.c
arch/s390/kernel/traps.c
arch/sh/kernel/traps.c
arch/sparc/kernel/setup_64.c
arch/sparc/kernel/traps_32.c
arch/sparc/kernel/traps_64.c
arch/unicore32/kernel/traps.c
arch/x86/kernel/cpu/amd.c
arch/x86/kernel/cpu/mcheck/mce.c
arch/x86/kernel/cpu/mcheck/p5.c
arch/x86/kernel/cpu/mcheck/winchip.c
arch/x86/kernel/cpu/mtrr/generic.c
arch/x86/kernel/dumpstack.c
arch/xtensa/kernel/traps.c
drivers/acpi/custom_method.c
drivers/acpi/osl.c
drivers/base/regmap/regmap-debugfs.c
include/linux/kernel.h
kernel/module.c
kernel/panic.c
kernel/sched/core.c
kernel/sysctl.c
lib/bug.c
mm/memory.c
mm/page_alloc.c
mm/slab.c
mm/slub.c
sound/soc/soc-core.c

index 272666d006df1ddd67635caf229221c9b92244c6..4037461a649347e46eac68980be78f22935ea01f 100644 (file)
@@ -186,7 +186,7 @@ die_if_kernel(char * str, struct pt_regs *regs, long err, unsigned long *r9_15)
 #endif
        printk("%s(%d): %s %ld\n", current->comm, task_pid_nr(current), str, err);
        dik_show_regs(regs, r9_15);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        dik_show_trace((unsigned long *)(regs+1));
        dik_show_code((unsigned int *)regs->pc);
 
index b0179b89a04ce26062184aaf23f86c521fb3009c..1c089119b2d7cd3f8d8847facc709e1a9078235b 100644 (file)
@@ -296,7 +296,7 @@ static void oops_end(unsigned long flags, struct pt_regs *regs, int signr)
 
        bust_spinlocks(0);
        die_owner = -1;
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        die_nest_count--;
        if (!die_nest_count)
                /* Nest count reaches zero, release the lock. */
index 3883f842434fab09e103186ec9d8a3b146724d16..b3c5f628bdb45490bbf863e5c195f81bc74938c6 100644 (file)
@@ -242,7 +242,7 @@ void die(const char *str, struct pt_regs *regs, int err)
                crash_kexec(regs);
 
        bust_spinlocks(0);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        raw_spin_unlock_irq(&die_lock);
        oops_exit();
 
index 3d760c06f02481851e6ab27e57e819a376dcb6d5..682b2478691a7572a8edf101a9f5f0fd8d41fd61 100644 (file)
@@ -61,7 +61,7 @@ void die(const char *str, struct pt_regs *regs, long err)
        show_regs_log_lvl(regs, KERN_EMERG);
        show_stack_log_lvl(current, regs->sp, regs, KERN_EMERG);
        bust_spinlocks(0);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        spin_unlock_irq(&die_lock);
 
        if (in_interrupt())
index a41eeb8eeaa1a7734e7d170ec679c1438e70adc9..be5e2dd9c9d3076fc88a11a9b3f4bf17b97fdb75 100644 (file)
@@ -225,7 +225,7 @@ int die(const char *str, struct pt_regs *regs, long err)
        do_show_stack(current, &regs->r30, pt_elr(regs));
 
        bust_spinlocks(0);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
 
        spin_unlock_irq(&die.lock);
 
index bd42b76000d153f9cfdaa14958fca4117880779d..f7f9f9c6caf03b19e6dfd89f754146d8412421a7 100644 (file)
@@ -72,7 +72,7 @@ die (const char *str, struct pt_regs *regs, long err)
 
        bust_spinlocks(0);
        die.lock_owner = -1;
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        spin_unlock_irq(&die.lock);
 
        if (!regs)
index cbc624af4494dfcbf0d5516282697f3b9a92e9bf..f32ab22e7ed3e3d74016ce24849bc14ddb2189d4 100644 (file)
@@ -1176,7 +1176,7 @@ void die_if_kernel (char *str, struct pt_regs *fp, int nr)
        console_verbose();
        printk("%s: %08x\n",str,nr);
        show_registers(fp);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        do_exit(SIGSEGV);
 }
 
index cf7ac5483f5398e8f91b05c1615a7aab6efa6349..9007966d56d455e74b1dc2c5de4f1c04cb5cd5d5 100644 (file)
@@ -396,7 +396,7 @@ void __noreturn die(const char *str, struct pt_regs *regs)
 
        printk("%s[#%d]:\n", str, ++die_counter);
        show_registers(regs);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        raw_spin_unlock_irq(&die_lock);
 
        oops_exit();
index 45ba99f5080ba2c4fb5b7105510fd4977ac47ac4..aeb8f8f2c07a57c3d677d1c454ae6b032959a009 100644 (file)
@@ -282,7 +282,7 @@ void die_if_kernel(char *str, struct pt_regs *regs, long err)
 
        show_regs(regs);
        dump_stack();
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
 
        if (in_interrupt())
                panic("Fatal exception in interrupt");
index 32518401af68d274be52d52cf9249505496d07a9..c579db859388ec6bafc27d377008e776be2f4077 100644 (file)
@@ -138,7 +138,7 @@ static void __kprobes oops_end(unsigned long flags, struct pt_regs *regs,
 {
        bust_spinlocks(0);
        die_owner = -1;
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        die_nest_count--;
        oops_exit();
        printk("\n");
index 70ecfc5fe8f0acc87b7fe0036df511f283b22dbe..13dd63fba367e1ccd7b113f4ad2a6ebf25af7845 100644 (file)
@@ -271,7 +271,7 @@ void die(struct pt_regs *regs, const char *str)
        print_modules();
        show_regs(regs);
        bust_spinlocks(0);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        spin_unlock_irq(&die_lock);
        if (in_interrupt())
                panic("Fatal exception in interrupt");
index 72246bc06884c8dee333544ee2c0161090b814db..dfdad72c61caf2847cddac6c37c344c1a635b6cb 100644 (file)
@@ -38,7 +38,7 @@ void die(const char *str, struct pt_regs *regs, long err)
        notify_die(DIE_OOPS, str, regs, err, 255, SIGSEGV);
 
        bust_spinlocks(0);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        spin_unlock_irq(&die_lock);
        oops_exit();
 
index 0eaf0059aaefa483bdbb228bf38c8154a7d9656b..88a127b9c69e8b1876a94b60db94456eca6fe5ef 100644 (file)
@@ -115,7 +115,7 @@ static void __init process_switch(char c)
                        break;
                }
                cheetah_pcache_forced_on = 1;
-               add_taint(TAINT_MACHINE_CHECK);
+               add_taint(TAINT_MACHINE_CHECK, LOCKDEP_NOW_UNRELIABLE);
                cheetah_enable_pcache();
                break;
 
index a5785ea2a85d0b8758e35840e9d2a08f2c3c013b..662982946a89184916f32137b4b422b3044af3e7 100644 (file)
@@ -58,7 +58,7 @@ void die_if_kernel(char *str, struct pt_regs *regs)
 
        printk("%s(%d): %s [#%d]\n", current->comm, task_pid_nr(current), str, ++die_counter);
        show_regs(regs);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
 
        __SAVE; __SAVE; __SAVE; __SAVE;
        __SAVE; __SAVE; __SAVE; __SAVE;
index e7ecf1507d901cadecbc45cf881b6c22ebe7d293..8d38ca97aa23c45c305d3ffcf820eda0dfb08790 100644 (file)
@@ -2383,7 +2383,7 @@ void die_if_kernel(char *str, struct pt_regs *regs)
        notify_die(DIE_OOPS, str, regs, 0, 255, SIGSEGV);
        __asm__ __volatile__("flushw");
        show_regs(regs);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        if (regs->tstate & TSTATE_PRIV) {
                struct thread_info *tp = current_thread_info();
                struct reg_window *rw = (struct reg_window *)
index 2054f0d4db1355fcb6b7891a7a2023b6218ef756..0870b68d2ad9b32816c4ffb0e8366a3c6a0bec68 100644 (file)
@@ -231,7 +231,7 @@ void die(const char *str, struct pt_regs *regs, int err)
        ret = __die(str, err, thread, regs);
 
        bust_spinlocks(0);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        spin_unlock_irq(&die_lock);
        oops_exit();
 
index 15239fffd6fee747913a1f0e493c512885239379..5853e57523e536322c92ca28cd9f92ea81f76fc5 100644 (file)
@@ -220,8 +220,7 @@ static void __cpuinit amd_k7_smp_check(struct cpuinfo_x86 *c)
         */
        WARN_ONCE(1, "WARNING: This combination of AMD"
                " processors is not suitable for SMP.\n");
-       if (!test_taint(TAINT_UNSAFE_SMP))
-               add_taint(TAINT_UNSAFE_SMP);
+       add_taint(TAINT_UNSAFE_SMP, LOCKDEP_NOW_UNRELIABLE);
 
 valid_k7:
        ;
index 80dbda84f1c3c2b215242d5e5381848a4ec0c372..6bc15edbc8cdc54392ddf1ec8598fce6f8d27e8d 100644 (file)
@@ -1085,7 +1085,7 @@ void do_machine_check(struct pt_regs *regs, long error_code)
                /*
                 * Set taint even when machine check was not enabled.
                 */
-               add_taint(TAINT_MACHINE_CHECK);
+               add_taint(TAINT_MACHINE_CHECK, LOCKDEP_NOW_UNRELIABLE);
 
                severity = mce_severity(&m, cfg->tolerant, NULL);
 
index 2d5454cd2c4fdef4d775fdf7210c4f4885a77710..1c044b1ccc593cd973a321faa63edd7c27bd446b 100644 (file)
@@ -33,7 +33,7 @@ static void pentium_machine_check(struct pt_regs *regs, long error_code)
                        smp_processor_id());
        }
 
-       add_taint(TAINT_MACHINE_CHECK);
+       add_taint(TAINT_MACHINE_CHECK, LOCKDEP_NOW_UNRELIABLE);
 }
 
 /* Set up machine check reporting for processors with Intel style MCE: */
index 2d7998fb628cb5679069b5ef50ba7d6e41a1c498..e9a701aecaa14a3959e8c2176e14a9be308d8bcd 100644 (file)
@@ -15,7 +15,7 @@
 static void winchip_machine_check(struct pt_regs *regs, long error_code)
 {
        printk(KERN_EMERG "CPU0: Machine Check Exception.\n");
-       add_taint(TAINT_MACHINE_CHECK);
+       add_taint(TAINT_MACHINE_CHECK, LOCKDEP_NOW_UNRELIABLE);
 }
 
 /* Set up machine check reporting on the Winchip C6 series */
index e9fe907cd2495c9ad6a687f9b45a49c39a5ebd26..fa72a39e5d463a248a5b5a4a18f7860a1cbb8a77 100644 (file)
@@ -542,7 +542,7 @@ static void generic_get_mtrr(unsigned int reg, unsigned long *base,
 
                if (tmp != mask_lo) {
                        printk(KERN_WARNING "mtrr: your BIOS has configured an incorrect mask, fixing it.\n");
-                       add_taint(TAINT_FIRMWARE_WORKAROUND);
+                       add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
                        mask_lo = tmp;
                }
        }
index ae42418bc50f23f83d92f68e4e771daf36652978..c8797d55b24546eb7b3ea4abaeffe89d826d7655 100644 (file)
@@ -232,7 +232,7 @@ void __kprobes oops_end(unsigned long flags, struct pt_regs *regs, int signr)
 
        bust_spinlocks(0);
        die_owner = -1;
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        die_nest_count--;
        if (!die_nest_count)
                /* Nest count reaches zero, release the lock. */
index 01e0111bf787f610ac004c976aaf585a3928e5d6..ded955d4515580c9e2bbb0d84f7ac9ac313d2078 100644 (file)
@@ -524,7 +524,7 @@ void die(const char * str, struct pt_regs * regs, long err)
        if (!user_mode(regs))
                show_stack(NULL, (unsigned long*)regs->areg[1]);
 
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        spin_unlock_irq(&die_lock);
 
        if (in_interrupt())
index 5d42c2414ae54c437051ecd65f2b849dd67b61e3..cd9a68e2fea969ae7050e6d3f9aee261d940340b 100644 (file)
@@ -66,7 +66,7 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf,
                buf = NULL;
                if (ACPI_FAILURE(status))
                        return -EINVAL;
-               add_taint(TAINT_OVERRIDDEN_ACPI_TABLE);
+               add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE);
        }
 
        return count;
index 3ff267861541f7570a5b110b7893e0cb012f5917..535e888bad78d29b83e3027b6c822a742cec117d 100644 (file)
@@ -661,7 +661,7 @@ static void acpi_table_taint(struct acpi_table_header *table)
        pr_warn(PREFIX
                "Override [%4.4s-%8.8s], this is unsafe: tainting kernel\n",
                table->signature, table->oem_table_id);
-       add_taint(TAINT_OVERRIDDEN_ACPI_TABLE);
+       add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE);
 }
 
 
index 46a213a596e29ec5ae142477e40c563744f49ede..f63c830083ec9018dce591b1f3ed121088092ad4 100644 (file)
@@ -267,7 +267,7 @@ static ssize_t regmap_map_write_file(struct file *file,
                return -EINVAL;
 
        /* Userspace has been fiddling around behind the kernel's back */
-       add_taint(TAINT_USER);
+       add_taint(TAINT_USER, LOCKDEP_NOW_UNRELIABLE);
 
        regmap_write(map, reg, value);
        return buf_size;
index c566927efcbd254efa6c30c0a82fd10ccb11f363..80d36874689b40da26a3107ba509a8ca10dc74da 100644 (file)
@@ -398,7 +398,11 @@ extern int panic_on_unrecovered_nmi;
 extern int panic_on_io_nmi;
 extern int sysctl_panic_on_stackoverflow;
 extern const char *print_tainted(void);
-extern void add_taint(unsigned flag);
+enum lockdep_ok {
+       LOCKDEP_STILL_OK,
+       LOCKDEP_NOW_UNRELIABLE
+};
+extern void add_taint(unsigned flag, enum lockdep_ok);
 extern int test_taint(unsigned flag);
 extern unsigned long get_taint(void);
 extern int root_mountflags;
index e69a5a68766fb5a84ecae9d1709187acc2d253de..cc000dd6e4a84c152304ea32d1f02e9ff4318490 100644 (file)
@@ -197,9 +197,10 @@ static inline int strong_try_module_get(struct module *mod)
                return -ENOENT;
 }
 
-static inline void add_taint_module(struct module *mod, unsigned flag)
+static inline void add_taint_module(struct module *mod, unsigned flag,
+                                   enum lockdep_ok lockdep_ok)
 {
-       add_taint(flag);
+       add_taint(flag, lockdep_ok);
        mod->taints |= (1U << flag);
 }
 
@@ -727,7 +728,7 @@ static inline int try_force_unload(unsigned int flags)
 {
        int ret = (flags & O_TRUNC);
        if (ret)
-               add_taint(TAINT_FORCED_RMMOD);
+               add_taint(TAINT_FORCED_RMMOD, LOCKDEP_NOW_UNRELIABLE);
        return ret;
 }
 #else
@@ -1138,7 +1139,7 @@ static int try_to_force_load(struct module *mod, const char *reason)
        if (!test_taint(TAINT_FORCED_MODULE))
                printk(KERN_WARNING "%s: %s: kernel tainted.\n",
                       mod->name, reason);
-       add_taint_module(mod, TAINT_FORCED_MODULE);
+       add_taint_module(mod, TAINT_FORCED_MODULE, LOCKDEP_NOW_UNRELIABLE);
        return 0;
 #else
        return -ENOEXEC;
@@ -2147,7 +2148,8 @@ static void set_license(struct module *mod, const char *license)
                if (!test_taint(TAINT_PROPRIETARY_MODULE))
                        printk(KERN_WARNING "%s: module license '%s' taints "
                                "kernel.\n", mod->name, license);
-               add_taint_module(mod, TAINT_PROPRIETARY_MODULE);
+               add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
+                                LOCKDEP_NOW_UNRELIABLE);
        }
 }
 
@@ -2700,10 +2702,10 @@ static int check_modinfo(struct module *mod, struct load_info *info, int flags)
        }
 
        if (!get_modinfo(info, "intree"))
-               add_taint_module(mod, TAINT_OOT_MODULE);
+               add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);
 
        if (get_modinfo(info, "staging")) {
-               add_taint_module(mod, TAINT_CRAP);
+               add_taint_module(mod, TAINT_CRAP, LOCKDEP_STILL_OK);
                printk(KERN_WARNING "%s: module is from the staging directory,"
                       " the quality is unknown, you have been warned.\n",
                       mod->name);
@@ -2869,15 +2871,17 @@ static int check_module_license_and_versions(struct module *mod)
         * using GPL-only symbols it needs.
         */
        if (strcmp(mod->name, "ndiswrapper") == 0)
-               add_taint(TAINT_PROPRIETARY_MODULE);
+               add_taint(TAINT_PROPRIETARY_MODULE, LOCKDEP_NOW_UNRELIABLE);
 
        /* driverloader was caught wrongly pretending to be under GPL */
        if (strcmp(mod->name, "driverloader") == 0)
-               add_taint_module(mod, TAINT_PROPRIETARY_MODULE);
+               add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
+                                LOCKDEP_NOW_UNRELIABLE);
 
        /* lve claims to be GPL but upstream won't provide source */
        if (strcmp(mod->name, "lve") == 0)
-               add_taint_module(mod, TAINT_PROPRIETARY_MODULE);
+               add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
+                                LOCKDEP_NOW_UNRELIABLE);
 
 #ifdef CONFIG_MODVERSIONS
        if ((mod->num_syms && !mod->crcs)
@@ -3197,7 +3201,7 @@ again:
                            "%s: module verification failed: signature and/or"
                            " required key missing - tainting kernel\n",
                            mod->name);
-               add_taint_module(mod, TAINT_FORCED_MODULE);
+               add_taint_module(mod, TAINT_FORCED_MODULE, LOCKDEP_STILL_OK);
        }
 #endif
 
index e1b2822fff97b8164ffae96e8a17ace02060a0c1..7c57cc9eee2c3155c707281832cbbf9d15b0dfd4 100644 (file)
@@ -259,26 +259,19 @@ unsigned long get_taint(void)
        return tainted_mask;
 }
 
-void add_taint(unsigned flag)
+/**
+ * add_taint: add a taint flag if not already set.
+ * @flag: one of the TAINT_* constants.
+ * @lockdep_ok: whether lock debugging is still OK.
+ *
+ * If something bad has gone wrong, you'll want @lockdebug_ok = false, but for
+ * some notewortht-but-not-corrupting cases, it can be set to true.
+ */
+void add_taint(unsigned flag, enum lockdep_ok lockdep_ok)
 {
-       /*
-        * Can't trust the integrity of the kernel anymore.
-        * We don't call directly debug_locks_off() because the issue
-        * is not necessarily serious enough to set oops_in_progress to 1
-        * Also we want to keep up lockdep for staging/out-of-tree
-        * development and post-warning case.
-        */
-       switch (flag) {
-       case TAINT_CRAP:
-       case TAINT_OOT_MODULE:
-       case TAINT_WARN:
-       case TAINT_FIRMWARE_WORKAROUND:
-               break;
-
-       default:
-               if (__debug_locks_off())
-                       printk(KERN_WARNING "Disabling lock debugging due to kernel taint\n");
-       }
+       if (lockdep_ok == LOCKDEP_NOW_UNRELIABLE && __debug_locks_off())
+               printk(KERN_WARNING
+                      "Disabling lock debugging due to kernel taint\n");
 
        set_bit(flag, &tainted_mask);
 }
@@ -421,7 +414,8 @@ static void warn_slowpath_common(const char *file, int line, void *caller,
        print_modules();
        dump_stack();
        print_oops_end_marker();
-       add_taint(taint);
+       /* Just a warning, don't kill lockdep. */
+       add_taint(taint, LOCKDEP_STILL_OK);
 }
 
 void warn_slowpath_fmt(const char *file, int line, const char *fmt, ...)
index 257002c13bb02acad92c74347e3b38ca3bc881b1..662f3d5121837436f77be9c567ea9271f1067ae1 100644 (file)
@@ -2785,7 +2785,7 @@ static noinline void __schedule_bug(struct task_struct *prev)
        if (irqs_disabled())
                print_irqtrace_events(prev);
        dump_stack();
-       add_taint(TAINT_WARN);
+       add_taint(TAINT_WARN, LOCKDEP_STILL_OK);
 }
 
 /*
index c88878db491e44bd2b5a5ea7f381fc7242187727..f97f9d75cde8ceade0bd57d01f7c77d463cc39a2 100644 (file)
@@ -2006,7 +2006,7 @@ static int proc_taint(struct ctl_table *table, int write,
                int i;
                for (i = 0; i < BITS_PER_LONG && tmptaint >> i; i++) {
                        if ((tmptaint >> i) & 1)
-                               add_taint(i);
+                               add_taint(i, LOCKDEP_STILL_OK);
                }
        }
 
index d0cdf14c651ae629cba6731debb3b6a5edee39bf..168603477f02889f13fd7119cc55f5e325b08ff9 100644 (file)
--- a/lib/bug.c
+++ b/lib/bug.c
@@ -166,7 +166,8 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs)
                print_modules();
                show_regs(regs);
                print_oops_end_marker();
-               add_taint(BUG_GET_TAINT(bug));
+               /* Just a warning, don't kill lockdep. */
+               add_taint(BUG_GET_TAINT(bug), LOCKDEP_STILL_OK);
                return BUG_TRAP_TYPE_WARN;
        }
 
index bb1369f7b9b4ba8af51d90a40de8f522aa2470dc..bc8bec762db7d8c42bed6167a289d5dc0e7842fb 100644 (file)
@@ -716,7 +716,7 @@ static void print_bad_pte(struct vm_area_struct *vma, unsigned long addr,
                print_symbol(KERN_ALERT "vma->vm_file->f_op->mmap: %s\n",
                                (unsigned long)vma->vm_file->f_op->mmap);
        dump_stack();
-       add_taint(TAINT_BAD_PAGE);
+       add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE);
 }
 
 static inline bool is_cow_mapping(vm_flags_t flags)
index df2022ff0c8a1d9fb7ff13ed4cf88058999485e6..4c99cb7e276a64b4ac404b6b28634f659015ac41 100644 (file)
@@ -320,7 +320,7 @@ static void bad_page(struct page *page)
 out:
        /* Leave bad fields for debug, except PageBuddy could make trouble */
        reset_page_mapcount(page); /* remove PageBuddy */
-       add_taint(TAINT_BAD_PAGE);
+       add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE);
 }
 
 /*
index e7667a3584bc664f023356fc58d67baa30959e69..856e4a192d25c73954771b1b0893458f0d9209bb 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -812,7 +812,7 @@ static void __slab_error(const char *function, struct kmem_cache *cachep,
        printk(KERN_ERR "slab error in %s(): cache `%s': %s\n",
               function, cachep->name, msg);
        dump_stack();
-       add_taint(TAINT_BAD_PAGE);
+       add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE);
 }
 #endif
 
index ba2ca53f6c3aafdd3165c3ae5115fb719d0c17bd..7ec3041bdd0d0361334f53aac9d8412d82f252a6 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -562,7 +562,7 @@ static void slab_bug(struct kmem_cache *s, char *fmt, ...)
        printk(KERN_ERR "----------------------------------------"
                        "-------------------------------------\n\n");
 
-       add_taint(TAINT_BAD_PAGE);
+       add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE);
 }
 
 static void slab_fix(struct kmem_cache *s, char *fmt, ...)
index 2370063b58245946f71adfa05f361097d3e53374..4c6526c0db03c0543c6defe45aeec7f21f4265d6 100644 (file)
@@ -251,7 +251,7 @@ static ssize_t codec_reg_write_file(struct file *file,
                return -EINVAL;
 
        /* Userspace has been fiddling around behind the kernel's back */
-       add_taint(TAINT_USER);
+       add_taint(TAINT_USER, LOCKDEP_NOW_UNRELIABLE);
 
        snd_soc_write(codec, reg, value);
        return buf_size;