diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2015-04-19 21:16:02 -0400 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2015-05-27 15:56:16 -0400 |
commit | e90328b87eeff91574c18815bd6991b03bd6ecc0 (patch) | |
tree | 4c5b7d82d6160ab7931fa4bbb79e371c0b909bbe /arch | |
parent | 7d0ae8086b828311250c6afdf800b568ac9bd693 (diff) |
mce: Stop using array-index-based RCU primitives
Because mce is arch-specific x86 code, there is little or no
performance benefit of using rcu_dereference_index_check() over using
smp_load_acquire(). It also turns out that mce is the only place that
array-index-based RCU is used, and it would be convenient to drop
this portion of the RCU API.
This patch therefore changes rcu_dereference_index_check() uses to
smp_load_acquire(), but keeping the lockdep diagnostics, and also
changes rcu_access_index() uses to READ_ONCE().
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: linux-edac@vger.kernel.org
Cc: Tony Luck <tony.luck@intel.com>
Acked-by: Borislav Petkov <bp@suse.de>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index e535533d5ab8..1fd04a02d90a 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
@@ -53,9 +53,12 @@ | |||
53 | static DEFINE_MUTEX(mce_chrdev_read_mutex); | 53 | static DEFINE_MUTEX(mce_chrdev_read_mutex); |
54 | 54 | ||
55 | #define rcu_dereference_check_mce(p) \ | 55 | #define rcu_dereference_check_mce(p) \ |
56 | rcu_dereference_index_check((p), \ | 56 | ({ \ |
57 | rcu_read_lock_sched_held() || \ | 57 | rcu_lockdep_assert(rcu_read_lock_sched_held() || \ |
58 | lockdep_is_held(&mce_chrdev_read_mutex)) | 58 | lockdep_is_held(&mce_chrdev_read_mutex), \ |
59 | "suspicious rcu_dereference_check_mce() usage"); \ | ||
60 | smp_load_acquire(&(p)); \ | ||
61 | }) | ||
59 | 62 | ||
60 | #define CREATE_TRACE_POINTS | 63 | #define CREATE_TRACE_POINTS |
61 | #include <trace/events/mce.h> | 64 | #include <trace/events/mce.h> |
@@ -1884,7 +1887,7 @@ out: | |||
1884 | static unsigned int mce_chrdev_poll(struct file *file, poll_table *wait) | 1887 | static unsigned int mce_chrdev_poll(struct file *file, poll_table *wait) |
1885 | { | 1888 | { |
1886 | poll_wait(file, &mce_chrdev_wait, wait); | 1889 | poll_wait(file, &mce_chrdev_wait, wait); |
1887 | if (rcu_access_index(mcelog.next)) | 1890 | if (READ_ONCE(mcelog.next)) |
1888 | return POLLIN | POLLRDNORM; | 1891 | return POLLIN | POLLRDNORM; |
1889 | if (!mce_apei_read_done && apei_check_mce()) | 1892 | if (!mce_apei_read_done && apei_check_mce()) |
1890 | return POLLIN | POLLRDNORM; | 1893 | return POLLIN | POLLRDNORM; |