From: Eric Blake <eblake@redhat.com>
To: "Marc-André Lureau" <marcandre.lureau@redhat.com>, qemu-devel@nongnu.org
Cc: pbonzini@redhat.com
Subject: Re: [Qemu-devel] [PATCH 15/54] chardev: qom-ify
Date: Wed, 4 Jan 2017 20:30:56 -0600 [thread overview]
Message-ID: <76a23e82-c8be-c8a4-08ad-953b7d185ccc@redhat.com> (raw)
In-Reply-To: <20161212224325.20790-16-marcandre.lureau@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 11300 bytes --]
On 12/12/2016 04:42 PM, Marc-André Lureau wrote:
> Turn Chardev into Object.
>
> qemu_chr_alloc() is replaced by the qemu_chardev_new() constructor. It
> will call qemu_char_open() to open/intialize the chardev with the
> ChardevCommon *backend settings.
>
> The CharDriver::create() callback is turned into a ChardevClass::open()
> which is called from the newly introduced qemu_chardev_open().
>
> "chardev-gdb" and "chardev-hci" are internal chardev and aren't
> creatable directly with -chardev. Use a new internal flag to disable
> them. We may want to use TYPE_USER_CREATABLE interface instead, or
> perhaps allow -chardev usage.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> backends/baum.c | 70 +--
> backends/msmouse.c | 57 ++-
> backends/testdev.c | 34 +-
> gdbstub.c | 33 +-
> hw/bt/hci-csr.c | 54 +-
> monitor.c | 2 +-
> qemu-char.c | 1334 ++++++++++++++++++++++++++-----------------------
> spice-qemu-char.c | 144 +++---
> ui/console.c | 73 +--
> ui/gtk.c | 51 +-
> vl.c | 2 +
> include/sysemu/char.h | 107 ++--
> include/ui/console.h | 2 +
> 13 files changed, 1084 insertions(+), 879 deletions(-)
Big, but probably not possible to break it into many more chunks.
Rearranging the reply, to put the .h first:
> diff --git a/include/sysemu/char.h b/include/sysemu/char.h
> index 384f3ce9b7..1ee8aa4325 100644
> --- a/include/sysemu/char.h
> +++ b/include/sysemu/char.h
> @@ -10,6 +10,7 @@
> #include "qapi/qmp/qstring.h"
> #include "qemu/main-loop.h"
> #include "qemu/bitmap.h"
> +#include "qom/object.h"
>
> /* character device */
>
> @@ -90,7 +91,8 @@ typedef struct CharBackend {
> typedef struct CharDriver CharDriver;
>
> struct Chardev {
> - const CharDriver *driver;
> + Object parent_obj;
> +
> QemuMutex chr_write_lock;
> CharBackend *be;
> char *label;
> @@ -102,18 +104,6 @@ struct Chardev {
> QTAILQ_ENTRY(Chardev) next;
> };
>
>
> +#define TYPE_CHARDEV "chardev"
> +#define CHARDEV(obj) OBJECT_CHECK(Chardev, (obj), TYPE_CHARDEV)
> +#define CHARDEV_CLASS(klass) \
> + OBJECT_CLASS_CHECK(ChardevClass, (klass), TYPE_CHARDEV)
> +#define CHARDEV_GET_CLASS(obj) \
> + OBJECT_GET_CLASS(ChardevClass, (obj), TYPE_CHARDEV)
> +
> +#define TYPE_CHARDEV_NULL "chardev-null"
> +#define TYPE_CHARDEV_MUX "chardev-mux"
> +#define TYPE_CHARDEV_RINGBUF "chardev-ringbuf"
> +#define TYPE_CHARDEV_PTY "chardev-pty"
> +#define TYPE_CHARDEV_CONSOLE "chardev-console"
> +#define TYPE_CHARDEV_STDIO "chardev-stdio"
> +#define TYPE_CHARDEV_PIPE "chardev-pipe"
> +#define TYPE_CHARDEV_MEMORY "chardev-memory"
> +#define TYPE_CHARDEV_PARALLEL "chardev-parallel"
> +#define TYPE_CHARDEV_FILE "chardev-file"
> +#define TYPE_CHARDEV_SERIAL "chardev-serial"
> +#define TYPE_CHARDEV_SOCKET "chardev-socket"
> +#define TYPE_CHARDEV_UDP "chardev-udp"
> +
> +#define CHARDEV_IS_MUX(chr) \
> + object_dynamic_cast(OBJECT(chr), TYPE_CHARDEV_MUX)
> +#define CHARDEV_IS_RINGBUF(chr) \
> + object_dynamic_cast(OBJECT(chr), TYPE_CHARDEV_RINGBUF)
> +#define CHARDEV_IS_PTY(chr) \
> + object_dynamic_cast(OBJECT(chr), TYPE_CHARDEV_PTY)
> +
> +typedef struct ChardevClass {
> + ObjectClass parent_class;
> +
> + bool internal; /* TODO: eventually use TYPE_USER_CREATABLE */
> +
> + void (*open)(Chardev *chr, ChardevBackend *backend,
> + bool *be_opened, Error **errp);
> +
> + int (*chr_write)(Chardev *s, const uint8_t *buf, int len);
> + int (*chr_sync_read)(Chardev *s, const uint8_t *buf, int len);
> + GSource *(*chr_add_watch)(Chardev *s, GIOCondition cond);
> + void (*chr_update_read_handler)(Chardev *s, GMainContext *context);
> + int (*chr_ioctl)(Chardev *s, int cmd, void *arg);
> + int (*get_msgfds)(Chardev *s, int* fds, int num);
> + int (*set_msgfds)(Chardev *s, int *fds, int num);
> + int (*chr_add_client)(Chardev *chr, int fd);
> + int (*chr_wait_connected)(Chardev *chr, Error **errp);
> + void (*chr_free)(Chardev *chr);
> + void (*chr_disconnect)(Chardev *chr);
> + void (*chr_accept_input)(Chardev *chr);
> + void (*chr_set_echo)(Chardev *chr, bool echo);
> + void (*chr_set_fe_open)(Chardev *chr, int fe_open);
> +} ChardevClass;
Looks nice.
On to the .c:
>
> diff --git a/backends/baum.c b/backends/baum.c
> index 7fd1ebc557..80103b6098 100644
> --- a/backends/baum.c
> +++ b/backends/baum.c
> @@ -102,6 +102,9 @@ typedef struct {
> QEMUTimer *cellCount_timer;
> } BaumChardev;
>
> +#define TYPE_CHARDEV_BRAILLE "chardev-braille"
> +#define BAUM_CHARDEV(obj) OBJECT_CHECK(BaumChardev, (obj), TYPE_CHARDEV_BRAILLE)
As mentioned earlier, OBJECT_CHECK() is a nice wrapper around
container_of(), so this indeed resolves my earlier concerns on casts.
> +
> /* Let's assume NABCC by default */
> enum way {
> DOTS2ASCII,
> @@ -268,9 +271,9 @@ static int baum_deferred_init(BaumChardev *baum)
> }
>
> /* The serial port can receive more of our data */
> -static void baum_accept_input(struct Chardev *chr)
> +static void baum_chr_accept_input(struct Chardev *chr)
Why the rename?
> @@ -485,9 +488,9 @@ static int baum_eat_packet(BaumChardev *baum, const uint8_t *buf, int len)
> }
>
> /* The other end is writing some data. Store it and try to interpret */
> -static int baum_write(Chardev *chr, const uint8_t *buf, int len)
> +static int baum_chr_write(Chardev *chr, const uint8_t *buf, int len)
and again
> @@ -544,7 +547,7 @@ static void baum_send_key2(BaumChardev *baum, uint8_t type, uint8_t value,
> /* We got some data on the BrlAPI socket */
> static void baum_chr_read(void *opaque)
> {
If it is for consistency in the baum callback names, maybe a separate
patch is warranted for that part.
> @@ -515,33 +485,98 @@ static void remove_fd_in_watch(Chardev *chr);
> static void mux_chr_set_handlers(Chardev *chr, GMainContext *context);
> static void mux_set_focus(MuxChardev *d, int focus);
>
> -static int null_chr_write(Chardev *chr, const uint8_t *buf, int len)
> +static void qemu_char_open(Chardev *chr, ChardevBackend *backend,
> + bool *be_opened, Error **errp)
> {
> - return len;
> + ChardevClass *cc = CHARDEV_GET_CLASS(chr);
> + /* Any ChardevCommon member would work */
> + ChardevCommon *common = backend ? backend->u.null.data : NULL;
> +
> + if (common && common->has_logfile) {
> + int flags = O_WRONLY | O_CREAT;
> + if (common->has_logappend &&
> + common->logappend) {
> + flags |= O_APPEND;
> + } else {
> + flags |= O_TRUNC;
> + }
> + chr->logfd = qemu_open(common->logfile, flags, 0666);
> + if (chr->logfd < 0) {
> + error_setg_errno(errp, errno,
> + "Unable to open logfile %s",
> + common->logfile);
> + return;
> + }
> + }
> +
> + if (cc->open) {
> + cc->open(chr, backend, be_opened, errp);
> + }
> }
Looking good.
> @@ -1421,19 +1451,15 @@ static Chardev *qemu_chr_open_stdio(const CharDriver *driver,
> act.sa_handler = term_stdio_handler;
> sigaction(SIGCONT, &act, NULL);
>
> - chr = qemu_chr_open_fd(driver, 0, 1, common, errp);
> - if (!chr) {
> - return NULL;
> - }
> + qemu_chr_open_fd(chr, 0, 1);
> +
> if (opts->has_signal) {
> stdio_allow_signal = opts->signal;
> }
> qemu_chr_set_echo_stdio(chr, false);
> -
> - return chr;
> }
>
> -#if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
> +#if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
> || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) \
The change in this #if looks spurious.
> @@ -3905,18 +3925,24 @@ static void qemu_chr_parse_pipe(QemuOpts *opts, ChardevBackend *backend,
>
> static const CharDriver pipe_driver = {
> .kind = CHARDEV_BACKEND_KIND_PIPE,
> - .parse = qemu_chr_parse_pipe, .create = qemu_chr_open_pipe,
> + .parse = qemu_chr_parse_pipe
> +};
nit: As pointed out earlier in the series, I like trailing comma in
struct initializations.
>
> static const CharDriver udp_driver = {
> - .instance_size = sizeof(UdpChardev),
> .kind = CHARDEV_BACKEND_KIND_UDP,
> - .parse = qemu_chr_parse_udp, .create = qmp_chardev_open_udp,
> - .chr_write = udp_chr_write,
> - .chr_update_read_handler = udp_chr_update_read_handler,
> - .chr_free = udp_chr_free,
> + .parse = qemu_chr_parse_udp
> +};
Multiple places
> @@ -5020,33 +5115,44 @@ void qemu_chr_cleanup(void)
>
> static void register_types(void)
> {
> - static const CharDriver *drivers[] = {
> - &null_driver,
> - &socket_driver,
> - &udp_driver,
> - &ringbuf_driver,
> - &file_driver,
> - &stdio_driver,
> + static const struct {
> + const CharDriver *driver;
> + const TypeInfo *type;
> + } chardevs[] = {
> + { &null_driver, &char_null_type_info },
> + { &socket_driver, &char_socket_type_info },
> + { &udp_driver, &char_udp_type_info },
> + { &ringbuf_driver, &char_ringbuf_type_info },
> + { &file_driver, &char_file_type_info },
> + { &stdio_driver, &char_stdio_type_info },
> #ifdef HAVE_CHARDEV_SERIAL
> - &serial_driver,
> + { &serial_driver, &char_serial_type_info },
> #endif
> #ifdef HAVE_CHARDEV_PARPORT
> - ¶llel_driver,
> + { ¶llel_driver, &char_parallel_type_info },
> #endif
> #ifdef HAVE_CHARDEV_PTY
> - &pty_driver,
> + { &pty_driver, &char_pty_type_info },
> #endif
> #ifdef _WIN32
> - &console_driver,
> + { &console_driver, &char_console_type_info },
> #endif
> - &pipe_driver,
> - &mux_driver,
> - &memory_driver
> + { &pipe_driver, &char_pipe_type_info },
> + { &mux_driver, &char_mux_type_info },
> + { &memory_driver, &char_memory_type_info }
> };
> int i;
>
> - for (i = 0; i < ARRAY_SIZE(drivers); i++) {
> - register_char_driver(drivers[i]);
> + type_register_static(&char_type_info);
> +#ifndef _WIN32
> + type_register_static(&char_fd_type_info);
> +#else
> + type_register_static(&char_win_type_info);
> + type_register_static(&char_win_stdio_type_info);
> +#endif
> + for (i = 0; i < ARRAY_SIZE(chardevs); i++) {
> + type_register_static(chardevs[i].type);
> + register_char_driver(chardevs[i].driver);
> }
>
> /* this must be done after machine init, since we register FEs with muxes
> diff --git a/spice-qemu-char.c b/spice-qemu-char.c
So far, looks like a sane conversion. I've run out of review time
today; I'll have to pick up from this file tomorrow.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]
next prev parent reply other threads:[~2017-01-05 2:31 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
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 [this message]
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=76a23e82-c8be-c8a4-08ad-953b7d185ccc@redhat.com \
--to=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).