mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
idr: make idr_find rcu-safe
Make idr_find rcu-safe: it can now be called inside an rcu_read critical section. Signed-off-by: Nadia Derbey <[email protected]> Reviewed-by: "Paul E. McKenney" <[email protected]> Cc: Manfred Spraul <[email protected]> Cc: Jim Houston <[email protected]> Cc: Pierre Peiffer <[email protected]> Acked-by: Rik van Riel <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
3219b3b745
commit
f9c46d6ea5
2 changed files with 22 additions and 5 deletions
11
lib/idr.c
11
lib/idr.c
|
|
@ -456,7 +456,8 @@ EXPORT_SYMBOL(idr_destroy);
|
|||
* return indicates that @id is not valid or you passed %NULL in
|
||||
* idr_get_new().
|
||||
*
|
||||
* The caller must serialize idr_find() vs idr_get_new() and idr_remove().
|
||||
* This function can be called under rcu_read_lock(), given that the leaf
|
||||
* pointers lifetimes are correctly managed.
|
||||
*/
|
||||
void *idr_find(struct idr *idp, int id)
|
||||
{
|
||||
|
|
@ -464,7 +465,7 @@ void *idr_find(struct idr *idp, int id)
|
|||
struct idr_layer *p;
|
||||
|
||||
n = idp->layers * IDR_BITS;
|
||||
p = idp->top;
|
||||
p = rcu_dereference(idp->top);
|
||||
|
||||
/* Mask off upper bits we don't use for the search. */
|
||||
id &= MAX_ID_MASK;
|
||||
|
|
@ -474,7 +475,7 @@ void *idr_find(struct idr *idp, int id)
|
|||
|
||||
while (n > 0 && p) {
|
||||
n -= IDR_BITS;
|
||||
p = p->ary[(id >> n) & IDR_MASK];
|
||||
p = rcu_dereference(p->ary[(id >> n) & IDR_MASK]);
|
||||
}
|
||||
return((void *)p);
|
||||
}
|
||||
|
|
@ -507,7 +508,7 @@ int idr_for_each(struct idr *idp,
|
|||
struct idr_layer **paa = &pa[0];
|
||||
|
||||
n = idp->layers * IDR_BITS;
|
||||
p = idp->top;
|
||||
p = rcu_dereference(idp->top);
|
||||
max = 1 << n;
|
||||
|
||||
id = 0;
|
||||
|
|
@ -515,7 +516,7 @@ int idr_for_each(struct idr *idp,
|
|||
while (n > 0 && p) {
|
||||
n -= IDR_BITS;
|
||||
*paa++ = p;
|
||||
p = p->ary[(id >> n) & IDR_MASK];
|
||||
p = rcu_dereference(p->ary[(id >> n) & IDR_MASK]);
|
||||
}
|
||||
|
||||
if (p) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue