core kernel fixes
Subsystems (3)
Linus,
Please pull the latest core-fixes-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git core-fixes-for-linus
Thanks,
Ingo
------------------>
Paul E. McKenney (1):
rcu: create new rcu_access_index() and use in mce
Steven Rostedt (1):
WARN_ON_SMP(): Add comment to explain ({0;})
arch/x86/kernel/cpu/mcheck/mce.c | 2 +- include/asm-generic/bug.h | 7 +++++++ include/linux/rcupdate.h | 20 ++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletions(-)
arch/x86/kernel/cpu/mcheck/mce.c +1 -1
@@ -1626,7 +1626,7 @@ out:static unsigned int mce_poll (struct file *file,poll_table *wait) {poll_wait (file, &mce_wait, wait); -if (rcu_dereference_check_mce (mcelog.next)) +if (rcu_access_index (mcelog.next))return POLLIN |POLLRDNORM ;if (!mce_apei_read_done &&apei_check_mce ())return POLLIN |POLLRDNORM ;
include/asm-generic/bug.h +7 -0
@@ -194,6 +194,13 @@ extern void warn_slowpath_null(const char *file, const int line);#ifdef CONFIG_SMP # define WARN_ON_SMP (x) WARN_ON(x)#else +/* +* Use of ({0;}) because WARN_ON_SMP(x) may be used either as +* a stand alone line statement or as a condition in an if () +* statement. +* A simple "0" would cause gcc to give a "statement has no effect" +* warning. +*/ # define WARN_ON_SMP (x) ({0;})#endif
include/linux/rcupdate.h +20 -0
@@ -339,6 +339,12 @@ extern int rcu_my_thread_group_empty(void); ((typeof(*p) __force __kernel *)(p)); \ }) +#define __rcu_access_index (p, space) \ + ({ \ + typeof(p) _________p1 = ACCESS_ONCE(p); \ + rcu_dereference_sparse(p, space); \ + (_________p1); \ + })#define __rcu_dereference_index_check (p, c) \ ({ \ typeof(p) _________p1 = ACCESS_ONCE(p); \
@@ -429,6 +435,20 @@ extern int rcu_my_thread_group_empty(void);#define rcu_dereference_raw (p) rcu_dereference_check(p, 1)/*@@@ needed? @@@*/ /** +* rcu_access_index() - fetch RCU index with no dereferencing +* @p: The index to read +* +* Return the value of the specified RCU-protected index, but omit the +* smp_read_barrier_depends() and keep the ACCESS_ONCE(). This is useful +* when the value of this index is accessed, but the index is not +* dereferenced, for example, when testing an RCU-protected index against +* -1. Although rcu_access_index() may also be used in cases where +* update-side locks prevent the value of the index from changing, you +* should instead use rcu_dereference_index_protected() for this use case. +*/ +#define rcu_access_index (p) __rcu_access_index((p), __rcu) + +/** * rcu_dereference_index_check() - rcu_dereference for indices with debug checking * @p: The pointer to read, prior to dereferencing * @c: The conditions under which the dereference will take place