From: Peter Xu <peterx@redhat.com>
To: Eric Blake <eblake@redhat.com>
Cc: qemu-devel@nongnu.org, Stefan Hajnoczi <shajnocz@redhat.com>,
"Daniel P . Berrange" <berrange@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>, Fam Zheng <famz@redhat.com>,
Juan Quintela <quintela@redhat.com>,
mdroth@linux.vnet.ibm.com, Laurent Vivier <lvivier@redhat.com>,
Markus Armbruster <armbru@redhat.com>,
marcandre.lureau@redhat.com,
"Dr . David Alan Gilbert" <dgilbert@redhat.com>
Subject: Re: [Qemu-devel] [RFC v6 07/27] monitor: unify global init
Date: Wed, 10 Jan 2018 16:26:39 +0800 [thread overview]
Message-ID: <20180110082639.GH5984@xz-mi> (raw)
In-Reply-To: <ab1775ac-be60-31cb-3c7c-c698c2adb1e8@redhat.com>
On Tue, Jan 09, 2018 at 05:13:40PM -0600, Eric Blake wrote:
> On 12/19/2017 02:45 AM, Peter Xu wrote:
> > There are many places for monitor init its globals, at least:
>
> Reads awkwardly; maybe:
>
> ...many places where the monitor initializes its globals,...
Fixed.
>
> >
> > - monitor_init_qmp_commands() at the very beginning
> > - single function to init monitor_lock
> > - in the first entry of monitor_init() using "is_first_init"
> >
> > Unify them a bit.
> >
> > Reviewed-by: Fam Zheng <famz@redhat.com>
> > Signed-off-by: Peter Xu <peterx@redhat.com>
> > ---
>
> > +void monitor_init_globals(void)
> > +{
> > + monitor_init_qmp_commands();
> > + monitor_qapi_event_init();
> > + sortcmdlist();
> > + qemu_mutex_init(&monitor_lock);
> > +}
> > +
> > /* These functions just adapt the readline interface in a typesafe way. We
> > * could cast function pointers but that discards compiler checks.
> > */
> > @@ -4074,23 +4082,10 @@ void error_vprintf_unless_qmp(const char *fmt, va_list ap)
> > }
> > }
> >
> > -static void __attribute__((constructor)) monitor_lock_init(void)
> > -{
> > - qemu_mutex_init(&monitor_lock);
> > -}
>
> The later initialization of the monitor_lock mutex is a potential
> semantic change. Please beef up the commit message to document why it
> is safe. In fact, I requested this back on my review of v1, but it
> still hasn't been done. :(
>
> https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg05421.html
Sorry for that! I thought you helped proved that somehow (which I
really appreciate)...
>
> If my read of history is correct, I think it is sufficient to point to
> commit 05875687 as a place where we no longer care about constructor
> semantics because we are no longer dealing with module_call_init(). But
> you may find a better place to point to. You already found that
> d622cb587 was what introduced the constructor in the first place, but I
> didn't spend time today auditing the state of qemu back at that time to
> see if the constructor was really necessary back then or just a
> convenience for lack of a better initialization point.
>
> Alternatively, if you can't find a good commit message to point to, at
> least document how you (and I) tested things, using gdb watchpoints, to
> prove it is a safe delay.
I did that by observing all users of the lock in current repository:
*** monitor.c:
monitor_qmp_response_pop_one[457] qemu_mutex_lock(&monitor_lock);
monitor_qmp_response_pop_one[466] qemu_mutex_unlock(&monitor_lock);
monitor_qapi_event_queue[529] qemu_mutex_lock(&monitor_lock);
monitor_qapi_event_queue[574] qemu_mutex_unlock(&monitor_lock);
monitor_qapi_event_handler[588] qemu_mutex_lock(&monitor_lock);
monitor_qapi_event_handler[604] qemu_mutex_unlock(&monitor_lock);
monitor_qmp_requests_pop_one[4116] qemu_mutex_lock(&monitor_lock);
monitor_qmp_requests_pop_one[4136] qemu_mutex_unlock(&monitor_lock);
monitor_init[4559] qemu_mutex_lock(&monitor_lock);
monitor_init[4561] qemu_mutex_unlock(&monitor_lock);
monitor_cleanup[4596] qemu_mutex_lock(&monitor_lock);
monitor_cleanup[4603] qemu_mutex_unlock(&monitor_lock);
monitor_init() and monitor_cleanup() are called after global init, so
it should be fine (monitor_init() is called right after the global
init).
For the rest of the functions:
monitor_qmp_response_pop_one
monitor_qapi_event_queue
monitor_qapi_event_handler
monitor_qmp_requests_pop_one
AFAIK all of them are called even after monitor_init(), in other
words, they are all after global init too.
As a conclusion, we should be safe here. Again, I may be wrong
somewhere, please correct me if so.
>
> Only if you improve the commit message, you may add:
> Reviewed-by: Eric Blake <eblake@redhat.com>
Besides the English fix, how about I add one more paragraph to talk
about monitor_lock in commit message:
monitor_lock won't be used before monitor_init(). So as long as we
initialize the monitor globals before the first call to
monitor_init(), we will be safe.
With that, could I take your r-b?
Thanks,
>
> > +++ b/vl.c
> > @@ -3099,7 +3099,6 @@ int main(int argc, char **argv, char **envp)
> > qemu_init_exec_dir(argv[0]);
> >
> > module_call_init(MODULE_INIT_QOM);
> > - monitor_init_qmp_commands();
> >
> > qemu_add_opts(&qemu_drive_opts);
> > qemu_add_drive_opts(&qemu_legacy_drive_opts);
> > @@ -4645,6 +4644,12 @@ int main(int argc, char **argv, char **envp)
> > default_drive(default_floppy, snapshot, IF_FLOPPY, 0, FD_OPTS);
> > default_drive(default_sdcard, snapshot, IF_SD, 0, SD_OPTS);
> >
> > + /*
> > + * Note: qtest_enabled() (which used in monitor_qapi_event_init())
>
> s/which/which is/
>
> > + * depend on configure_accelerator() above.
>
> s/depend/depends/
>
> > + */
> > + monitor_init_globals();
> > +
> > if (qemu_opts_foreach(qemu_find_opts("mon"),
> > mon_init_func, NULL, NULL)) {
> > exit(1);
> >
>
> --
> Eric Blake, Principal Software Engineer
> Red Hat, Inc. +1-919-301-3266
> Virtualization: qemu.org | libvirt.org
>
--
Peter Xu
next prev parent reply other threads:[~2018-01-10 8:26 UTC|newest]
Thread overview: 114+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-19 8:45 [Qemu-devel] [RFC v6 00/27] QMP: out-of-band (OOB) execution support Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 01/27] chardev: use backend chr context when watch for fe Peter Xu
2017-12-20 16:40 ` Stefan Hajnoczi
2017-12-25 2:58 ` Peter Xu
2017-12-20 16:40 ` Stefan Hajnoczi
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 02/27] qobject: introduce qstring_get_try_str() Peter Xu
2018-01-09 22:47 ` Eric Blake
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 03/27] qobject: introduce qobject_get_try_str() Peter Xu
2018-01-09 22:50 ` Eric Blake
2018-01-10 7:52 ` Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 04/27] qobject: let object_property_get_str() use new API Peter Xu
2018-01-09 22:53 ` Eric Blake
2018-01-10 7:57 ` Peter Xu
2018-01-10 12:59 ` Eric Blake
2018-01-11 8:17 ` Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 05/27] monitor: move skip_flush into monitor_data_init Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 06/27] monitor: move the cur_mon hack deeper for QMP Peter Xu
2017-12-20 16:42 ` Stefan Hajnoczi
2018-01-09 22:57 ` Eric Blake
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 07/27] monitor: unify global init Peter Xu
2017-12-20 16:42 ` Stefan Hajnoczi
2018-01-09 23:13 ` Eric Blake
2018-01-10 8:26 ` Peter Xu [this message]
2018-01-10 12:54 ` Eric Blake
2018-01-11 8:18 ` Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 08/27] monitor: let mon_list be tail queue Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 09/27] monitor: create monitor dedicate iothread Peter Xu
2017-12-21 6:18 ` Fam Zheng
2018-01-05 16:23 ` Stefan Hajnoczi
2018-01-09 23:31 ` Eric Blake
2018-01-10 8:34 ` Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 10/27] monitor: allow to use IO thread for parsing Peter Xu
2017-12-21 9:34 ` Fam Zheng
2018-01-05 17:22 ` Stefan Hajnoczi
2018-01-12 3:22 ` Peter Xu
2018-08-23 10:55 ` Marc-André Lureau
2018-01-09 23:37 ` Eric Blake
2018-01-12 3:23 ` Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 11/27] qmp: introduce QMPCapability Peter Xu
2017-12-21 9:56 ` Fam Zheng
2017-12-25 3:16 ` Peter Xu
2018-01-08 16:23 ` Stefan Hajnoczi
2018-01-11 23:07 ` Eric Blake
2018-01-12 4:28 ` Peter Xu
2018-01-12 14:10 ` Eric Blake
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 12/27] qmp: negotiate QMP capabilities Peter Xu
2017-12-21 10:01 ` Fam Zheng
2017-12-25 3:18 ` Peter Xu
2018-01-08 16:23 ` Stefan Hajnoczi
2018-01-12 20:57 ` Eric Blake
2018-01-22 7:29 ` Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 13/27] monitor: introduce monitor_qmp_respond() Peter Xu
2018-01-08 16:25 ` Stefan Hajnoczi
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 14/27] monitor: let suspend_cnt be thread safe Peter Xu
2018-01-12 21:48 ` Eric Blake
2018-01-22 7:43 ` Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 15/27] monitor: let suspend/resume work even with QMPs Peter Xu
2017-12-21 11:27 ` Fam Zheng
2017-12-25 3:26 ` Peter Xu
2018-01-08 16:49 ` Stefan Hajnoczi
2018-01-12 4:51 ` Peter Xu
2018-01-12 14:28 ` Stefan Hajnoczi
2018-01-22 7:56 ` Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 16/27] monitor: separate QMP parser and dispatcher Peter Xu
2017-12-21 11:40 ` Fam Zheng
2017-12-25 5:14 ` Peter Xu
2018-01-08 17:09 ` Stefan Hajnoczi
2018-01-12 6:05 ` Peter Xu
2018-01-12 14:22 ` Stefan Hajnoczi
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 17/27] qmp: add new event "command-dropped" Peter Xu
2017-12-21 11:29 ` Fam Zheng
2018-01-09 13:20 ` Stefan Hajnoczi
2018-01-12 6:09 ` Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 18/27] monitor: send event when command queue full Peter Xu
2017-12-21 11:42 ` Fam Zheng
2017-12-25 5:18 ` Peter Xu
2017-12-25 5:55 ` Fam Zheng
2017-12-25 6:18 ` Peter Xu
2017-12-25 7:13 ` Fam Zheng
2017-12-25 7:22 ` Peter Xu
2018-01-09 13:30 ` Stefan Hajnoczi
2018-01-09 13:42 ` Stefan Hajnoczi
2018-01-12 4:59 ` Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 19/27] qapi: introduce new cmd option "allow-oob" Peter Xu
2017-12-21 11:45 ` Fam Zheng
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 20/27] qmp: export qmp_dispatch_check_obj and allow "id" Peter Xu
2017-12-21 11:46 ` Fam Zheng
2018-01-09 13:45 ` Stefan Hajnoczi
2018-01-12 6:16 ` Peter Xu
2018-01-12 14:20 ` Stefan Hajnoczi
2018-01-22 8:42 ` Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 21/27] qmp: support out-of-band (oob) execution Peter Xu
2017-12-21 11:54 ` Fam Zheng
2018-01-09 14:08 ` Stefan Hajnoczi
2018-01-12 6:23 ` Peter Xu
2018-01-12 14:18 ` Stefan Hajnoczi
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 22/27] qmp: isolate responses into io thread Peter Xu
2017-12-21 12:57 ` Fam Zheng
2017-12-25 5:20 ` Peter Xu
2018-01-09 14:24 ` Stefan Hajnoczi
2018-01-12 6:44 ` Peter Xu
2018-01-12 14:16 ` Stefan Hajnoczi
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 23/27] monitor: enable IO thread for (qmp & !mux) typed Peter Xu
2017-12-21 12:57 ` Fam Zheng
2018-01-09 14:24 ` Stefan Hajnoczi
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 24/27] qmp: add command "x-oob-test" Peter Xu
2017-12-21 12:58 ` Fam Zheng
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 25/27] docs: update QMP documents for OOB commands Peter Xu
2018-01-09 14:52 ` Stefan Hajnoczi
2018-01-12 6:54 ` Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 26/27] tests: qmp-test: verify command batching Peter Xu
2017-12-19 8:45 ` [Qemu-devel] [RFC v6 27/27] tests: qmp-test: add oob test Peter Xu
2018-01-09 14:52 ` [Qemu-devel] [RFC v6 00/27] QMP: out-of-band (OOB) execution support Stefan Hajnoczi
2018-01-10 4:48 ` Peter Xu
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=20180110082639.GH5984@xz-mi \
--to=peterx@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eblake@redhat.com \
--cc=famz@redhat.com \
--cc=lvivier@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=shajnocz@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).