Messages in this thread | | | Subject | Sleeping in RCU list traversal | From | Tetsuo Handa <> | Date | Sun, 7 Oct 2007 19:38:33 +0900 |
| |
Hello.
Peter Zijlstra wrote: > > Can I sleep between rcu_read_lock() and rcu_read_unlock() ? > > As far as I saw, rcu_read_lock() makes in_atomic() true, so I think I can't sleep. > You can indeed not sleep in an rcu_read_lock() section. However, you > could grab a reference on an item, stop the iteration, drop > rcu_read_lock. Do you thing, re-acquire rcu_read_lock(), drop the ref, > and continue the iteration.
Something like this?
rcu_read_lock(); list_for_each_rcu(p, ...) { ptr = list_entry(p, struct ..., list); /* Grab a reference to "ptr". */ rcu_read_unlock(); my_task_that_may_sleep(ptr); rcu_read_lock(); /* Drop a reference to "ptr". */ } rcu_read_unlock();
Regarding my case, memory region pointed by "ptr" never be removed. Do I need to grab a reference to "ptr" ?
Regards.
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |