Messages in this thread Patch in this message | | | From | Roland McGrath <> | Subject | Re: [PATCH] coredump: elf_core_dump: skip kernel threads | Date | Thu, 19 Jun 2008 00:19:32 -0700 (PDT) |
| |
Perhaps a little prettier like this:
--- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -1469,6 +1469,12 @@ static int fill_thread_core_info(struct return 1; } +static bool is_dump_thread(struct task_struct *dump_task, + struct task_struct *thread) +{ + return !(thread->flags & PF_KTHREAD) && thread->mm == dump_task->mm; +} + static int fill_note_info(struct elfhdr *elf, int phdrs, struct elf_note_info *info, long signr, struct pt_regs *regs) @@ -1518,7 +1524,7 @@ static int fill_note_info(struct elfhdr */ rcu_read_lock(); do_each_thread(g, p) - if (p->mm == dump_task->mm) { + if (is_dump_thread(dump_task, p)) { t = kzalloc(offsetof(struct elf_thread_core_info, notes[info->thread_notes]), GFP_ATOMIC); @@ -1722,7 +1728,7 @@ static int fill_note_info(struct elfhdr struct elf_thread_status *ets; rcu_read_lock(); do_each_thread(g, p) - if (current->mm == p->mm && current != p) { + if (p != current && is_dump_thread(current, p)) { ets = kzalloc(sizeof(*ets), GFP_ATOMIC); if (!ets) { rcu_read_unlock(); Or maybe you'll have other reasons to add a task_user_mm() that returns NULL for kthreads, and then just use task_user_mm(p) == dump_task->mm here.
> It is sad we have to iterate over all threads in system and use GFP_ATOMIC. > Hopefully we can kill theses ugly do_each_thread()s, but this needs some > nontrivial changes in mm_struct and do_coredump.
Agreed, and twice at that (coredump_wait). But this is something more to consider for the future, and I wouldn't worry about it right now.
Thanks, Roland
| |