From: Paul Menage cpuset.c:update_nodemask() uses a write_lock_irq() on tasklist_lock to block concurrent forks; a read_lock() suffices and is less intrusive. Signed-off-by: Paul Menage Cc: Paul Jackson Signed-off-by: Andrew Morton --- kernel/cpuset.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff -puN kernel/cpuset.c~reduce-cpusetc-write_lock_irq-to-read_lock kernel/cpuset.c --- a/kernel/cpuset.c~reduce-cpusetc-write_lock_irq-to-read_lock +++ a/kernel/cpuset.c @@ -923,10 +923,10 @@ static int update_nodemask(struct cpuset mmarray = kmalloc(ntasks * sizeof(*mmarray), GFP_KERNEL); if (!mmarray) goto done; - write_lock_irq(&tasklist_lock); /* block fork */ + read_lock(&tasklist_lock); /* block fork */ if (atomic_read(&cs->count) <= ntasks) break; /* got enough */ - write_unlock_irq(&tasklist_lock); /* try again */ + read_unlock(&tasklist_lock); /* try again */ kfree(mmarray); } @@ -948,7 +948,7 @@ static int update_nodemask(struct cpuset continue; mmarray[n++] = mm; } while_each_thread(g, p); - write_unlock_irq(&tasklist_lock); + read_unlock(&tasklist_lock); /* * Now that we've dropped the tasklist spinlock, we can _