All of lore.kernel.org
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [PATCH 07/15] chardev: do not use machine_init_done
Date: Mon, 7 Dec 2020 16:15:38 +0100	[thread overview]
Message-ID: <20201207161538.798655fb@redhat.com> (raw)
In-Reply-To: <20201202081854.4126071-8-pbonzini@redhat.com>

On Wed,  2 Dec 2020 03:18:46 -0500
Paolo Bonzini <pbonzini@redhat.com> wrote:

> machine_init_done is not the right flag to check when preconfig
> is taken into account; for example "./qemu-system-x86_64 -serial
> mon:stdio -preconfig" does not print the QEMU monitor header until after
> exit_preconfig.  Add back a custom bool for mux character devices.  This
> partially undoes commit c7278b4355 ("chardev: introduce chr_machine_done
> hook", 2018-03-12), cut keeps the cleaner logic using a function pointer
                      ^^^
did you mean
s/cut/but/

> in ChardevClass.

Reviewed-by: Igor Mammedov <imammedo@redhat.com>


> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  chardev/char-mux.c        | 38 ++++++++++++++++++---
>  chardev/chardev-sysemu.c  | 69 ---------------------------------------
>  chardev/meson.build       |  2 +-
>  hw/core/machine.c         |  2 +-
>  include/chardev/char.h    |  6 ++--
>  include/sysemu/sysemu.h   |  2 --
>  softmmu/vl.c              |  3 ++
>  stubs/machine-init-done.c |  8 -----
>  stubs/meson.build         |  1 -
>  9 files changed, 43 insertions(+), 88 deletions(-)
>  delete mode 100644 chardev/chardev-sysemu.c
>  delete mode 100644 stubs/machine-init-done.c
> 
> diff --git a/chardev/char-mux.c b/chardev/char-mux.c
> index 6f980bb836..72beef29d2 100644
> --- a/chardev/char-mux.c
> +++ b/chardev/char-mux.c
> @@ -33,6 +33,13 @@
>  
>  /* MUX driver for serial I/O splitting */
>  
> +/*
> + * Set to false by suspend_mux_open.  Open events are delayed until
> + * resume_mux_open.  Usually suspend_mux_open is called before
> + * command line processing and resume_mux_open afterwards.
> + */
> +static bool muxes_opened = true;
> +
>  /* Called with chr_write_lock held.  */
>  static int mux_chr_write(Chardev *chr, const uint8_t *buf, int len)
>  {
> @@ -237,7 +244,7 @@ void mux_chr_send_all_event(Chardev *chr, QEMUChrEvent event)
>      MuxChardev *d = MUX_CHARDEV(chr);
>      int i;
>  
> -    if (!machine_init_done) {
> +    if (!muxes_opened) {
>          return;
>      }
>  
> @@ -328,7 +335,7 @@ static void qemu_chr_open_mux(Chardev *chr,
>      /* only default to opened state if we've realized the initial
>       * set of muxes
>       */
> -    *be_opened = machine_init_done;
> +    *be_opened = muxes_opened;
>      qemu_chr_fe_init(&d->chr, drv, errp);
>  }
>  
> @@ -360,19 +367,42 @@ static void qemu_chr_parse_mux(QemuOpts *opts, ChardevBackend *backend,
>   * mux will receive CHR_EVENT_OPENED notifications for the BE
>   * immediately.
>   */
> -static int open_muxes(Chardev *chr)
> +static void open_muxes(Chardev *chr)
>  {
>      /* send OPENED to all already-attached FEs */
>      mux_chr_send_all_event(chr, CHR_EVENT_OPENED);
> +
>      /*
>       * mark mux as OPENED so any new FEs will immediately receive
>       * OPENED event
>       */
>      chr->be_open = 1;
> +}
> +
> +void suspend_mux_open(void)
> +{
> +    muxes_opened = false;
> +}
> +
> +static int chardev_options_parsed_cb(Object *child, void *opaque)
> +{
> +    Chardev *chr = (Chardev *)child;
> +    ChardevClass *class = CHARDEV_GET_CLASS(chr);
> +
> +    if (!chr->be_open && class->chr_options_parsed) {
> +        class->chr_options_parsed(chr);
> +    }
>  
>      return 0;
>  }
>  
> +void resume_mux_open(void)
> +{
> +    muxes_opened = true;
> +    object_child_foreach(get_chardevs_root(),
> +                         chardev_options_parsed_cb, NULL);
> +}
> +
>  static void char_mux_class_init(ObjectClass *oc, void *data)
>  {
>      ChardevClass *cc = CHARDEV_CLASS(oc);
> @@ -383,7 +413,7 @@ static void char_mux_class_init(ObjectClass *oc, void *data)
>      cc->chr_accept_input = mux_chr_accept_input;
>      cc->chr_add_watch = mux_chr_add_watch;
>      cc->chr_be_event = mux_chr_be_event;
> -    cc->chr_machine_done = open_muxes;
> +    cc->chr_options_parsed = open_muxes;
>      cc->chr_update_read_handler = mux_chr_update_read_handlers;
>  }
>  
> diff --git a/chardev/chardev-sysemu.c b/chardev/chardev-sysemu.c
> deleted file mode 100644
> index eecdc615ee..0000000000
> --- a/chardev/chardev-sysemu.c
> +++ /dev/null
> @@ -1,69 +0,0 @@
> -/*
> - * QEMU System Emulator
> - *
> - * Copyright (c) 2003-2008 Fabrice Bellard
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining a copy
> - * of this software and associated documentation files (the "Software"), to deal
> - * in the Software without restriction, including without limitation the rights
> - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> - * copies of the Software, and to permit persons to whom the Software is
> - * furnished to do so, subject to the following conditions:
> - *
> - * The above copyright notice and this permission notice shall be included in
> - * all copies or substantial portions of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> - * THE SOFTWARE.
> - */
> -
> -#include "qemu/osdep.h"
> -#include "sysemu/sysemu.h"
> -#include "chardev/char.h"
> -#include "qemu/error-report.h"
> -#include "chardev-internal.h"
> -
> -static int chardev_machine_done_notify_one(Object *child, void *opaque)
> -{
> -    Chardev *chr = (Chardev *)child;
> -    ChardevClass *class = CHARDEV_GET_CLASS(chr);
> -
> -    if (class->chr_machine_done) {
> -        return class->chr_machine_done(chr);
> -    }
> -
> -    return 0;
> -}
> -
> -static void chardev_machine_done_hook(Notifier *notifier, void *unused)
> -{
> -    int ret = object_child_foreach(get_chardevs_root(),
> -                                   chardev_machine_done_notify_one, NULL);
> -
> -    if (ret) {
> -        error_report("Failed to call chardev machine_done hooks");
> -        exit(1);
> -    }
> -}
> -
> -
> -static Notifier chardev_machine_done_notify = {
> -    .notify = chardev_machine_done_hook,
> -};
> -
> -static void register_types(void)
> -{
> -    /*
> -     * This must be done after machine init, since we register FEs with muxes
> -     * as part of realize functions like serial_isa_realizefn when -nographic
> -     * is specified.
> -     */
> -    qemu_add_machine_init_done_notifier(&chardev_machine_done_notify);
> -}
> -
> -type_init(register_types);
> diff --git a/chardev/meson.build b/chardev/meson.build
> index 859d8b04d4..4e19722c5e 100644
> --- a/chardev/meson.build
> +++ b/chardev/meson.build
> @@ -25,7 +25,7 @@ chardev_ss.add(when: 'CONFIG_WIN32', if_true: files(
>  
>  chardev_ss = chardev_ss.apply(config_host, strict: false)
>  
> -softmmu_ss.add(files('chardev-sysemu.c', 'msmouse.c', 'wctablet.c', 'testdev.c'))
> +softmmu_ss.add(files('msmouse.c', 'wctablet.c', 'testdev.c'))
>  
>  chardev_modules = {}
>  
> diff --git a/hw/core/machine.c b/hw/core/machine.c
> index 025c4f9749..40876ddd8e 100644
> --- a/hw/core/machine.c
> +++ b/hw/core/machine.c
> @@ -1176,7 +1176,7 @@ void machine_run_board_init(MachineState *machine)
>  static NotifierList machine_init_done_notifiers =
>      NOTIFIER_LIST_INITIALIZER(machine_init_done_notifiers);
>  
> -bool machine_init_done;
> +static bool machine_init_done;
>  
>  void qemu_add_machine_init_done_notifier(Notifier *notify)
>  {
> diff --git a/include/chardev/char.h b/include/chardev/char.h
> index db42f0a8c6..4181a2784a 100644
> --- a/include/chardev/char.h
> +++ b/include/chardev/char.h
> @@ -270,8 +270,7 @@ struct ChardevClass {
>      void (*chr_set_echo)(Chardev *chr, bool echo);
>      void (*chr_set_fe_open)(Chardev *chr, int fe_open);
>      void (*chr_be_event)(Chardev *s, QEMUChrEvent event);
> -    /* Return 0 if succeeded, 1 if failed */
> -    int (*chr_machine_done)(Chardev *chr);
> +    void (*chr_options_parsed)(Chardev *chr);
>  };
>  
>  Chardev *qemu_chardev_new(const char *id, const char *typename,
> @@ -283,6 +282,9 @@ extern int term_escape_char;
>  GSource *qemu_chr_timeout_add_ms(Chardev *chr, guint ms,
>                                   GSourceFunc func, void *private);
>  
> +void suspend_mux_open(void);
> +void resume_mux_open(void);
> +
>  /* console.c */
>  void qemu_chr_parse_vc(QemuOpts *opts, ChardevBackend *backend, Error **errp);
>  
> diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
> index 0e7b405d22..9b47cdca55 100644
> --- a/include/sysemu/sysemu.h
> +++ b/include/sysemu/sysemu.h
> @@ -16,8 +16,6 @@ extern bool qemu_uuid_set;
>  void qemu_add_exit_notifier(Notifier *notify);
>  void qemu_remove_exit_notifier(Notifier *notify);
>  
> -extern bool machine_init_done;
> -
>  void qemu_run_machine_init_done_notifiers(void);
>  void qemu_add_machine_init_done_notifier(Notifier *notify);
>  void qemu_remove_machine_init_done_notifier(Notifier *notify);
> diff --git a/softmmu/vl.c b/softmmu/vl.c
> index d8af26c281..8e18c52f6e 100644
> --- a/softmmu/vl.c
> +++ b/softmmu/vl.c
> @@ -3462,6 +3462,8 @@ void qemu_init(int argc, char **argv, char **envp)
>  
>      qemu_create_machine(select_machine());
>  
> +    suspend_mux_open();
> +
>      qemu_disable_default_devices();
>      qemu_create_default_devices();
>      qemu_create_early_backends();
> @@ -3525,4 +3527,5 @@ void qemu_init(int argc, char **argv, char **envp)
>      }
>      accel_setup_post(current_machine);
>      os_setup_post();
> +    resume_mux_open();
>  }
> diff --git a/stubs/machine-init-done.c b/stubs/machine-init-done.c
> deleted file mode 100644
> index cd8e81392d..0000000000
> --- a/stubs/machine-init-done.c
> +++ /dev/null
> @@ -1,8 +0,0 @@
> -#include "qemu/osdep.h"
> -#include "sysemu/sysemu.h"
> -
> -bool machine_init_done = true;
> -
> -void qemu_add_machine_init_done_notifier(Notifier *notify)
> -{
> -}
> diff --git a/stubs/meson.build b/stubs/meson.build
> index cc56c83063..80b1d81a31 100644
> --- a/stubs/meson.build
> +++ b/stubs/meson.build
> @@ -21,7 +21,6 @@ stub_ss.add(files('iothread-lock.c'))
>  stub_ss.add(files('isa-bus.c'))
>  stub_ss.add(files('is-daemonized.c'))
>  stub_ss.add(when: 'CONFIG_LINUX_AIO', if_true: files('linux-aio.c'))
> -stub_ss.add(files('machine-init-done.c'))
>  stub_ss.add(files('migr-blocker.c'))
>  stub_ss.add(files('monitor.c'))
>  stub_ss.add(files('monitor-core.c'))



  reply	other threads:[~2020-12-07 15:19 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-02  8:18 [PATCH 00/15] Finish cleaning up qemu_init Paolo Bonzini
2020-12-02  8:18 ` [PATCH 01/15] remove preconfig state Paolo Bonzini
2020-12-07 13:57   ` Igor Mammedov
2020-12-07 14:11     ` Paolo Bonzini
2020-12-07 15:14       ` Igor Mammedov
2020-12-02  8:18 ` [PATCH 02/15] vl: remove separate preconfig main_loop Paolo Bonzini
2020-12-07 14:02   ` Igor Mammedov
2020-12-02  8:18 ` [PATCH 03/15] vl: allow -incoming defer with -preconfig Paolo Bonzini
2020-12-02  8:18 ` [PATCH 04/15] vl: extract softmmu/runstate.c Paolo Bonzini
2020-12-02  8:18 ` [PATCH 05/15] vl: extract softmmu/globals.c Paolo Bonzini
2020-12-02  8:18 ` [PATCH 06/15] vl: move all generic initialization out of vl.c Paolo Bonzini
2020-12-07 14:19   ` Igor Mammedov
2020-12-02  8:18 ` [PATCH 07/15] chardev: do not use machine_init_done Paolo Bonzini
2020-12-07 15:15   ` Igor Mammedov [this message]
2020-12-02  8:18 ` [PATCH 08/15] machine: introduce MachineInitPhase Paolo Bonzini
2020-12-07 15:28   ` Igor Mammedov
2020-12-02  8:18 ` [PATCH 09/15] machine: record whether nvdimm= was set Paolo Bonzini
2020-12-07 15:40   ` Igor Mammedov
2020-12-02  8:18 ` [PATCH 10/15] vl: make qemu_get_machine_opts static Paolo Bonzini
2020-12-07 16:07   ` Igor Mammedov
2020-12-07 16:38     ` Paolo Bonzini
2020-12-08  2:32     ` Daniel Henrique Barboza
2020-12-08 10:55       ` Igor Mammedov
2020-12-08 11:05       ` [PATCH] ppc/spapr: cleanup -machine pseries,nvdimm=X handling Igor Mammedov
2020-12-08 16:46         ` [PATCH v2] " Igor Mammedov
2020-12-08 17:24           ` Daniel Henrique Barboza
2020-12-08 18:35             ` Igor Mammedov
2020-12-08  2:16   ` [PATCH 10/15] vl: make qemu_get_machine_opts static Daniel Henrique Barboza
2020-12-08  8:13     ` Paolo Bonzini
2020-12-02  8:18 ` [PATCH 11/15] qtest: add a QOM object for qtest Paolo Bonzini
2020-12-07 16:24   ` Igor Mammedov
2020-12-07 16:43     ` Paolo Bonzini
2020-12-07 16:57       ` Igor Mammedov
2020-12-07 17:22         ` Paolo Bonzini
2020-12-08 11:11           ` Igor Mammedov
2020-12-02  8:18 ` [PATCH 12/15] plugin: propagate errors Paolo Bonzini
2020-12-02 11:33   ` Alex Bennée
2020-12-07 16:53   ` Igor Mammedov
2020-12-02  8:18 ` [PATCH 13/15] memory: allow creating MemoryRegions before accelerators Paolo Bonzini
2020-12-07 16:38   ` Igor Mammedov
2020-12-07 16:40     ` Paolo Bonzini
2020-12-07 17:06   ` Igor Mammedov
2020-12-02  8:18 ` [PATCH 14/15] null-machine: do not create a default memdev Paolo Bonzini
2020-12-07 16:43   ` Igor Mammedov
2020-12-11 23:24     ` Paolo Bonzini
2020-12-14 11:53       ` Igor Mammedov
2020-12-14 13:24         ` Paolo Bonzini
2020-12-02  8:18 ` [PATCH 15/15] monitor: allow quitting while in preconfig state Paolo Bonzini
2020-12-07 16:45   ` Igor Mammedov
2020-12-07 14:12 ` [PATCH 00/15] Finish cleaning up qemu_init 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=20201207161538.798655fb@redhat.com \
    --to=imammedo@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.