From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
qemu-block@nongnu.org, berrange@redhat.com,
qemu-devel@nongnu.org, Peter Xu <peterx@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v2 04/11] monitor: Create MonitorHMP with readline state
Date: Wed, 12 Jun 2019 15:10:06 +0100 [thread overview]
Message-ID: <20190612141005.GC2691@work-vm> (raw)
In-Reply-To: <87wohqx5e2.fsf@dusky.pond.sub.org>
* Markus Armbruster (armbru@redhat.com) wrote:
> Kevin Wolf <kwolf@redhat.com> writes:
>
> > Am 12.06.2019 um 11:07 hat Markus Armbruster geschrieben:
> >> Cc: Peter for a monitor I/O thread question.
> >>
> >> Kevin Wolf <kwolf@redhat.com> writes:
> >>
> >> > The ReadLineState in Monitor is only used for HMP monitors. Create
> >> > MonitorHMP and move it there.
> >> >
> >> > Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> >> > Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> >
> >> > @@ -218,6 +210,17 @@ struct Monitor {
> >> > int mux_out;
> >> > };
> >> >
> >> > +struct MonitorHMP {
> >> > + Monitor common;
> >> > + /*
> >> > + * State used only in the thread "owning" the monitor.
> >> > + * If @use_io_thread, this is @mon_iothread.
> >> > + * Else, it's the main thread.
> >> > + * These members can be safely accessed without locks.
> >> > + */
> >> > + ReadLineState *rs;
> >> > +};
> >> > +
> >>
> >> Hmm.
> >>
> >> The monitor I/O thread code makes an effort not to restrict I/O thread
> >> use to QMP, even though we only use it there. Whether the code would
> >> actually work for HMP as well we don't know.
> >>
> >> Readline was similar until your PATCH 02: the code made an effort not to
> >> restrict it to HMP, even though we only use it there. Whether the code
> >> would actually work for QMP as well we don't know.
> >>
> >> Should we stop pretending and hard-code "I/O thread only for QMP"?
> >>
> >> If yes, the comment above gets simplified by the patch that hard-codes
> >> "I/O thread only for QMP".
> >>
> >> If no, we should perhaps point out that we currently don't use an I/O
> >> thread with HMP. The comment above seems like a good place for that.
> >>
> >> Perhaps restricting readline to HMP should be a separate patch before
> >> PATCH 02.
> >
> > Yes, possibly iothreads could be restricted to QMP. It doesn't help me
> > in splitting the monitor in any way, though, so I don't see it within
> > the scope of this series.
>
> That's okay.
>
> Would you mind pointing out we don't actually use an I/O thread with HMP
> in the comment?
>
> > Keeping readline around for QMP, on the other hand, would probably have
> > been harder than making the restriction.
> >
> > As for splitting patch 2, I don't think that reorganising a patch that
> > already does its job and already received review is the most productive
> > thing we could do, but if you insist on a separate patch, I can do that.
>
> No, I don't insist.
>
> >> > @@ -748,12 +754,13 @@ char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,
> >> > int64_t cpu_index, Error **errp)
> >> > {
> >> > char *output = NULL;
> >> > - Monitor *old_mon, hmp;
> >> > + Monitor *old_mon;
> >> > + MonitorHMP hmp = {};
> >>
> >> Any particular reason for adding the initializer?
> >
> > Yes:
> >
> >> >
> >> > - monitor_data_init(&hmp, 0, true, false);
> >> > + monitor_data_init(&hmp.common, 0, true, false);
> >
> > monitor_data_init() does a memset(), but only on hmp.common, so the
> > fields outside of hmp.common would remain uniniitialised. Specifically,
> > hmp.rs wouldn't be initialised to NULL and attempting to free it in the
> > end would crash.
>
> I see.
>
> Drop the superfluous memset() in monitor_data_init() then.
>
> >> > old_mon = cur_mon;
> >> > - cur_mon = &hmp;
> >> > + cur_mon = &hmp.common;
> >> >
> >> > if (has_cpu_index) {
> >> > int ret = monitor_set_cpu(cpu_index);
> >
> >> > @@ -1341,16 +1348,19 @@ static void hmp_info_sync_profile(Monitor *mon, const QDict *qdict)
> >> >
> >> > static void hmp_info_history(Monitor *mon, const QDict *qdict)
> >> > {
> >> > + MonitorHMP *hmp_mon = container_of(mon, MonitorHMP, common);
> >>
> >> Unchecked conversion. Tolerable, I think, since HMP command handlers
> >> generally don't get invoked manually, unlike QMP command handlers.
> >
> > I would like to see all HMP command handlers take MonitorHMP* instead of
> > Monitor*, but that would be a big ugly patch touching everything that
> > isn't really needed for the goal of this series, so I didn't include it.
>
> I consider the MonitorHMP job incomplete without it. But it's Dave's
> turf.
I'd rather see stuff move forward and then fix that later when someone
has the time.
Dave
> > If you consider it valuable to get rid of this container_of(), that's
> > probably the follow-up you could do.
>
> My recent qemu-common.h pull request temporarily cooled my enthusiasm
> for big, ugly patches touching everything...
>
> >> > @@ -4460,6 +4474,7 @@ static void monitor_qmp_event(void *opaque, int event)
> >> > static void monitor_event(void *opaque, int event)
> >> > {
> >> > Monitor *mon = opaque;
> >> > + MonitorHMP *hmp_mon = container_of(cur_mon, MonitorHMP, common);
> >>
> >> Any particular reason for changing from @opaque to @cur_mon?
> >
> > Probably a copy & paste error, thanks for catching it! I'll fix it.
> >
> >> > @@ -4662,11 +4679,11 @@ static void monitor_init_qmp(Chardev *chr, int flags)
> >> >
> >> > static void monitor_init_hmp(Chardev *chr, int flags)
> >> > {
> >> > - Monitor *mon = g_malloc(sizeof(*mon));
> >> > + MonitorHMP *mon = g_malloc0(sizeof(*mon));
> >>
> >> Any particular reason for changing to g_malloc0()?
> >>
> >> You hid the same change for monitor_init_qmp() in PATCH 03, where I
> >> missed it until now.
> >
> > As above, initialising the fields outside mon->common.
> >
> > Kevin
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2019-06-12 14:38 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-11 13:40 [Qemu-devel] [PATCH v2 00/11] monitor: Split monitor.c in core/HMP/QMP/misc Kevin Wolf
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 01/11] monitor: Remove unused password prompting fields Kevin Wolf
2019-06-12 6:43 ` Markus Armbruster
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 02/11] monitor: Split monitor_init in HMP and QMP function Kevin Wolf
2019-06-12 6:12 ` Markus Armbruster
2019-06-12 6:43 ` Markus Armbruster
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 03/11] monitor: Make MonitorQMP a child class of Monitor Kevin Wolf
2019-06-12 7:59 ` Markus Armbruster
2019-06-12 11:28 ` Kevin Wolf
2019-06-12 14:18 ` Markus Armbruster
2019-06-12 8:05 ` [Qemu-devel] [PATCH v2.1 02.5/11] monitor: Restrict use of Monitor member qmp to actual QMP monitors Markus Armbruster
2019-06-12 8:05 ` [Qemu-devel] [PATCH v2.1 03/11] monitor: Make MonitorQMP a child class of Monitor Markus Armbruster
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 04/11] monitor: Create MonitorHMP with readline state Kevin Wolf
2019-06-12 9:07 ` Markus Armbruster
2019-06-12 9:54 ` Peter Xu
2019-06-12 10:03 ` Kevin Wolf
2019-06-12 14:08 ` Markus Armbruster
2019-06-12 14:10 ` Dr. David Alan Gilbert [this message]
2019-06-12 15:03 ` Kevin Wolf
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 05/11] monitor: Move cmd_table to MonitorHMP Kevin Wolf
2019-06-12 11:45 ` Markus Armbruster
2019-06-12 13:55 ` Kevin Wolf
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 06/11] Move monitor.c to monitor/misc.c Kevin Wolf
2019-06-11 15:38 ` Dr. David Alan Gilbert
2019-06-12 11:57 ` Markus Armbruster
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 07/11] monitor: Move {hmp, qmp}.c to monitor/{hmp, qmp}-cmds.c Kevin Wolf
2019-06-11 16:09 ` Dr. David Alan Gilbert
2019-06-12 12:01 ` Markus Armbruster
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 08/11] monitor: Create monitor_int.h with common definitions Kevin Wolf
2019-06-12 12:18 ` Markus Armbruster
2019-06-12 12:43 ` Markus Armbruster
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 09/11] monitor: Split out monitor/qmp.c Kevin Wolf
2019-06-12 13:11 ` Markus Armbruster
2019-06-12 15:25 ` Kevin Wolf
2019-06-13 5:38 ` Markus Armbruster
2019-06-13 14:11 ` Kevin Wolf
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 10/11] monitor: Split out monitor/hmp.c Kevin Wolf
2019-06-12 13:17 ` Markus Armbruster
2019-06-12 15:31 ` Kevin Wolf
2019-06-13 5:44 ` Markus Armbruster
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 11/11] monitor: Split out monitor/monitor.c Kevin Wolf
2019-06-12 13:49 ` Markus Armbruster
2019-06-12 15:51 ` Kevin Wolf
2019-06-11 14:18 ` [Qemu-devel] [PATCH v2 00/11] monitor: Split monitor.c in core/HMP/QMP/misc no-reply
2019-06-11 15:24 ` no-reply
2019-06-12 14:22 ` Markus Armbruster
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=20190612141005.GC2691@work-vm \
--to=dgilbert@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=kwolf@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-block@nongnu.org \
--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 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).