Commit 373d4d09 authored by Rusty Russell's avatar Rusty Russell

taint: add explicit flag to show whether lock dep is still OK.

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: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 64748a2c
...@@ -186,7 +186,7 @@ die_if_kernel(char * str, struct pt_regs *regs, long err, unsigned long *r9_15) ...@@ -186,7 +186,7 @@ die_if_kernel(char * str, struct pt_regs *regs, long err, unsigned long *r9_15)
#endif #endif
printk("%s(%d): %s %ld\n", current->comm, task_pid_nr(current), str, err); printk("%s(%d): %s %ld\n", current->comm, task_pid_nr(current), str, err);
dik_show_regs(regs, r9_15); 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_trace((unsigned long *)(regs+1));
dik_show_code((unsigned int *)regs->pc); dik_show_code((unsigned int *)regs->pc);
......
...@@ -296,7 +296,7 @@ static void oops_end(unsigned long flags, struct pt_regs *regs, int signr) ...@@ -296,7 +296,7 @@ static void oops_end(unsigned long flags, struct pt_regs *regs, int signr)
bust_spinlocks(0); bust_spinlocks(0);
die_owner = -1; die_owner = -1;
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
die_nest_count--; die_nest_count--;
if (!die_nest_count) if (!die_nest_count)
/* Nest count reaches zero, release the lock. */ /* Nest count reaches zero, release the lock. */
......
...@@ -242,7 +242,7 @@ void die(const char *str, struct pt_regs *regs, int err) ...@@ -242,7 +242,7 @@ void die(const char *str, struct pt_regs *regs, int err)
crash_kexec(regs); crash_kexec(regs);
bust_spinlocks(0); bust_spinlocks(0);
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
raw_spin_unlock_irq(&die_lock); raw_spin_unlock_irq(&die_lock);
oops_exit(); oops_exit();
......
...@@ -61,7 +61,7 @@ void die(const char *str, struct pt_regs *regs, long err) ...@@ -61,7 +61,7 @@ void die(const char *str, struct pt_regs *regs, long err)
show_regs_log_lvl(regs, KERN_EMERG); show_regs_log_lvl(regs, KERN_EMERG);
show_stack_log_lvl(current, regs->sp, regs, KERN_EMERG); show_stack_log_lvl(current, regs->sp, regs, KERN_EMERG);
bust_spinlocks(0); bust_spinlocks(0);
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
spin_unlock_irq(&die_lock); spin_unlock_irq(&die_lock);
if (in_interrupt()) if (in_interrupt())
......
...@@ -225,7 +225,7 @@ int die(const char *str, struct pt_regs *regs, long err) ...@@ -225,7 +225,7 @@ int die(const char *str, struct pt_regs *regs, long err)
do_show_stack(current, &regs->r30, pt_elr(regs)); do_show_stack(current, &regs->r30, pt_elr(regs));
bust_spinlocks(0); bust_spinlocks(0);
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
spin_unlock_irq(&die.lock); spin_unlock_irq(&die.lock);
......
...@@ -72,7 +72,7 @@ die (const char *str, struct pt_regs *regs, long err) ...@@ -72,7 +72,7 @@ die (const char *str, struct pt_regs *regs, long err)
bust_spinlocks(0); bust_spinlocks(0);
die.lock_owner = -1; die.lock_owner = -1;
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
spin_unlock_irq(&die.lock); spin_unlock_irq(&die.lock);
if (!regs) if (!regs)
......
...@@ -1176,7 +1176,7 @@ void die_if_kernel (char *str, struct pt_regs *fp, int nr) ...@@ -1176,7 +1176,7 @@ void die_if_kernel (char *str, struct pt_regs *fp, int nr)
console_verbose(); console_verbose();
printk("%s: %08x\n",str,nr); printk("%s: %08x\n",str,nr);
show_registers(fp); show_registers(fp);
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
do_exit(SIGSEGV); do_exit(SIGSEGV);
} }
......
...@@ -396,7 +396,7 @@ void __noreturn die(const char *str, struct pt_regs *regs) ...@@ -396,7 +396,7 @@ void __noreturn die(const char *str, struct pt_regs *regs)
printk("%s[#%d]:\n", str, ++die_counter); printk("%s[#%d]:\n", str, ++die_counter);
show_registers(regs); show_registers(regs);
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
raw_spin_unlock_irq(&die_lock); raw_spin_unlock_irq(&die_lock);
oops_exit(); oops_exit();
......
...@@ -282,7 +282,7 @@ void die_if_kernel(char *str, struct pt_regs *regs, long err) ...@@ -282,7 +282,7 @@ void die_if_kernel(char *str, struct pt_regs *regs, long err)
show_regs(regs); show_regs(regs);
dump_stack(); dump_stack();
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
if (in_interrupt()) if (in_interrupt())
panic("Fatal exception in interrupt"); panic("Fatal exception in interrupt");
......
...@@ -138,7 +138,7 @@ static void __kprobes oops_end(unsigned long flags, struct pt_regs *regs, ...@@ -138,7 +138,7 @@ static void __kprobes oops_end(unsigned long flags, struct pt_regs *regs,
{ {
bust_spinlocks(0); bust_spinlocks(0);
die_owner = -1; die_owner = -1;
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
die_nest_count--; die_nest_count--;
oops_exit(); oops_exit();
printk("\n"); printk("\n");
......
...@@ -271,7 +271,7 @@ void die(struct pt_regs *regs, const char *str) ...@@ -271,7 +271,7 @@ void die(struct pt_regs *regs, const char *str)
print_modules(); print_modules();
show_regs(regs); show_regs(regs);
bust_spinlocks(0); bust_spinlocks(0);
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
spin_unlock_irq(&die_lock); spin_unlock_irq(&die_lock);
if (in_interrupt()) if (in_interrupt())
panic("Fatal exception in interrupt"); panic("Fatal exception in interrupt");
......
...@@ -38,7 +38,7 @@ void die(const char *str, struct pt_regs *regs, long err) ...@@ -38,7 +38,7 @@ void die(const char *str, struct pt_regs *regs, long err)
notify_die(DIE_OOPS, str, regs, err, 255, SIGSEGV); notify_die(DIE_OOPS, str, regs, err, 255, SIGSEGV);
bust_spinlocks(0); bust_spinlocks(0);
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
spin_unlock_irq(&die_lock); spin_unlock_irq(&die_lock);
oops_exit(); oops_exit();
......
...@@ -115,7 +115,7 @@ static void __init process_switch(char c) ...@@ -115,7 +115,7 @@ static void __init process_switch(char c)
break; break;
} }
cheetah_pcache_forced_on = 1; cheetah_pcache_forced_on = 1;
add_taint(TAINT_MACHINE_CHECK); add_taint(TAINT_MACHINE_CHECK, LOCKDEP_NOW_UNRELIABLE);
cheetah_enable_pcache(); cheetah_enable_pcache();
break; break;
......
...@@ -58,7 +58,7 @@ void die_if_kernel(char *str, struct pt_regs *regs) ...@@ -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); printk("%s(%d): %s [#%d]\n", current->comm, task_pid_nr(current), str, ++die_counter);
show_regs(regs); show_regs(regs);
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
__SAVE; __SAVE; __SAVE; __SAVE; __SAVE; __SAVE; __SAVE; __SAVE;
__SAVE; __SAVE; __SAVE; __SAVE; __SAVE; __SAVE; __SAVE; __SAVE;
......
...@@ -2383,7 +2383,7 @@ void die_if_kernel(char *str, struct pt_regs *regs) ...@@ -2383,7 +2383,7 @@ void die_if_kernel(char *str, struct pt_regs *regs)
notify_die(DIE_OOPS, str, regs, 0, 255, SIGSEGV); notify_die(DIE_OOPS, str, regs, 0, 255, SIGSEGV);
__asm__ __volatile__("flushw"); __asm__ __volatile__("flushw");
show_regs(regs); show_regs(regs);
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
if (regs->tstate & TSTATE_PRIV) { if (regs->tstate & TSTATE_PRIV) {
struct thread_info *tp = current_thread_info(); struct thread_info *tp = current_thread_info();
struct reg_window *rw = (struct reg_window *) struct reg_window *rw = (struct reg_window *)
......
...@@ -231,7 +231,7 @@ void die(const char *str, struct pt_regs *regs, int err) ...@@ -231,7 +231,7 @@ void die(const char *str, struct pt_regs *regs, int err)
ret = __die(str, err, thread, regs); ret = __die(str, err, thread, regs);
bust_spinlocks(0); bust_spinlocks(0);
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
spin_unlock_irq(&die_lock); spin_unlock_irq(&die_lock);
oops_exit(); oops_exit();
......
...@@ -220,8 +220,7 @@ static void __cpuinit amd_k7_smp_check(struct cpuinfo_x86 *c) ...@@ -220,8 +220,7 @@ static void __cpuinit amd_k7_smp_check(struct cpuinfo_x86 *c)
*/ */
WARN_ONCE(1, "WARNING: This combination of AMD" WARN_ONCE(1, "WARNING: This combination of AMD"
" processors is not suitable for SMP.\n"); " processors is not suitable for SMP.\n");
if (!test_taint(TAINT_UNSAFE_SMP)) add_taint(TAINT_UNSAFE_SMP, LOCKDEP_NOW_UNRELIABLE);
add_taint(TAINT_UNSAFE_SMP);
valid_k7: valid_k7:
; ;
......
...@@ -1085,7 +1085,7 @@ void do_machine_check(struct pt_regs *regs, long error_code) ...@@ -1085,7 +1085,7 @@ void do_machine_check(struct pt_regs *regs, long error_code)
/* /*
* Set taint even when machine check was not enabled. * 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); severity = mce_severity(&m, cfg->tolerant, NULL);
......
...@@ -33,7 +33,7 @@ static void pentium_machine_check(struct pt_regs *regs, long error_code) ...@@ -33,7 +33,7 @@ static void pentium_machine_check(struct pt_regs *regs, long error_code)
smp_processor_id()); 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: */ /* Set up machine check reporting for processors with Intel style MCE: */
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
static void winchip_machine_check(struct pt_regs *regs, long error_code) static void winchip_machine_check(struct pt_regs *regs, long error_code)
{ {
printk(KERN_EMERG "CPU0: Machine Check Exception.\n"); 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 */ /* Set up machine check reporting on the Winchip C6 series */
......
...@@ -542,7 +542,7 @@ static void generic_get_mtrr(unsigned int reg, unsigned long *base, ...@@ -542,7 +542,7 @@ static void generic_get_mtrr(unsigned int reg, unsigned long *base,
if (tmp != mask_lo) { if (tmp != mask_lo) {
printk(KERN_WARNING "mtrr: your BIOS has configured an incorrect mask, fixing it.\n"); 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; mask_lo = tmp;
} }
} }
......
...@@ -232,7 +232,7 @@ void __kprobes oops_end(unsigned long flags, struct pt_regs *regs, int signr) ...@@ -232,7 +232,7 @@ void __kprobes oops_end(unsigned long flags, struct pt_regs *regs, int signr)
bust_spinlocks(0); bust_spinlocks(0);
die_owner = -1; die_owner = -1;
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
die_nest_count--; die_nest_count--;
if (!die_nest_count) if (!die_nest_count)
/* Nest count reaches zero, release the lock. */ /* Nest count reaches zero, release the lock. */
......
...@@ -524,7 +524,7 @@ void die(const char * str, struct pt_regs * regs, long err) ...@@ -524,7 +524,7 @@ void die(const char * str, struct pt_regs * regs, long err)
if (!user_mode(regs)) if (!user_mode(regs))
show_stack(NULL, (unsigned long*)regs->areg[1]); show_stack(NULL, (unsigned long*)regs->areg[1]);
add_taint(TAINT_DIE); add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
spin_unlock_irq(&die_lock); spin_unlock_irq(&die_lock);
if (in_interrupt()) if (in_interrupt())
......
...@@ -66,7 +66,7 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf, ...@@ -66,7 +66,7 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf,
buf = NULL; buf = NULL;
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
return -EINVAL; return -EINVAL;
add_taint(TAINT_OVERRIDDEN_ACPI_TABLE); add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE);
} }
return count; return count;
......
...@@ -661,7 +661,7 @@ static void acpi_table_taint(struct acpi_table_header *table) ...@@ -661,7 +661,7 @@ static void acpi_table_taint(struct acpi_table_header *table)
pr_warn(PREFIX pr_warn(PREFIX
"Override [%4.4s-%8.8s], this is unsafe: tainting kernel\n", "Override [%4.4s-%8.8s], this is unsafe: tainting kernel\n",
table->signature, table->oem_table_id); table->signature, table->oem_table_id);
add_taint(TAINT_OVERRIDDEN_ACPI_TABLE); add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE);
} }
......
...@@ -267,7 +267,7 @@ static ssize_t regmap_map_write_file(struct file *file, ...@@ -267,7 +267,7 @@ static ssize_t regmap_map_write_file(struct file *file,
return -EINVAL; return -EINVAL;
/* Userspace has been fiddling around behind the kernel's back */ /* 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); regmap_write(map, reg, value);
return buf_size; return buf_size;
......
...@@ -398,7 +398,11 @@ extern int panic_on_unrecovered_nmi; ...@@ -398,7 +398,11 @@ extern int panic_on_unrecovered_nmi;
extern int panic_on_io_nmi; extern int panic_on_io_nmi;
extern int sysctl_panic_on_stackoverflow; extern int sysctl_panic_on_stackoverflow;
extern const char *print_tainted(void); 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 int test_taint(unsigned flag);
extern unsigned long get_taint(void); extern unsigned long get_taint(void);
extern int root_mountflags; extern int root_mountflags;
......
...@@ -197,9 +197,10 @@ static inline int strong_try_module_get(struct module *mod) ...@@ -197,9 +197,10 @@ static inline int strong_try_module_get(struct module *mod)
return -ENOENT; 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); mod->taints |= (1U << flag);
} }
...@@ -727,7 +728,7 @@ static inline int try_force_unload(unsigned int flags) ...@@ -727,7 +728,7 @@ static inline int try_force_unload(unsigned int flags)
{ {
int ret = (flags & O_TRUNC); int ret = (flags & O_TRUNC);
if (ret) if (ret)
add_taint(TAINT_FORCED_RMMOD); add_taint(TAINT_FORCED_RMMOD, LOCKDEP_NOW_UNRELIABLE);
return ret; return ret;
} }
#else #else
...@@ -1138,7 +1139,7 @@ static int try_to_force_load(struct module *mod, const char *reason) ...@@ -1138,7 +1139,7 @@ static int try_to_force_load(struct module *mod, const char *reason)
if (!test_taint(TAINT_FORCED_MODULE)) if (!test_taint(TAINT_FORCED_MODULE))
printk(KERN_WARNING "%s: %s: kernel tainted.\n", printk(KERN_WARNING "%s: %s: kernel tainted.\n",
mod->name, reason); mod->name, reason);
add_taint_module(mod, TAINT_FORCED_MODULE); add_taint_module(mod, TAINT_FORCED_MODULE, LOCKDEP_NOW_UNRELIABLE);
return 0; return 0;
#else #else
return -ENOEXEC; return -ENOEXEC;
...@@ -2147,7 +2148,8 @@ static void set_license(struct module *mod, const char *license) ...@@ -2147,7 +2148,8 @@ static void set_license(struct module *mod, const char *license)
if (!test_taint(TAINT_PROPRIETARY_MODULE)) if (!test_taint(TAINT_PROPRIETARY_MODULE))
printk(KERN_WARNING "%s: module license '%s' taints " printk(KERN_WARNING "%s: module license '%s' taints "
"kernel.\n", mod->name, license); "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) ...@@ -2700,10 +2702,10 @@ static int check_modinfo(struct module *mod, struct load_info *info, int flags)
} }
if (!get_modinfo(info, "intree")) 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")) { 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," printk(KERN_WARNING "%s: module is from the staging directory,"
" the quality is unknown, you have been warned.\n", " the quality is unknown, you have been warned.\n",
mod->name); mod->name);
...@@ -2869,15 +2871,17 @@ static int check_module_license_and_versions(struct module *mod) ...@@ -2869,15 +2871,17 @@ static int check_module_license_and_versions(struct module *mod)
* using GPL-only symbols it needs. * using GPL-only symbols it needs.
*/ */
if (strcmp(mod->name, "ndiswrapper") == 0) 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 */ /* driverloader was caught wrongly pretending to be under GPL */
if (strcmp(mod->name, "driverloader") == 0) 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 */ /* lve claims to be GPL but upstream won't provide source */
if (strcmp(mod->name, "lve") == 0) 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 #ifdef CONFIG_MODVERSIONS
if ((mod->num_syms && !mod->crcs) if ((mod->num_syms && !mod->crcs)
...@@ -3197,7 +3201,7 @@ again: ...@@ -3197,7 +3201,7 @@ again:
"%s: module verification failed: signature and/or" "%s: module verification failed: signature and/or"
" required key missing - tainting kernel\n", " required key missing - tainting kernel\n",
mod->name); mod->name);
add_taint_module(mod, TAINT_FORCED_MODULE); add_taint_module(mod, TAINT_FORCED_MODULE, LOCKDEP_STILL_OK);
} }
#endif #endif
......
...@@ -259,26 +259,19 @@ unsigned long get_taint(void) ...@@ -259,26 +259,19 @@ unsigned long get_taint(void)
return tainted_mask; 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)
{ {
/* if (lockdep_ok == LOCKDEP_NOW_UNRELIABLE && __debug_locks_off())
* Can't trust the integrity of the kernel anymore. printk(KERN_WARNING
* We don't call directly debug_locks_off() because the issue "Disabling lock debugging due to kernel taint\n");
* 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");
}
set_bit(flag, &tainted_mask); set_bit(flag, &tainted_mask);
} }
...@@ -421,7 +414,8 @@ static void warn_slowpath_common(const char *file, int line, void *caller, ...@@ -421,7 +414,8 @@ static void warn_slowpath_common(const char *file, int line, void *caller,
print_modules(); print_modules();
dump_stack(); dump_stack();
print_oops_end_marker(); 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, ...) void warn_slowpath_fmt(const char *file, int line, const char *fmt, ...)
......
...@@ -2785,7 +2785,7 @@ static noinline void __schedule_bug(struct task_struct *prev) ...@@ -2785,7 +2785,7 @@ static noinline void __schedule_bug(struct task_struct *prev)
if (irqs_disabled()) if (irqs_disabled())
print_irqtrace_events(prev); print_irqtrace_events(prev);
dump_stack(); dump_stack();
add_taint(TAINT_WARN); add_taint(TAINT_WARN, LOCKDEP_STILL_OK);
} }
/* /*
......
...@@ -2006,7 +2006,7 @@ static int proc_taint(struct ctl_table *table, int write, ...@@ -2006,7 +2006,7 @@ static int proc_taint(struct ctl_table *table, int write,
int i; int i;
for (i = 0; i < BITS_PER_LONG && tmptaint >> i; i++) { for (i = 0; i < BITS_PER_LONG && tmptaint >> i; i++) {
if ((tmptaint >> i) & 1) if ((tmptaint >> i) & 1)
add_taint(i); add_taint(i, LOCKDEP_STILL_OK);
} }
} }
......
...@@ -166,7 +166,8 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs) ...@@ -166,7 +166,8 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs)
print_modules(); print_modules();
show_regs(regs); show_regs(regs);
print_oops_end_marker(); 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; return BUG_TRAP_TYPE_WARN;
} }
......
...@@ -716,7 +716,7 @@ static void print_bad_pte(struct vm_area_struct *vma, unsigned long addr, ...@@ -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", print_symbol(KERN_ALERT "vma->vm_file->f_op->mmap: %s\n",
(unsigned long)vma->vm_file->f_op->mmap);