diff options
| author | Rusty Russell <rusty@rustcorp.com.au> | 2013-01-21 17:17:39 +1030 | 
|---|---|---|
| committer | Rusty Russell <rusty@rustcorp.com.au> | 2013-01-21 17:17:57 +1030 | 
| commit | 373d4d099761cb1f637bed488ab3871945882273 (patch) | |
| tree | 954bef7bc724aee105dd246d5f2b1ea04ed38b20 | |
| parent | 64748a2c9062da0c32b59c1b368a86fc4613b1e1 (diff) | |
| download | olio-linux-3.10-373d4d099761cb1f637bed488ab3871945882273.tar.xz olio-linux-3.10-373d4d099761cb1f637bed488ab3871945882273.zip | |
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: Rusty Russell <rusty@rustcorp.com.au>
37 files changed, 69 insertions, 67 deletions
| diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c index 272666d006d..4037461a649 100644 --- a/arch/alpha/kernel/traps.c +++ b/arch/alpha/kernel/traps.c @@ -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); diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index b0179b89a04..1c089119b2d 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c @@ -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. */ diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index 3883f842434..b3c5f628bdb 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -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(); diff --git a/arch/avr32/kernel/traps.c b/arch/avr32/kernel/traps.c index 3d760c06f02..682b2478691 100644 --- a/arch/avr32/kernel/traps.c +++ b/arch/avr32/kernel/traps.c @@ -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()) diff --git a/arch/hexagon/kernel/traps.c b/arch/hexagon/kernel/traps.c index a41eeb8eeaa..be5e2dd9c9d 100644 --- a/arch/hexagon/kernel/traps.c +++ b/arch/hexagon/kernel/traps.c @@ -225,7 +225,7 @@ int die(const char *str, struct pt_regs *regs, long err)  	do_show_stack(current, ®s->r30, pt_elr(regs));  	bust_spinlocks(0); -	add_taint(TAINT_DIE); +	add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);  	spin_unlock_irq(&die.lock); diff --git a/arch/ia64/kernel/traps.c b/arch/ia64/kernel/traps.c index bd42b76000d..f7f9f9c6caf 100644 --- a/arch/ia64/kernel/traps.c +++ b/arch/ia64/kernel/traps.c @@ -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) diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c index cbc624af449..f32ab22e7ed 100644 --- a/arch/m68k/kernel/traps.c +++ b/arch/m68k/kernel/traps.c @@ -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);  } diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index cf7ac5483f5..9007966d56d 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c @@ -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(); diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index 45ba99f5080..aeb8f8f2c07 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c @@ -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"); diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 32518401af6..c579db85938 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c @@ -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"); diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index 70ecfc5fe8f..13dd63fba36 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c @@ -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"); diff --git a/arch/sh/kernel/traps.c b/arch/sh/kernel/traps.c index 72246bc0688..dfdad72c61c 100644 --- a/arch/sh/kernel/traps.c +++ b/arch/sh/kernel/traps.c @@ -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(); diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c index 0eaf0059aae..88a127b9c69 100644 --- a/arch/sparc/kernel/setup_64.c +++ b/arch/sparc/kernel/setup_64.c @@ -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; diff --git a/arch/sparc/kernel/traps_32.c b/arch/sparc/kernel/traps_32.c index a5785ea2a85..662982946a8 100644 --- a/arch/sparc/kernel/traps_32.c +++ b/arch/sparc/kernel/traps_32.c @@ -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; diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c index e7ecf1507d9..8d38ca97aa2 100644 --- a/arch/sparc/kernel/traps_64.c +++ b/arch/sparc/kernel/traps_64.c @@ -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 *) diff --git a/arch/unicore32/kernel/traps.c b/arch/unicore32/kernel/traps.c index 2054f0d4db1..0870b68d2ad 100644 --- a/arch/unicore32/kernel/traps.c +++ b/arch/unicore32/kernel/traps.c @@ -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(); diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 15239fffd6f..5853e57523e 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -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:  	; diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index 80dbda84f1c..6bc15edbc8c 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c @@ -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); diff --git a/arch/x86/kernel/cpu/mcheck/p5.c b/arch/x86/kernel/cpu/mcheck/p5.c index 2d5454cd2c4..1c044b1ccc5 100644 --- a/arch/x86/kernel/cpu/mcheck/p5.c +++ b/arch/x86/kernel/cpu/mcheck/p5.c @@ -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: */ diff --git a/arch/x86/kernel/cpu/mcheck/winchip.c b/arch/x86/kernel/cpu/mcheck/winchip.c index 2d7998fb628..e9a701aecaa 100644 --- a/arch/x86/kernel/cpu/mcheck/winchip.c +++ b/arch/x86/kernel/cpu/mcheck/winchip.c @@ -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 */ diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c index e9fe907cd24..fa72a39e5d4 100644 --- a/arch/x86/kernel/cpu/mtrr/generic.c +++ b/arch/x86/kernel/cpu/mtrr/generic.c @@ -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;  		}  	} diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c index ae42418bc50..c8797d55b24 100644 --- a/arch/x86/kernel/dumpstack.c +++ b/arch/x86/kernel/dumpstack.c @@ -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. */ diff --git a/arch/xtensa/kernel/traps.c b/arch/xtensa/kernel/traps.c index 01e0111bf78..ded955d4515 100644 --- a/arch/xtensa/kernel/traps.c +++ b/arch/xtensa/kernel/traps.c @@ -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()) diff --git a/drivers/acpi/custom_method.c b/drivers/acpi/custom_method.c index 5d42c2414ae..cd9a68e2fea 100644 --- a/drivers/acpi/custom_method.c +++ b/drivers/acpi/custom_method.c @@ -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; diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 3ff26786154..535e888bad7 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c @@ -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);  } diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c index 46a213a596e..f63c830083e 100644 --- a/drivers/base/regmap/regmap-debugfs.c +++ b/drivers/base/regmap/regmap-debugfs.c @@ -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; diff --git a/include/linux/kernel.h b/include/linux/kernel.h index c566927efcb..80d36874689 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -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; diff --git a/kernel/module.c b/kernel/module.c index e69a5a68766..cc000dd6e4a 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -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 diff --git a/kernel/panic.c b/kernel/panic.c index e1b2822fff9..7c57cc9eee2 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -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, ...) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 257002c13bb..662f3d51218 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -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);  }  /* diff --git a/kernel/sysctl.c b/kernel/sysctl.c index c88878db491..f97f9d75cde 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -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);  		}  	} diff --git a/lib/bug.c b/lib/bug.c index d0cdf14c651..168603477f0 100644 --- 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;  	} diff --git a/mm/memory.c b/mm/memory.c index bb1369f7b9b..bc8bec762db 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -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) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index df2022ff0c8..4c99cb7e276 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -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);  }  /* diff --git a/mm/slab.c b/mm/slab.c index e7667a3584b..856e4a192d2 100644 --- 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 diff --git a/mm/slub.c b/mm/slub.c index ba2ca53f6c3..7ec3041bdd0 100644 --- 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, ...) diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 2370063b582..4c6526c0db0 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -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; |