public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86_64: fix die_lock nesting
@ 2006-04-26 20:53 Corey Minyard
  2006-04-29 10:57 ` Andi Kleen
  0 siblings, 1 reply; 2+ messages in thread
From: Corey Minyard @ 2006-04-26 20:53 UTC (permalink / raw)
  To: linux-kernel, ak

I noticed this when poking around in this area.

BTW, the comments in oops_begin say the operation is racy, and the only
way I can think of that is races is if you get a non-NMI oops then
get an NMI oops within the oops_begin or oops_end functions.
That can actually be fixed using compare-and-swap, but, to tell you
the truth, it just doesn't seem worth it to me.  If you like, though,
I can attempt a fix at that, too.  Anyway, the patch...


The oops_begin() function in x86_64 would only conditionally claim
the die_lock if the call is nested, but oops_end() would always
release the spinlock. This patch adds a nest count for the die lock
so that the release of the lock is only done on the final oops_end().

Signed-off-by: Corey Minyard <minyard@acm.org>

diff --git a/arch/x86_64/kernel/traps.c b/arch/x86_64/kernel/traps.c
index 6bda322..debd834 100644
--- a/arch/x86_64/kernel/traps.c
+++ b/arch/x86_64/kernel/traps.c
@@ -384,6 +384,7 @@ void out_of_line_bug(void)
 
 static DEFINE_SPINLOCK(die_lock);
 static int die_owner = -1;
+static unsigned int die_nest_count;
 
 unsigned __kprobes long oops_begin(void)
 {
@@ -398,6 +399,7 @@ unsigned __kprobes long oops_begin(void)
 		else
 			spin_lock(&die_lock);
 	}
+	die_nest_count++;
 	die_owner = cpu;
 	console_verbose();
 	bust_spinlocks(1);
@@ -408,7 +410,13 @@ void __kprobes oops_end(unsigned long fl
 { 
 	die_owner = -1;
 	bust_spinlocks(0);
-	spin_unlock_irqrestore(&die_lock, flags);
+	die_nest_count--;
+	if (die_nest_count)
+		/* We still own the lock */
+		local_irq_restore(flags);
+	else
+		/* Nest count reaches zero, release the lock. */
+		spin_unlock_irqrestore(&die_lock, flags);
 	if (panic_on_oops)
 		panic("Oops");
 }

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] x86_64: fix die_lock nesting
  2006-04-26 20:53 [PATCH] x86_64: fix die_lock nesting Corey Minyard
@ 2006-04-29 10:57 ` Andi Kleen
  0 siblings, 0 replies; 2+ messages in thread
From: Andi Kleen @ 2006-04-29 10:57 UTC (permalink / raw)
  To: minyard; +Cc: linux-kernel

On Wednesday 26 April 2006 22:53, Corey Minyard wrote:


> The oops_begin() function in x86_64 would only conditionally claim
> the die_lock if the call is nested, but oops_end() would always
> release the spinlock. This patch adds a nest count for the die lock
> so that the release of the lock is only done on the final oops_end().

Merged thanks.

-Andi

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-04-29 11:05 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-04-26 20:53 [PATCH] x86_64: fix die_lock nesting Corey Minyard
2006-04-29 10:57 ` Andi Kleen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox