From: Peter Xu <peterx@redhat.com>
To: Steve Sistare <steven.sistare@oracle.com>
Cc: qemu-devel@nongnu.org, Fabiano Rosas <farosas@suse.de>,
David Hildenbrand <david@redhat.com>,
Marcel Apfelbaum <marcel.apfelbaum@gmail.com>,
Eduardo Habkost <eduardo@habkost.net>,
Philippe Mathieu-Daude <philmd@linaro.org>,
Paolo Bonzini <pbonzini@redhat.com>,
"Daniel P. Berrange" <berrange@redhat.com>,
Markus Armbruster <armbru@redhat.com>
Subject: Re: [RFC V1 11/14] monitor: connect in precreate
Date: Mon, 21 Oct 2024 15:28:09 -0400 [thread overview]
Message-ID: <ZxarSUBGD7LpK_v6@x1n> (raw)
In-Reply-To: <1729178055-207271-12-git-send-email-steven.sistare@oracle.com>
On Thu, Oct 17, 2024 at 08:14:12AM -0700, Steve Sistare wrote:
> Complete monitor connections as early as possible, prior to
> qemu_create_early_backends, so the user can issue commands during the
> precreate phase.
>
> Make a list of the chardev's referenced by all monitors. Create the
> chardevs, then create the monitors. Exclude monitor chardevs and
> monitors from the later creation phases.
>
> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
> ---
> system/vl.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 77 insertions(+), 4 deletions(-)
>
> diff --git a/system/vl.c b/system/vl.c
> index 3c592b9..a985ab8 100644
> --- a/system/vl.c
> +++ b/system/vl.c
> @@ -1939,6 +1939,11 @@ static bool object_create_early(const ObjectOption *opt)
> return false;
> }
>
> + /* Reason: already created. */
> + if (g_str_equal(type, "mon")) {
> + return false;
> + }
Why monitor are part of "object"s? I thought it was only registered on
qemu_find_opts("mon").
Same question to object_create_late() below.
> +
> return true;
> }
>
> @@ -1956,6 +1961,68 @@ static void qemu_apply_machine_options(QDict *qdict)
> }
> }
>
> +typedef struct NamedElement {
> + char *name;
> + QTAILQ_ENTRY(NamedElement) next;
> +} NamedElement;
> +
> +static QTAILQ_HEAD(, NamedElement) monitor_chardevs =
> + QTAILQ_HEAD_INITIALIZER(monitor_chardevs);
> +
> +static void chardev_add(const char *name)
> +{
> + NamedElement *elem = g_new0(NamedElement, 1);
> +
> + elem->name = g_strdup(name);
> + QTAILQ_INSERT_TAIL(&monitor_chardevs, elem, next);
> +}
> +
> +static bool chardev_find(const char *name)
> +{
> + NamedElement *elem;
> +
> + QTAILQ_FOREACH(elem, &monitor_chardevs, next) {
> + if (g_str_equal(elem->name, name)) {
> + return true;
> + }
> + }
> + return false;
> +}
> +
> +static int monitor_add_chardev(void *opaque, QemuOpts *opts, Error **errp)
> +{
> + g_autofree char *chardev = NULL;
> + int ret = monitor_chardev_name(opts, &chardev, errp);
> +
> + if (!ret && chardev) {
> + chardev_add(chardev);
> + }
> + return ret;
> +}
> +
> +static bool option_is_monitor_chardev(void *opaque, QemuOpts *opts)
> +{
> + return chardev_find(qemu_opts_id(opts));
> +}
> +
> +static bool option_is_not_monitor_chardev(void *opaque, QemuOpts *opts)
> +{
> + return !chardev_find(qemu_opts_id(opts));
> +}
> +
> +static void qemu_create_monitors(void)
Would be good to add some generic comment on why monitors' chardev can be
created earlier before the rest.
PS: I'm not yet sure this is required for the initial support for
cpr-transfer, as there's no chardev fds involved yet? IOW, I am curious
what happens if this code init all chardevs instead of monitor-only.
> +{
> + qemu_opts_foreach(qemu_find_opts("mon"),
> + monitor_add_chardev, NULL, &error_fatal);
> +
> + qemu_opts_filter_foreach(qemu_find_opts("chardev"),
> + option_is_monitor_chardev,
> + chardev_init_func, NULL, &error_fatal);
> +
> + qemu_opts_foreach(qemu_find_opts("mon"),
> + mon_init_func, NULL, &error_fatal);
> +}
> +
> static void qemu_create_early_backends(void)
> {
> MachineClass *machine_class = MACHINE_GET_CLASS(current_machine);
> @@ -1994,7 +2061,8 @@ static void qemu_create_early_backends(void)
> /* spice must initialize before chardevs (for spicevmc and spiceport) */
> qemu_spice.init();
>
> - qemu_opts_foreach(qemu_find_opts("chardev"),
> + qemu_opts_filter_foreach(qemu_find_opts("chardev"),
> + option_is_not_monitor_chardev,
> chardev_init_func, NULL, &error_fatal);
>
> #ifdef CONFIG_VIRTFS
> @@ -2020,6 +2088,11 @@ static void qemu_create_early_backends(void)
> */
> static bool object_create_late(const ObjectOption *opt)
> {
> + /* Reason: already created. */
> + if (g_str_equal(ObjectType_str(opt->opts->qom_type), "mon")) {
> + return false;
> + }
> +
> return !object_create_early(opt) && !object_create_pre_sandbox(opt);
> }
>
> @@ -2045,9 +2118,6 @@ static void qemu_create_late_backends(void)
> exit(1);
> }
>
> - qemu_opts_foreach(qemu_find_opts("mon"),
> - mon_init_func, NULL, &error_fatal);
> -
> if (foreach_device_config(DEV_SERIAL, serial_parse) < 0)
> exit(1);
> if (foreach_device_config(DEV_PARALLEL, parallel_parse) < 0)
> @@ -3730,6 +3800,9 @@ void qemu_init(int argc, char **argv)
>
> accel = configure_accelerators(argv[0]);
>
> + os_setup_signal_handling();
Didn't immediately see why this line. Some explanations / comments could
be helpful..
> + qemu_create_monitors();
> +
> /*
> * QOM objects created after this point see all global and
> * compat properties.
> --
> 1.8.3.1
>
--
Peter Xu
next prev parent reply other threads:[~2024-10-21 19:29 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-17 15:14 [RFC V1 00/14] precreate phase Steve Sistare
2024-10-17 15:14 ` [RFC V1 01/14] accel: encapsulate search state Steve Sistare
2024-10-21 20:03 ` Fabiano Rosas
2024-10-17 15:14 ` [RFC V1 02/14] accel: accel preinit function Steve Sistare
2024-10-17 15:26 ` Steven Sistare
2024-10-21 14:54 ` Peter Xu
2024-10-23 16:13 ` Steven Sistare
2024-10-23 15:53 ` Paolo Bonzini
2024-10-23 16:25 ` Steven Sistare
2024-10-17 15:14 ` [RFC V1 03/14] accel: split configure_accelerators Steve Sistare
2024-10-17 15:14 ` [RFC V1 04/14] accel: set accelerator and machine props earlier Steve Sistare
2024-10-18 15:08 ` Fabiano Rosas
2024-10-18 15:32 ` Steven Sistare
2024-10-18 15:40 ` Steven Sistare
2024-10-18 19:15 ` Steven Sistare
2024-10-21 16:20 ` Peter Xu
2024-10-23 17:16 ` Paolo Bonzini
2024-10-22 8:30 ` David Hildenbrand
2024-10-23 20:28 ` Steven Sistare
2024-10-21 15:19 ` Peter Xu
2024-10-23 20:29 ` Steven Sistare
2024-10-23 16:00 ` Paolo Bonzini
2024-10-23 17:18 ` Paolo Bonzini
2024-10-23 20:29 ` Steven Sistare
2024-10-17 15:14 ` [RFC V1 05/14] migration: init and listen during precreate Steve Sistare
2024-10-21 16:41 ` Peter Xu
2024-10-21 21:05 ` Fabiano Rosas
2024-10-23 16:01 ` Steven Sistare
2024-10-17 15:14 ` [RFC V1 06/14] vl: precreate phase Steve Sistare
2024-10-23 14:03 ` Fabiano Rosas
2024-10-17 15:14 ` [RFC V1 07/14] monitor: chardev name Steve Sistare
2024-10-17 15:14 ` [RFC V1 08/14] qom: get properties Steve Sistare
2024-10-17 15:14 ` [RFC V1 09/14] qemu-option: filtered foreach Steve Sistare
2024-10-17 15:14 ` [RFC V1 10/14] qemu-options: pass object to filter Steve Sistare
2024-10-17 15:14 ` [RFC V1 11/14] monitor: connect in precreate Steve Sistare
2024-10-21 19:28 ` Peter Xu [this message]
2024-10-23 17:34 ` Steven Sistare
2024-10-23 16:05 ` Paolo Bonzini
2024-10-23 17:35 ` Steven Sistare
2024-10-17 15:14 ` [RFC V1 12/14] qtest: " Steve Sistare
2024-10-17 15:14 ` [RFC V1 13/14] net: cleanup for precreate phase Steve Sistare
2024-10-17 15:27 ` Steven Sistare
2024-10-21 19:20 ` Peter Xu
2024-10-23 17:43 ` Steven Sistare
2024-10-17 15:14 ` [RFC V1 14/14] migration: allow commands during precreate and preconfig Steve Sistare
2024-10-21 19:36 ` Peter Xu
2024-10-23 17:50 ` Steven Sistare
2024-10-17 15:19 ` [RFC V1 00/14] precreate phase Steven Sistare
2024-10-17 15:53 ` Peter Xu
2024-10-21 15:56 ` Steven Sistare
2024-10-23 16:31 ` Paolo Bonzini
2024-10-24 21:16 ` Steven Sistare
2024-10-25 8:46 ` Daniel P. Berrangé
2024-10-25 13:33 ` Steven Sistare
2024-10-25 13:43 ` Daniel P. Berrangé
2024-10-25 14:32 ` Steven Sistare
2024-10-25 14:49 ` Daniel P. Berrangé
2024-10-28 21:56 ` Peter Xu
2024-10-29 9:09 ` Daniel P. Berrangé
2024-10-29 11:13 ` Daniel P. Berrangé
2024-10-29 13:20 ` Fabiano Rosas
2024-10-29 15:18 ` Peter Xu
2024-10-29 15:58 ` Daniel P. Berrangé
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=ZxarSUBGD7LpK_v6@x1n \
--to=peterx@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=david@redhat.com \
--cc=eduardo@habkost.net \
--cc=farosas@suse.de \
--cc=marcel.apfelbaum@gmail.com \
--cc=pbonzini@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=steven.sistare@oracle.com \
/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.