diff options
Diffstat (limited to 'kernel/printk.c')
| -rw-r--r-- | kernel/printk.c | 12 | 
1 files changed, 11 insertions, 1 deletions
diff --git a/kernel/printk.c b/kernel/printk.c index 2d607f4d179..22e070f3470 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -87,6 +87,12 @@ static DEFINE_SEMAPHORE(console_sem);  struct console *console_drivers;  EXPORT_SYMBOL_GPL(console_drivers); +#ifdef CONFIG_LOCKDEP +static struct lockdep_map console_lock_dep_map = { +	.name = "console_lock" +}; +#endif +  /*   * This is used for debugging the mess that is the VT code by   * keeping track if we have the console semaphore held. It's @@ -1908,12 +1914,14 @@ static int __cpuinit console_cpu_notify(struct notifier_block *self,   */  void console_lock(void)  { -	BUG_ON(in_interrupt()); +	might_sleep(); +  	down(&console_sem);  	if (console_suspended)  		return;  	console_locked = 1;  	console_may_schedule = 1; +	mutex_acquire(&console_lock_dep_map, 0, 0, _RET_IP_);  }  EXPORT_SYMBOL(console_lock); @@ -1935,6 +1943,7 @@ int console_trylock(void)  	}  	console_locked = 1;  	console_may_schedule = 0; +	mutex_acquire(&console_lock_dep_map, 0, 1, _RET_IP_);  	return 1;  }  EXPORT_SYMBOL(console_trylock); @@ -2095,6 +2104,7 @@ skip:  		local_irq_restore(flags);  	}  	console_locked = 0; +	mutex_release(&console_lock_dep_map, 1, _RET_IP_);  	/* Release the exclusive_console once it is used */  	if (unlikely(exclusive_console))  |