All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleg Nesterov <oleg@redhat.com>
To: Suresh Siddha <suresh.b.siddha@intel.com>
Cc: torvalds@linux-foundation.org, hpa@zytor.com, mingo@elte.hu,
	linux-kernel@vger.kernel.org, suresh@aristanetworks.com
Subject: Re: [PATCH v2 2/4] coredump: ensure the fpu state is flushed for proper multi-threaded core dump
Date: Sun, 13 May 2012 18:11:17 +0200	[thread overview]
Message-ID: <20120513161117.GA6684@redhat.com> (raw)
In-Reply-To: <1336763121.12610.13.camel@sbsiddha-desk.sc.intel.com>

On 05/11, Suresh Siddha wrote:
>
> On Fri, 2012-05-11 at 18:51 +0200, Oleg Nesterov wrote:
> > On 05/10, Suresh Siddha wrote:
> > >
> > > --- a/fs/exec.c
> > > +++ b/fs/exec.c
> > > @@ -1930,8 +1930,21 @@ static int coredump_wait(int exit_code, struct core_state *core_state)
> > >  		core_waiters = zap_threads(tsk, mm, core_state, exit_code);
> > >  	up_write(&mm->mmap_sem);
> > >
> > > -	if (core_waiters > 0)
> > > +	if (core_waiters > 0) {
> > > +		struct core_thread *ptr;
> > > +
> > >  		wait_for_completion(&core_state->startup);
> > > +		/*
> > > +		 * Wait for all the threads to become inactive, so that
> > > +		 * all the thread context (extended register state, like
> > > +		 * fpu etc) gets copied to the memory.
> > > +		 */
> > > +		ptr = core_state->dumper.next;
> > > +		while (ptr != NULL) {
> > > +			wait_task_inactive(ptr->task, 0);
> > > +			ptr = ptr->next;
> > > +		}
> > > +	}
> >
> > OK, but this adds the unnecessary penalty if we are not going to dump
> > the core.
>
> If we are not planning to dump the core, then we will not be in the
> coredump_wait() right?

No. coredump_wait() is always called if sig_kernel_coredump(sig) == T.
Ignoring the __get_dumpable() security checks. And if RLIMIT_CORE == 0
we do not actually dump the core (unless ispipe of course).

Btw, I do not know if this is essential or not. I mean, we could probably
add the "fast path" check and simply return, the whole process will be
killed anyway by do_group_exit(), it is faster than coredump_wait().
But note that coredump_wait() kills all ->mm users (not only sub-threads),
perhaps we shouldn't/can't change this behaviour, I dunno.

And yes, do_coredump() does other unnecessary work like override_creds()
in this case, probably this needs some cleanups.

> coredump_wait() already waits for all the threads to respond (referring
> to the existing wait_for_completion() line before the proposed
> addition).

Yes,

> and in most cases, wait_task_inactive() will
> return success immediately.

I agree. Still, we add the O(n) loop which needs task_rq_lock() at least.

> And in the corner cases (where we hit the
> bug_on before) we will spin a bit now while the other thread is still on
> the rq.

Plus the possible schedule_hrtimeout().

But once again, I agree that this all is not very important.

> > Perhaps it makes sense to create a separate helper and call it from
> > do_coredump() right before "retval = binfmt->core_dump(&cprm)" ?
>
> I didn't want to spread the core dump waits at multiple places.
> coredump_wait() seems to be the natural place, as we are already waiting
> for other threads to join.

OK. We can shift this code later if needed.

In fact, perhaps we should move the whole "if (core_waiters > 0)" logic,
including wait_for_completion() to increase the parallelize. Not sure,
this will complicate the error handling.

And, perhaps, we should use wait_task_inactive(TASK_UNINTERRUPTIBLE) and
change exit_mm() to do set_task_state() before atomic_dec_and_test(), but
this is almost off-topic.


I believe the patch is correct.

Oleg.


  reply	other threads:[~2012-05-13 16:12 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-07 19:07 [PATCH 1/2] coredump: flush the fpu exit state for proper multi-threaded core dump Suresh Siddha
2012-05-07 19:07 ` [PATCH 2/2] x86, xsave: remove thread_has_fpu() bug check in __sanitize_i387_state() Suresh Siddha
2012-05-07 19:15 ` [PATCH 1/2] coredump: flush the fpu exit state for proper multi-threaded core dump Linus Torvalds
2012-05-07 20:09   ` Suresh Siddha
2012-05-08 23:18     ` Suresh Siddha
2012-05-08 23:18       ` [PATCH 1/3] " Suresh Siddha
2012-05-09 21:05         ` Oleg Nesterov
2012-05-09 21:32           ` Suresh Siddha
2012-05-10 16:55             ` Oleg Nesterov
2012-05-10 17:04               ` Linus Torvalds
2012-05-10 23:33                 ` [PATCH v2 1/4] fork: move the real prepare_to_copy() users to arch_dup_task_struct() Suresh Siddha
2012-05-10 23:33                   ` [PATCH v2 2/4] coredump: ensure the fpu state is flushed for proper multi-threaded core dump Suresh Siddha
2012-05-11 16:51                     ` Oleg Nesterov
2012-05-11 19:05                       ` Suresh Siddha
2012-05-13 16:11                         ` Oleg Nesterov [this message]
2012-05-15 18:03                           ` Suresh Siddha
2012-05-15 18:55                             ` Oleg Nesterov
2012-05-17  0:17                     ` [tip:x86/fpu] " tip-bot for Suresh Siddha
2012-05-10 23:33                   ` [PATCH v2 3/4] x86, xsave: remove thread_has_fpu() bug check in __sanitize_i387_state() Suresh Siddha
2012-05-17  0:18                     ` [tip:x86/fpu] " tip-bot for Suresh Siddha
2012-05-10 23:33                   ` [PATCH v2 4/4] x86, fpu: drop the fpu state during thread exit Suresh Siddha
2012-05-17  0:19                     ` [tip:x86/fpu] " tip-bot for Suresh Siddha
2012-05-11  0:17                   ` [PATCH v2 1/4] fork: move the real prepare_to_copy() users to arch_dup_task_struct() Benjamin Herrenschmidt
2012-05-17  0:16                   ` [tip:x86/fpu] " tip-bot for Suresh Siddha
2012-05-10 23:48                 ` [PATCH 1/3] coredump: flush the fpu exit state for proper multi-threaded core dump Suresh Siddha
2012-05-08 23:18       ` [PATCH 2/3] x86, xsave: remove thread_has_fpu() bug check in __sanitize_i387_state() Suresh Siddha
2012-05-09 20:30         ` Oleg Nesterov
2012-05-09 21:18           ` Suresh Siddha
2012-05-10 16:36             ` Oleg Nesterov
2012-05-08 23:18       ` [PATCH 3/3] x86, fpu: clear the fpu state during thread exit Suresh Siddha

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120513161117.GA6684@redhat.com \
    --to=oleg@redhat.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=suresh.b.siddha@intel.com \
    --cc=suresh@aristanetworks.com \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.