rcu: create new rcu_access_index() and use in mce
The MCE subsystem needs to sample an RCU-protected index outside of any protection for that index. If this was a pointer, we would use rcu_access_pointer(), but there is no corresponding rcu_access_index(). This commit therefore creates an rcu_access_index() and applies it to MCE. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Tested-by: Zdenek Kabelac <zkabelac@redhat.com>
This commit is contained in:
@@ -1626,7 +1626,7 @@ out:
|
|||||||
static unsigned int mce_poll(struct file *file, poll_table *wait)
|
static unsigned int mce_poll(struct file *file, poll_table *wait)
|
||||||
{
|
{
|
||||||
poll_wait(file, &mce_wait, wait);
|
poll_wait(file, &mce_wait, wait);
|
||||||
if (rcu_dereference_check_mce(mcelog.next))
|
if (rcu_access_index(mcelog.next))
|
||||||
return POLLIN | POLLRDNORM;
|
return POLLIN | POLLRDNORM;
|
||||||
if (!mce_apei_read_done && apei_check_mce())
|
if (!mce_apei_read_done && apei_check_mce())
|
||||||
return POLLIN | POLLRDNORM;
|
return POLLIN | POLLRDNORM;
|
||||||
|
@@ -339,6 +339,12 @@ extern int rcu_my_thread_group_empty(void);
|
|||||||
((typeof(*p) __force __kernel *)(p)); \
|
((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) \
|
#define __rcu_dereference_index_check(p, c) \
|
||||||
({ \
|
({ \
|
||||||
typeof(p) _________p1 = ACCESS_ONCE(p); \
|
typeof(p) _________p1 = ACCESS_ONCE(p); \
|
||||||
@@ -428,6 +434,20 @@ extern int rcu_my_thread_group_empty(void);
|
|||||||
|
|
||||||
#define rcu_dereference_raw(p) rcu_dereference_check(p, 1) /*@@@ needed? @@@*/
|
#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
|
* rcu_dereference_index_check() - rcu_dereference for indices with debug checking
|
||||||
* @p: The pointer to read, prior to dereferencing
|
* @p: The pointer to read, prior to dereferencing
|
||||||
|
Reference in New Issue
Block a user