Re: [PATCH] memcg: restore ss->id_lock to spinlock, using RCU for next
From: Eric Dumazet <hidden>
Date: 2012-01-19 07:33:28
Also in:
linux-mm, lkml
From: Eric Dumazet <hidden>
Date: 2012-01-19 07:33:28
Also in:
linux-mm, lkml
Le mercredi 18 janvier 2012 à 22:05 -0800, Hugh Dickins a écrit :
2. Make one small adjustment to idr_get_next(): take the height from the top layer (stable under RCU) instead of from the root (unprotected by RCU), as idr_find() does.
--- 3.2.0+/lib/idr.c 2012-01-04 15:55:44.000000000 -0800 +++ linux/lib/idr.c 2012-01-18 21:25:36.947963342 -0800@@ -605,11 +605,11 @@ void *idr_get_next(struct idr *idp, int int n, max; /* find first ent */ - n = idp->layers * IDR_BITS; - max = 1 << n; p = rcu_dereference_raw(idp->top); if (!p) return NULL; + n = (p->layer + 1) * IDR_BITS; + max = 1 << n; while (id < max) { while (n > 0 && p) {
Interesting, but should be a patch on its own.
Maybe other idr users can benefit from your idea as well, if patch is
labeled "idr: allow idr_get_next() from rcu_read_lock" or something...
I suggest introducing idr_get_next_rcu() helper to make the check about
rcu cleaner.
idr_get_next_rcu(...)
{
WARN_ON_ONCE(!rcu_read_lock_held());
return idr_get_next(...);
}