Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a0f1ccfd authored by Ingo Molnar's avatar Ingo Molnar Committed by Linus Torvalds
Browse files

[PATCH] lockdep: do not recurse in printk



Make printk()-ing from within the lock validation code safer by using the
lockdep-recursion counter.

Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarArjan van de Ven <arjan@linux.intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 3047e99e
Loading
Loading
Loading
Loading
+18 −5
Original line number Original line Diff line number Diff line
@@ -518,7 +518,9 @@ asmlinkage int vprintk(const char *fmt, va_list args)
		zap_locks();
		zap_locks();


	/* This stops the holder of console_sem just where we want him */
	/* This stops the holder of console_sem just where we want him */
	spin_lock_irqsave(&logbuf_lock, flags);
	local_irq_save(flags);
	lockdep_off();
	spin_lock(&logbuf_lock);
	printk_cpu = smp_processor_id();
	printk_cpu = smp_processor_id();


	/* Emit the output into the temporary buffer */
	/* Emit the output into the temporary buffer */
@@ -588,7 +590,7 @@ asmlinkage int vprintk(const char *fmt, va_list args)
		 */
		 */
		console_locked = 1;
		console_locked = 1;
		printk_cpu = UINT_MAX;
		printk_cpu = UINT_MAX;
		spin_unlock_irqrestore(&logbuf_lock, flags);
		spin_unlock(&logbuf_lock);


		/*
		/*
		 * Console drivers may assume that per-cpu resources have
		 * Console drivers may assume that per-cpu resources have
@@ -604,6 +606,8 @@ asmlinkage int vprintk(const char *fmt, va_list args)
			console_locked = 0;
			console_locked = 0;
			up(&console_sem);
			up(&console_sem);
		}
		}
		lockdep_on();
		local_irq_restore(flags);
	} else {
	} else {
		/*
		/*
		 * Someone else owns the drivers.  We drop the spinlock, which
		 * Someone else owns the drivers.  We drop the spinlock, which
@@ -611,7 +615,9 @@ asmlinkage int vprintk(const char *fmt, va_list args)
		 * console drivers with the output which we just produced.
		 * console drivers with the output which we just produced.
		 */
		 */
		printk_cpu = UINT_MAX;
		printk_cpu = UINT_MAX;
		spin_unlock_irqrestore(&logbuf_lock, flags);
		spin_unlock(&logbuf_lock);
		lockdep_on();
		local_irq_restore(flags);
	}
	}


	preempt_enable();
	preempt_enable();
@@ -809,9 +815,16 @@ void release_console_sem(void)
	console_may_schedule = 0;
	console_may_schedule = 0;
	up(&console_sem);
	up(&console_sem);
	spin_unlock_irqrestore(&logbuf_lock, flags);
	spin_unlock_irqrestore(&logbuf_lock, flags);
	if (wake_klogd && !oops_in_progress && waitqueue_active(&log_wait))
	if (wake_klogd && !oops_in_progress && waitqueue_active(&log_wait)) {
		/*
		 * If we printk from within the lock dependency code,
		 * from within the scheduler code, then do not lock
		 * up due to self-recursion:
		 */
		if (!lockdep_internal())
			wake_up_interruptible(&log_wait);
			wake_up_interruptible(&log_wait);
	}
	}
}
EXPORT_SYMBOL(release_console_sem);
EXPORT_SYMBOL(release_console_sem);


/**
/**