[PATCH] cpuset: skip rcu check if task is in root cpuset
For systems that aren't using cpusets, but have them CONFIG_CPUSET enabled in their kernel (eventually this may be most distribution kernels), this patch removes even the minimal rcu_read_lock() from the memory page allocation path. Actually, it removes that rcu call for any task that is in the root cpuset (top_cpuset), which on systems not actively using cpusets, is all tasks. We don't need the rcu check for tasks in the top_cpuset, because the top_cpuset is statically allocated, so at no risk of being freed out from underneath us. Signed-off-by: Paul Jackson <pj@sgi.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
7edc59628b
commit
03a285f580
@@ -647,10 +647,15 @@ void cpuset_update_task_memory_state()
|
|||||||
struct task_struct *tsk = current;
|
struct task_struct *tsk = current;
|
||||||
struct cpuset *cs;
|
struct cpuset *cs;
|
||||||
|
|
||||||
|
if (tsk->cpuset == &top_cpuset) {
|
||||||
|
/* Don't need rcu for top_cpuset. It's never freed. */
|
||||||
|
my_cpusets_mem_gen = top_cpuset.mems_generation;
|
||||||
|
} else {
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
cs = rcu_dereference(tsk->cpuset);
|
cs = rcu_dereference(tsk->cpuset);
|
||||||
my_cpusets_mem_gen = cs->mems_generation;
|
my_cpusets_mem_gen = cs->mems_generation;
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
}
|
||||||
|
|
||||||
if (my_cpusets_mem_gen != tsk->cpuset_mems_generation) {
|
if (my_cpusets_mem_gen != tsk->cpuset_mems_generation) {
|
||||||
down(&callback_sem);
|
down(&callback_sem);
|
||||||
|
Reference in New Issue
Block a user