qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Marc-André Lureau" <mlureau@redhat.com>
To: Eric Blake <eblake@redhat.com>
Cc: "Marc-André Lureau" <marcandre.lureau@redhat.com>,
	qemu-devel@nongnu.org, pbonzini@redhat.com
Subject: Re: [Qemu-devel] [PATCH 03/54] char: use a static array for backends
Date: Mon, 2 Jan 2017 10:33:36 -0500 (EST)	[thread overview]
Message-ID: <1526483008.20362.1483371216010.JavaMail.zimbra@redhat.com> (raw)
In-Reply-To: <b172e4df-b0f5-299e-85f2-c24bbd8deab7@redhat.com>

Hi

----- Original Message -----
> On 12/12/2016 04:42 PM, Marc-André Lureau wrote:
> > Number and kinds of backends is known at compile-time, use a fixed-sized
> > static array to simplify iterations & lookups.
> > 
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >  qemu-char.c           | 101
> >  ++++++++++++++++++++++++++++----------------------
> >  include/sysemu/char.h |   1 +
> >  2 files changed, 58 insertions(+), 44 deletions(-)
> > 
> 
> > @@ -4121,9 +4121,14 @@ CharDriverState *qemu_chr_new_from_opts(QemuOpts
> > *opts,
> >  
> >      if (is_help_option(qemu_opt_get(opts, "backend"))) {
> >          fprintf(stderr, "Available chardev backend types:\n");
> > -        for (i = backends; i; i = i->next) {
> > -            cd = i->data;
> > -            fprintf(stderr, "%s\n", ChardevBackendKind_lookup[cd->kind]);
> > +        for (i = 0; i < ARRAY_SIZE(backends); i++) {
> > +            cd = backends[i];
> > +            if (cd) {
> > +                fprintf(stderr, "%s\n",
> > ChardevBackendKind_lookup[cd->kind]);
> > +                if (cd->alias) {
> > +                    fprintf(stderr, "%s\n", cd->alias);
> > +                }
> > +            }
> 
> Where did cd->alias come from?
> /me reads rest of patch
> Oh, you added it in the .h file. All the more reason to use patch
> ordering to list .h changes first, but may also be worth a mention in
> the commit message that you add an alias field to cover the cases where
> we previously registered a driver twice under two names.

ok

> 
> > 
> > -        cd = i->data;
> > +    cd = NULL;
> > +    for (i = 0; i < ARRAY_SIZE(backends); i++) {
> > +        const char *name = qemu_opt_get(opts, "backend");
> > +        cd = backends[i];
> 
> Please hoist the computation of 'name' outside of the loop...
> 
> > -        if (strcmp(ChardevBackendKind_lookup[cd->kind],
> > -                   qemu_opt_get(opts, "backend")) == 0) {
> > +        if (!cd) {
> > +            continue;
> > +        }
> > +        if (g_str_equal(ChardevBackendKind_lookup[cd->kind], name) ||
> > +            (cd->alias && g_str_equal(cd->alias, name))) {
> 
> Doesn't g_str_equal(NULL, "str") do the right thing without crashing?
> Therefore, no need to check if cd->alias is non-NULL.

No it doesnt, but g_strcmp0 does, let's switch to it.

> 
> >              break;
> >          }
> >      }
> > -    if (i == NULL) {
> > +    if (cd == NULL) {
> >          error_setg(errp, "chardev: backend \"%s\" not found",
> >                     qemu_opt_get(opts, "backend"));
> 
> ...and then reuse 'name' here as well, rather than making multiple
> repeated calls to qemu_opt_get().

ok

> 
> >  ChardevBackendInfoList *qmp_query_chardev_backends(Error **errp)
> >  {
> >      ChardevBackendInfoList *backend_list = NULL;
> > -    CharDriver *c = NULL;
> > -    GSList *i = NULL;
> > +    const CharDriver *c;
> > +    int i;
> >  
> > -    for (i = backends; i; i = i->next) {
> > -        ChardevBackendInfoList *info = g_malloc0(sizeof(*info));
> > -        c = i->data;
> > -        info->value = g_malloc0(sizeof(*info->value));
> > -        info->value->name = g_strdup(ChardevBackendKind_lookup[c->kind]);
> > +    for (i = 0; i < ARRAY_SIZE(backends); i++) {
> > +        c = backends[i];
> > +        if (!c) {
> > +            continue;
> > +        }
> >  
> > -        info->next = backend_list;
> > -        backend_list = info;
> > +        backend_list = qmp_prepend_backend(backend_list, c,
> > +
> > ChardevBackendKind_lookup[c->kind]);
> > +        if (c->alias) {
> > +            backend_list = qmp_prepend_backend(backend_list, c, c->alias);
> 
> The help text now lists aliases immediately after the canonical name,
> while the QMP command now prepends aliases prior to the canonical name.
> It doesn't affect correctness, but should you try to make the two lists
> appear in the same order?  (Presumably by prepending the alias first,
> not second.)
> 

I don't think it matters. Furthermore, this code is temporary, the "char: get rid of CharDriver" patch will use the same function qmp_query_chardev_backends() to build the list with object_class_get_list() order.

> > @@ -4907,16 +4925,11 @@ static void register_types(void)
> >          { .kind = CHARDEV_BACKEND_KIND_STDIO,
> >            .parse = qemu_chr_parse_stdio, .create = qemu_chr_open_stdio },
> >  #if defined HAVE_CHARDEV_SERIAL
> > -        { .kind = CHARDEV_BACKEND_KIND_SERIAL,
> > -          .parse = qemu_chr_parse_serial, .create =
> > qmp_chardev_open_serial },
> > -        { .kind = CHARDEV_BACKEND_KIND_SERIAL,
> > +        { .kind = CHARDEV_BACKEND_KIND_SERIAL, .alias = "tty",
> >            .parse = qemu_chr_parse_serial, .create =
> >            qmp_chardev_open_serial },
> 
> Wait. How did patch 2/54 work? Or did you temporarily break the 'tty'
> alias in that patch, and then fix it here?  All the more reason that my

No, it shouldn't break. There were 2 CharDrivers in case of alias chardev. It uses the "kind" field only to lookup the corresponding name.

> review of 2/54 complaining about getting rid of the cd->name field
> should be a separate patch; now I'm convinced of it.  But in that patch,
> I suggested the order:
> 
> remove cd->name field as redundant with enum array lookup
> convert to struct without cd->name
> 
> Whereas with this patch in the mix, the steps should probably be:
> 
> convert to struct that still has cd->name
> add cd->alias to have multiple names
> remove cd->name field as redundant with enum array lookup
> 

Thus I don't see much point in changing the order.

> >  #endif
> >  #ifdef HAVE_CHARDEV_PARPORT
> > -        { .kind = CHARDEV_BACKEND_KIND_PARALLEL,
> > -          .parse = qemu_chr_parse_parallel,
> > -          .create = qmp_chardev_open_parallel },
> > -        { .kind = CHARDEV_BACKEND_KIND_PARALLEL,
> > +        { .kind = CHARDEV_BACKEND_KIND_PARALLEL, .alias = "parport",
> >            .parse = qemu_chr_parse_parallel,
> >            .create = qmp_chardev_open_parallel },
> 
> Again, another breakage in 2/54.

neither

> 
> >  #endif
> > diff --git a/include/sysemu/char.h b/include/sysemu/char.h
> > index 144514c962..c8750ede21 100644
> > --- a/include/sysemu/char.h
> > +++ b/include/sysemu/char.h
> > @@ -474,6 +474,7 @@ void qemu_chr_set_feature(CharDriverState *chr,
> >  QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename);
> >  
> >  typedef struct CharDriver {
> > +    const char *alias;
> >      ChardevBackendKind kind;
> >      void (*parse)(QemuOpts *opts, ChardevBackend *backend, Error **errp);
> >      CharDriverState *(*create)(const char *id,
> > 
> 
> Overall, I like the direction this is headed in.
> 
> --
> Eric Blake   eblake redhat com    +1-919-301-3266
> Libvirt virtualization library http://libvirt.org
> 
> 

  reply	other threads:[~2017-01-02 15:33 UTC|newest]

Thread overview: 85+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-12 22:42 [Qemu-devel] [PATCH 00/54] WIP: chardev: qom-ify Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 01/54] gtk: avoid oob array access Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 02/54] char: use a const CharDriver Marc-André Lureau
2016-12-13 23:11   ` Eric Blake
2017-01-02 15:33     ` Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 03/54] char: use a static array for backends Marc-André Lureau
2016-12-14 14:52   ` Eric Blake
2017-01-02 15:33     ` Marc-André Lureau [this message]
2016-12-12 22:42 ` [Qemu-devel] [PATCH 04/54] char: move callbacks in CharDriver Marc-André Lureau
2016-12-14 16:02   ` Eric Blake
2017-01-02 15:33     ` Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 05/54] char: fold single-user functions in caller Marc-André Lureau
2016-12-14 16:05   ` Eric Blake
2017-01-02 15:33     ` Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 06/54] char: introduce generic qemu_chr_get_kind() Marc-André Lureau
2016-12-19 21:16   ` Eric Blake
2016-12-12 22:42 ` [Qemu-devel] [PATCH 07/54] char: use a feature bit for replay Marc-André Lureau
2016-12-19 21:58   ` Eric Blake
2016-12-12 22:42 ` [Qemu-devel] [PATCH 08/54] char: allocate CharDriverState as a single object Marc-André Lureau
2017-01-04 20:24   ` Eric Blake
2017-01-04 21:09     ` Marc-André Lureau
2017-01-04 21:15       ` Eric Blake
2016-12-12 22:42 ` [Qemu-devel] [PATCH 09/54] bt: use qemu_chr_alloc() Marc-André Lureau
2017-01-04 21:18   ` Eric Blake
2016-12-12 22:42 ` [Qemu-devel] [PATCH 10/54] char: rename CharDriverState Chardev Marc-André Lureau
2017-01-04 21:30   ` Eric Blake
2016-12-12 22:42 ` [Qemu-devel] [PATCH 11/54] char: rename TCPChardev and NetChardev Marc-André Lureau
2017-01-04 21:55   ` Eric Blake
2016-12-12 22:42 ` [Qemu-devel] [PATCH 12/54] spice-char: improve error reporting Marc-André Lureau
2017-01-04 22:00   ` Eric Blake
2017-01-05 14:03     ` Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 13/54] char: use error_report() Marc-André Lureau
2017-01-04 22:04   ` Eric Blake
2016-12-12 22:42 ` [Qemu-devel] [PATCH 14/54] gtk: overwrite the console.c char driver Marc-André Lureau
2017-01-04 22:26   ` Eric Blake
2016-12-12 22:42 ` [Qemu-devel] [PATCH 15/54] chardev: qom-ify Marc-André Lureau
2017-01-05  2:30   ` Eric Blake
2017-01-05 15:54   ` Eric Blake
2017-01-05 16:20     ` Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 16/54] spice-qemu-char: convert to finalize Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 17/54] baum: " Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 18/54] msmouse: " Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 19/54] mux: " Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 20/54] char-udp: " Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 21/54] char-socket: " Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 22/54] char-pty: " Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 23/54] char-ringbuf: " Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 24/54] char-parallel: convert parallel " Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 25/54] char-stdio: convert " Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 26/54] char-win-stdio: " Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 27/54] char-win: do not override chr_free Marc-André Lureau
2016-12-12 22:42 ` [Qemu-devel] [PATCH 28/54] char-win: convert to finalize Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 29/54] char-fd: " Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 30/54] char: remove chr_free Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 31/54] char: get rid of CharDriver Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 32/54] char: remove class kind field Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 33/54] char: move to chardev/ Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 34/54] char: create chardev-obj-y Marc-André Lureau
2016-12-13 11:10   ` Paolo Bonzini
2016-12-13 12:40     ` Marc-André Lureau
2016-12-13 12:52       ` Paolo Bonzini
2016-12-12 22:43 ` [Qemu-devel] [PATCH 35/54] char: make null_chr_write() the default method Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 36/54] char: move null chardev to its own file Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 37/54] char: move mux " Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 38/54] char: move ringbuf/memory " Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 39/54] char: rename and move to header CHR_READ_BUF_LEN Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 40/54] char: remove unused READ_RETRIES Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 41/54] char: move QIOChannel-related in char-io.h Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 42/54] char: move fd chardev in its own file Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 43/54] char: move win chardev base class " Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 44/54] char: move win-stdio into " Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 45/54] char: move socket chardev to itw " Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 46/54] char: move udp chardev in its " Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 47/54] char: move file " Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 48/54] char: move stdio " Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 49/54] char: move console " Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 50/54] char: move pipe chardev " Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 51/54] char: move pty " Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 52/54] char: move serial chardev to itw " Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 53/54] char: move parallel chardev in its " Marc-André Lureau
2016-12-12 22:43 ` [Qemu-devel] [PATCH 54/54] char: headers clean-up Marc-André Lureau
2016-12-13  0:33 ` [Qemu-devel] [PATCH 00/54] WIP: chardev: qom-ify no-reply
2017-01-02 10:26 ` Paolo Bonzini
2017-01-04 21:20   ` Marc-André Lureau
2017-01-04 21:50     ` Eric Blake

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=1526483008.20362.1483371216010.JavaMail.zimbra@redhat.com \
    --to=mlureau@redhat.com \
    --cc=eblake@redhat.com \
    --cc=marcandre.lureau@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 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).