diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2010-03-19 03:05:10 -0400 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2010-03-19 03:05:10 -0400 |
commit | b4b7a4ef097f288f724420b473dbf92a89c0ab7e (patch) | |
tree | 23ad8101e3e77c32a8d1e1b95a9c1cd7f7a475b7 /arch/x86/kernel/cpu/mcheck/mce.c | |
parent | e9ce335df51ff782035a15c261a3c0c9892a1767 (diff) | |
parent | a3d3203e4bb40f253b1541e310dc0f9305be7c84 (diff) |
Merge branch 'master' into for-linus
Conflicts:
block/Kconfig
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'arch/x86/kernel/cpu/mcheck/mce.c')
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index a8aacd4b513c..3ab9c886b613 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
@@ -46,6 +46,13 @@ | |||
46 | 46 | ||
47 | #include "mce-internal.h" | 47 | #include "mce-internal.h" |
48 | 48 | ||
49 | static DEFINE_MUTEX(mce_read_mutex); | ||
50 | |||
51 | #define rcu_dereference_check_mce(p) \ | ||
52 | rcu_dereference_check((p), \ | ||
53 | rcu_read_lock_sched_held() || \ | ||
54 | lockdep_is_held(&mce_read_mutex)) | ||
55 | |||
49 | #define CREATE_TRACE_POINTS | 56 | #define CREATE_TRACE_POINTS |
50 | #include <trace/events/mce.h> | 57 | #include <trace/events/mce.h> |
51 | 58 | ||
@@ -158,7 +165,7 @@ void mce_log(struct mce *mce) | |||
158 | mce->finished = 0; | 165 | mce->finished = 0; |
159 | wmb(); | 166 | wmb(); |
160 | for (;;) { | 167 | for (;;) { |
161 | entry = rcu_dereference(mcelog.next); | 168 | entry = rcu_dereference_check_mce(mcelog.next); |
162 | for (;;) { | 169 | for (;;) { |
163 | /* | 170 | /* |
164 | * When the buffer fills up discard new entries. | 171 | * When the buffer fills up discard new entries. |
@@ -1485,8 +1492,6 @@ static void collect_tscs(void *data) | |||
1485 | rdtscll(cpu_tsc[smp_processor_id()]); | 1492 | rdtscll(cpu_tsc[smp_processor_id()]); |
1486 | } | 1493 | } |
1487 | 1494 | ||
1488 | static DEFINE_MUTEX(mce_read_mutex); | ||
1489 | |||
1490 | static ssize_t mce_read(struct file *filp, char __user *ubuf, size_t usize, | 1495 | static ssize_t mce_read(struct file *filp, char __user *ubuf, size_t usize, |
1491 | loff_t *off) | 1496 | loff_t *off) |
1492 | { | 1497 | { |
@@ -1500,7 +1505,7 @@ static ssize_t mce_read(struct file *filp, char __user *ubuf, size_t usize, | |||
1500 | return -ENOMEM; | 1505 | return -ENOMEM; |
1501 | 1506 | ||
1502 | mutex_lock(&mce_read_mutex); | 1507 | mutex_lock(&mce_read_mutex); |
1503 | next = rcu_dereference(mcelog.next); | 1508 | next = rcu_dereference_check_mce(mcelog.next); |
1504 | 1509 | ||
1505 | /* Only supports full reads right now */ | 1510 | /* Only supports full reads right now */ |
1506 | if (*off != 0 || usize < MCE_LOG_LEN*sizeof(struct mce)) { | 1511 | if (*off != 0 || usize < MCE_LOG_LEN*sizeof(struct mce)) { |
@@ -1565,7 +1570,7 @@ timeout: | |||
1565 | static unsigned int mce_poll(struct file *file, poll_table *wait) | 1570 | static unsigned int mce_poll(struct file *file, poll_table *wait) |
1566 | { | 1571 | { |
1567 | poll_wait(file, &mce_wait, wait); | 1572 | poll_wait(file, &mce_wait, wait); |
1568 | if (rcu_dereference(mcelog.next)) | 1573 | if (rcu_dereference_check_mce(mcelog.next)) |
1569 | return POLLIN | POLLRDNORM; | 1574 | return POLLIN | POLLRDNORM; |
1570 | return 0; | 1575 | return 0; |
1571 | } | 1576 | } |
@@ -2044,6 +2049,7 @@ static __init void mce_init_banks(void) | |||
2044 | struct mce_bank *b = &mce_banks[i]; | 2049 | struct mce_bank *b = &mce_banks[i]; |
2045 | struct sysdev_attribute *a = &b->attr; | 2050 | struct sysdev_attribute *a = &b->attr; |
2046 | 2051 | ||
2052 | sysfs_attr_init(&a->attr); | ||
2047 | a->attr.name = b->attrname; | 2053 | a->attr.name = b->attrname; |
2048 | snprintf(b->attrname, ATTR_LEN, "bank%d", i); | 2054 | snprintf(b->attrname, ATTR_LEN, "bank%d", i); |
2049 | 2055 | ||