The problem with the call_rcu() API is that a single thread can generate an arbitrarily large number of blocks of memory awaiting a grace period, as illustrated by the following:
1 while (p = kmalloc(sizeof(*p), GFP_ATOMIC)) 2 call_rcu(&p->rcu, f); |
In contrast, the analogous code using synchronize_rcu() can have at most a single block of memory per thread awaiting a grace period:
1 while (p = kmalloc(sizeof(*p), 2 GFP_ATOMIC)) { 3 synchronize_rcu(); 4 kfree(&p->rcu, f); 5 } |
Therefore, SRCU provides an equivalent to synchronize_rcu(), but not to call_rcu().