| @@ -339,6 +339,12 @@ extern int rcu_my_thread_group_empty(void); · 338 unmodified lines |
| 339 | 339 | ((typeof(*p) __force __kernel *)(p)); \ |
| 340 | 340 | }) |
| 341 | 341 | |
| 342 | +#define __rcu_access_index(p, space) \ |
| 343 | + ({ \ |
| 344 | + typeof(p) _________p1 = ACCESS_ONCE(p); \ |
| 345 | + rcu_dereference_sparse(p, space); \ |
| 346 | + (_________p1); \ |
| 347 | + }) |
| 342 | 348 | #define __rcu_dereference_index_check(p, c) \ |
| 343 | 349 | ({ \ |
| 344 | 350 | typeof(p) _________p1 = ACCESS_ONCE(p); \ |
| @@ -428,6 +434,20 @@ extern int rcu_my_thread_group_empty(void); · 83 unmodified lines |
| 428 | 434 | |
| 429 | 435 | #define rcu_dereference_raw(p) rcu_dereference_check(p, 1) /*@@@ needed? @@@*/ |
| 430 | 436 | |
| 437 | +/** |
| 438 | + * rcu_access_index() - fetch RCU index with no dereferencing |
| 439 | + * @p: The index to read |
| 440 | + * |
| 441 | + * Return the value of the specified RCU-protected index, but omit the |
| 442 | + * smp_read_barrier_depends() and keep the ACCESS_ONCE(). This is useful |
| 443 | + * when the value of this index is accessed, but the index is not |
| 444 | + * dereferenced, for example, when testing an RCU-protected index against |
| 445 | + * -1. Although rcu_access_index() may also be used in cases where |
| 446 | + * update-side locks prevent the value of the index from changing, you |
| 447 | + * should instead use rcu_dereference_index_protected() for this use case. |
| 448 | + */ |
| 449 | +#define rcu_access_index(p) __rcu_access_index((p), __rcu) |
| 450 | + |
| 431 | 451 | /** |
| 432 | 452 | * rcu_dereference_index_check() - rcu_dereference for indices with debug checking |
| 433 | 453 | * @p: The pointer to read, prior to dereferencing |