From: tip-bot for Paul E. McKenney on
Commit-ID: f56e8a0765cc4374e02f4e3a79e2427b5096b075
Gitweb: http://git.kernel.org/tip/f56e8a0765cc4374e02f4e3a79e2427b5096b075
Author: Paul E. McKenney <paulmck(a)linux.vnet.ibm.com>
AuthorDate: Fri, 5 Mar 2010 15:03:27 -0800
Committer: Ingo Molnar <mingo(a)elte.hu>
CommitDate: Thu, 11 Mar 2010 13:38:02 +0100

x86/mce: Fix RCU lockdep splats

Create an rcu_dereference_check_mce() that checks for RCU-sched
read side and mce_read_mutex being held on update side. Replace
uses of rcu_dereference() in arch/x86/kernel/cpu/mcheck/mce.c
with this new macro.

Signed-off-by: Paul E. McKenney <paulmck(a)linux.vnet.ibm.com>
Cc: "H. Peter Anvin" <hpa(a)zytor.com>
Cc: x86(a)kernel.org
Cc: laijs(a)cn.fujitsu.com
Cc: dipankar(a)in.ibm.com
Cc: mathieu.desnoyers(a)polymtl.ca
Cc: josh(a)joshtriplett.org
Cc: dvhltc(a)us.ibm.com
Cc: niv(a)us.ibm.com
Cc: peterz(a)infradead.org
Cc: rostedt(a)goodmis.org
Cc: Valdis.Kletnieks(a)vt.edu
Cc: dhowells(a)redhat.com
LKML-Reference: <1267830207-9474-3-git-send-email-paulmck(a)linux.vnet.ibm.com>
Signed-off-by: Ingo Molnar <mingo(a)elte.hu>
---
arch/x86/kernel/cpu/mcheck/mce.c | 11 ++++++++---
1 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c
index a8aacd4..4442e9e 100644
--- a/arch/x86/kernel/cpu/mcheck/mce.c
+++ b/arch/x86/kernel/cpu/mcheck/mce.c
@@ -46,6 +46,11 @@

#include "mce-internal.h"

+#define rcu_dereference_check_mce(p) \
+ rcu_dereference_check((p), \
+ rcu_read_lock_sched_held() || \
+ lockdep_is_held(&mce_read_mutex))
+
#define CREATE_TRACE_POINTS
#include <trace/events/mce.h>

@@ -158,7 +163,7 @@ void mce_log(struct mce *mce)
mce->finished = 0;
wmb();
for (;;) {
- entry = rcu_dereference(mcelog.next);
+ entry = rcu_dereference_check_mce(mcelog.next);
for (;;) {
/*
* When the buffer fills up discard new entries.
@@ -1500,7 +1505,7 @@ static ssize_t mce_read(struct file *filp, char __user *ubuf, size_t usize,
return -ENOMEM;

mutex_lock(&mce_read_mutex);
- next = rcu_dereference(mcelog.next);
+ next = rcu_dereference_check_mce(mcelog.next);

/* Only supports full reads right now */
if (*off != 0 || usize < MCE_LOG_LEN*sizeof(struct mce)) {
@@ -1565,7 +1570,7 @@ timeout:
static unsigned int mce_poll(struct file *file, poll_table *wait)
{
poll_wait(file, &mce_wait, wait);
- if (rcu_dereference(mcelog.next))
+ if (rcu_dereference_check_mce(mcelog.next))
return POLLIN | POLLRDNORM;
return 0;
}
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/