All of lore.kernel.org
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: qemu-devel@nongnu.org, berrange@redhat.com, mreitz@redhat.com,
	pbonzini@redhat.com, ldoktor@redhat.com
Subject: Re: [Qemu-devel] [PATCH v3 2/2] vl: fix use of --daemonize with --preconfig
Date: Wed, 6 Jun 2018 10:34:50 +0200	[thread overview]
Message-ID: <20180606103450.5d534b78@redhat.com> (raw)
In-Reply-To: <20180605183001.GO7451@localhost.localdomain>

On Tue, 5 Jun 2018 15:30:01 -0300
Eduardo Habkost <ehabkost@redhat.com> wrote:

> On Tue, Jun 05, 2018 at 04:00:43PM +0200, Igor Mammedov wrote:
> > When using --daemonize, the initial lead process will fork a child and
> > then wait to be notified that setup is complete via a pipe, before it
> > exits.  When using --preconfig there is an extra call to main_loop()
> > before the notification is done from os_setup_post(). Thus the parent
> > process won't exit until the mgmt application connects to the monitor
> > and tells QEMU to leave the RUN_STATE_PRECONFIG. The mgmt application
> > won't connect to the monitor until daemonizing has completed though.
> > 
> > This is a chicken and egg problem, leading to deadlock at startup.
> > 
> > The only viable way to fix this is to call os_setup_post() before
> > the early main_loop_wait() call when in RUN_STATE_PRECONFIG. This has
> > the downside that any errors from this point onwards won't be handled
> > well by the mgmt application, because it will think QEMU has started
> > successfully, so not be expecting an abrupt exit. The only way to
> > deal with that is to move as much user input validation as possible
> > to before the main_loop() call. This is left as an exercise for
> > future interested developers.
> > 
> > Based on:
> >   From: Daniel P. Berrangé <berrange@redhat.com>
> >   Subject: [PATCH v2 2/2] vl: fix use of --daemonize with --preconfig
> >   Message-Id: <20180604120345.12955-3-berrange@redhat.com>
> > 
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> > v3:
> >   - rewrite to apply on top of 1/2
> > ---
> >  os-posix.c | 6 ++++++
> >  vl.c       | 2 +-
> >  2 files changed, 7 insertions(+), 1 deletion(-)
> > 
> > diff --git a/os-posix.c b/os-posix.c
> > index 9ce6f74..ee06a8d 100644
> > --- a/os-posix.c
> > +++ b/os-posix.c
> > @@ -309,8 +309,14 @@ void os_daemonize(void)
> >  
> >  void os_setup_post(void)
> >  {
> > +    static bool os_setup_post_done = false;
> >      int fd = 0;
> >  
> > +    if (os_setup_post_done) {
> > +        return;
> > +    }
> > +    os_setup_post_done = true;
> > +  
> 
> This part is nice because it allows the os_setup_post() call in
> the second main loop to be unconditional, but:
> 
> >      if (daemonize) {
> >          if (chdir("/")) {
> >              error_report("not able to chdir to /: %s", strerror(errno));
> > diff --git a/vl.c b/vl.c
> > index fa44138..d6fa67f 100644
> > --- a/vl.c
> > +++ b/vl.c
> > @@ -1960,6 +1960,7 @@ static void main_loop(void)
> >  #ifdef CONFIG_PROFILER
> >          ti = profile_getclock();
> >  #endif
> > +        os_setup_post();
> >          main_loop_wait(false);  
> 
> Ensuring the correctness of this os_setup_post() call depends on
> reading the whole body of main_loop_should_exit(), which is a
> complex and large function.  I think this is too fragile for my
> taste.
Fragility was the reason why I moved it into main_loop(),
as os_setup_post() was already overlooked once, since
one would have to make very non-obvious connection with
libvirt requirement to call it before main_loop_wait()
This way call to os_setup_post() will not be forgotten,
and would get an attention whenever main_loop() is concerned.


> I prefer Daniel's approach where we have two
> os_setup_post()/main_loop() call sites, and the first one is
> conditional on --preconfig.
Considering we are unlikely to add one more invocation of main_loop().
I'll post here Daniel's version that applies on top of 1/2 with
a comment so we won't forget about libvirt's requirement
(not the best way to write something robust but better then nothing).
So pick whatever variant would seem the best.


> >  #ifdef CONFIG_PROFILER
> >          dev_time += profile_getclock() - ti;
> > @@ -4707,7 +4708,6 @@ int main(int argc, char **argv, char **envp)
> >      }
> >  
> >      accel_setup_post(current_machine);
> > -    os_setup_post();
> >  
> >      main_loop();
> >  
> > -- 
> > 2.7.4
> >   
> 

  reply	other threads:[~2018-06-06  8:35 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-05 14:00 [Qemu-devel] [PATCH v3 0/2] fix -nodefaults and -daemonize regressions caused by --preconfig introduction Igor Mammedov
2018-06-05 14:00 ` [Qemu-devel] [PATCH v3 1/2] cli: Don't run early event loop if no --preconfig was specified Igor Mammedov
2018-06-05 18:12   ` Eduardo Habkost
2018-06-06  7:22     ` Igor Mammedov
2018-06-11 17:34       ` Eduardo Habkost
2018-06-05 14:00 ` [Qemu-devel] [PATCH v3 2/2] vl: fix use of --daemonize with --preconfig Igor Mammedov
2018-06-05 15:13   ` Eric Blake
2018-06-05 15:28     ` [Qemu-devel] [PATCH v4 " Igor Mammedov
2018-06-05 18:30   ` [Qemu-devel] [PATCH v3 " Eduardo Habkost
2018-06-06  8:34     ` Igor Mammedov [this message]
2018-06-06  8:37     ` [Qemu-devel] [PATCH v5 " Igor Mammedov
2018-06-06 13:50       ` Eduardo Habkost
2018-06-07 12:00         ` [Qemu-devel] [PATCH v6 " Igor Mammedov
2018-06-08 13:21           ` Eduardo Habkost
2018-06-11 13:16             ` Igor Mammedov
2018-06-11 19:06               ` Eduardo Habkost
2018-06-11 21:29                 ` Igor Mammedov
2018-06-11 22:36                   ` Eduardo Habkost
2018-06-12  9:17                     ` [Qemu-devel] [libvirt] " Michal Privoznik
2018-06-12 12:42                       ` Igor Mammedov
2018-06-12 12:50                         ` Daniel P. Berrangé
2018-06-13 14:17                           ` Eduardo Habkost
2018-06-13 14:23                             ` Daniel P. Berrangé
2018-06-13 17:09                               ` Eduardo Habkost
2018-06-14 12:32                                 ` Igor Mammedov
2018-06-12 13:04                         ` Michal Privoznik
2018-06-12 13:10                           ` Peter Krempa
2018-06-12 13:17                           ` Daniel P. Berrangé
2018-06-06  8:55 ` [Qemu-devel] [PATCH v3 0/2] fix -nodefaults and -daemonize regressions caused by --preconfig introduction no-reply

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=20180606103450.5d534b78@redhat.com \
    --to=imammedo@redhat.com \
    --cc=berrange@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=ldoktor@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.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.