elf_core_dump: don't take tasklist_lock
Subsystems (2)
PATCH 1/1 elf_core_dump: don't take tasklist_lock
do_each_thread() is rcu-safe, and all tasks which use this ->mm must sleep in wait_for_completion(&mm->core_done) at this point, so we can use RCU locks.
Also, remove unneeded INIT_LIST_HEAD(new) before list_add(new, head).
Signed-off-by Oleg Nesterov <[email protected]>
fs/binfmt_elf.c renamed from fs/binfmt_elf.c~elf +3 -4
@@ -1480,20 +1480,19 @@ static int elf_core_dump(long signr, strif (signr) {struct elf_thread_status *tmp; -read_lock (&tasklist_lock); +rcu_read_lock (); do_each_thread(g,p)if (current->mm == p->mm && current != p) { tmp =kzalloc (sizeof (*tmp),GFP_ATOMIC );if (!tmp) { -read_unlock (&tasklist_lock); +rcu_read_unlock (); goto cleanup; } -INIT_LIST_HEAD (&tmp->list); tmp->thread = p;list_add (&tmp->list, &thread_list); }while_each_thread (g,p); -read_unlock (&tasklist_lock); +rcu_read_unlock ();list_for_each (t, &thread_list) {struct elf_thread_status *tmp;int sz;