[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 7/7] chardev: add hotplug support.
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH 7/7] chardev: add hotplug support. |
Date: |
Fri, 12 Oct 2012 11:40:28 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121009 Thunderbird/16.0 |
Il 12/10/2012 11:26, Gerd Hoffmann ha scritto:
> This patch adds chardev_add and chardev_del monitor commands.
>
> chardev_del is pretty straight forward, it just takes an id argument and
> zaps the chardev specified.
>
> chardev_add is more tricky as there are tons of arguments for the
> different backends. The hmp version limited to the most common use
> cases, especially when it comes to sockets: You can only specify port
> (tcp) or path (unix) and qemu will create a listening socket. For
> example this ...
>
> (qemu) chardev_add foo socket 42
>
> ... will do the same as ...
>
> -chardev socket,id=foo,port=42,server,nowait
Why not
chardev_add socket,id=foo,port=42,server,nowait
?
> +{ 'command': 'chardev_add', 'data': {'id' : 'str',
> + 'backend' : 'str',
> + 'path' : 'str',
> + 'name' : 'str',
> + 'host' : 'str',
> + 'port' : 'str',
You cannot pass NULLs via QMP, so these need to be optional.
I suggest that you implement the commands in a similar way as netdev_add.
Paolo
> + 'server' : 'bool',
> + 'wait' : 'bool',
> + 'ipv4' : 'bool',
> + 'ipv6' : 'bool',
> + 'telnet' : 'bool' } }
> +
> +##
> +# @chardev_del:
> +#
> +# Remove a chardev
> +#
> +# @id: the chardev's ID, must exist and not be in use
> +#
> +# Returns: Nothing on success
> +#
> +# Since: 1.3.0
> +##
> +{ 'command': 'chardev_del', 'data': {'id': 'str'} }
> diff --git a/qemu-char.c b/qemu-char.c
> index b082bae..2f9d860 100644
> --- a/qemu-char.c
> +++ b/qemu-char.c
> @@ -2900,3 +2900,77 @@ CharDriverState *qemu_char_get_next_serial(void)
> return serial_hds[next_serial++];
> }
>
> +void qmp_chardev_add(const char *id, const char *backend,
> + const char *path, const char *name,
> + const char *host, const char *port,
> + bool server, bool wait,
> + bool ipv4, bool ipv6,
> + bool telnet, Error **errp)
> +{
> + CharDriverState *chr;
> + QemuOpts *opts;
> +
> + chr = qemu_chr_find(id);
> + if (NULL != chr) {
> + error_setg(errp, "Chardev id '%s' exists already\n", id);
> + return;
> + }
> +
> + opts = qemu_opts_create(qemu_find_opts("chardev"), id, 1, errp);
> + if (error_is_set(errp)) {
> + return;
> + }
> + qemu_opt_set(opts, "backend", backend);
> + if (path) {
> + qemu_opt_set(opts, "path", path);
> + }
> + if (name) {
> + qemu_opt_set(opts, "name", name);
> + }
> + if (host) {
> + qemu_opt_set(opts, "host", host);
> + }
> + if (port) {
> + qemu_opt_set(opts, "port", port);
> + }
> + if (server) {
> + qemu_opt_set(opts, "server", "on");
> + }
> + if (!wait) {
> + qemu_opt_set(opts, "wait", "off");
> + }
> + if (ipv4) {
> + qemu_opt_set(opts, "ipv4", "on");
> + }
> + if (ipv6) {
> + qemu_opt_set(opts, "ipv6", "on");
> + }
> + if (telnet) {
> + qemu_opt_set(opts, "telnet", "on");
> + }
> +
> + chr = qemu_chr_new_from_opts(opts, NULL);
> + qemu_opts_del(opts);
> +
> + if (chr == NULL) {
> + error_setg(errp, "Creating chardev failed\n");
> + return;
> + }
> +}
> +
> +void qmp_chardev_del(const char *id, Error **errp)
> +{
> + CharDriverState *chr;
> +
> + chr = qemu_chr_find(id);
> + if (NULL == chr) {
> + error_setg(errp, "Chardev '%s' not found\n", id);
> + return;
> + }
> + if (chr->chr_can_read || chr->chr_read ||
> + chr->chr_event || chr->handler_opaque) {
> + error_setg(errp, "Chardev '%s' is busy\n", id);
> + return;
> + }
> + qemu_chr_delete(chr);
> +}
> diff --git a/qmp-commands.hx b/qmp-commands.hx
> index 2f8477e..b904df2 100644
> --- a/qmp-commands.hx
> +++ b/qmp-commands.hx
> @@ -2576,3 +2576,64 @@ EQMP
> .args_type = "",
> .mhandler.cmd_new = qmp_marshal_input_query_target,
> },
> +
> + {
> + .name = "chardev_add",
> + .args_type = "",
> + .mhandler.cmd_new = qmp_marshal_input_chardev_add,
> + },
> +
> +SQMP
> +chardev_add
> +-----------
> +
> +Add a chardev.
> +
> +Arguments:
> +
> +- "id": the chardev's ID, must be unique (json-string)
> +- "backend": the chardev backend: "file", "socket", ... (json-string)
> +- "path": file / device / unix socket path (json-string, optional)
> +- "name": spice channel name (json-string, optional)
> +- "host": host name (json-string, optional)
> +- "port": port number (json-string, optional)
> +- "server": create socket in server mode (json-bool, optional)
> +- "wait": wait for connect (json-bool, optional)
> +- "ipv4": force ipv4-only (json-bool, optional)
> +- "ipv6": force ipv6-only (json-bool, optional)
> +- "telnet": telnet negotiation (json-bool, optional)
> +
> +Example:
> +
> +-> { "execute": "chardev_add", "arguments": { "id" : "foo",
> + "backend" : "socket",
> + "path" : "/tmp/foo",
> + "server" : "on",
> + "wait" : "off" } }
> +<- { "return": {} }
> +
> +EQMP
> +
> + {
> + .name = "chardev_del",
> + .args_type = "",
> + .mhandler.cmd_new = qmp_marshal_input_chardev_del,
> + },
> +
> +
> +SQMP
> +chardev_del
> +-----------
> +
> +Remove a chardev.
> +
> +Arguments:
> +
> +- "id": the chardev's ID, must exist and not be in use (json-string)
> +
> +Example:
> +
> +-> { "execute": "chardev_del", "arguments": { "id" : "foo" } }
> +<- { "return": {} }
> +
> +EQMP
>
- [Qemu-devel] [PULL 0/7] serial device hotplug patch series., Gerd Hoffmann, 2012/10/12
- [Qemu-devel] [PATCH 5/7] usb-serial: don't magically zap chardev on umplug, Gerd Hoffmann, 2012/10/12
- [Qemu-devel] [PATCH 7/7] chardev: add hotplug support., Gerd Hoffmann, 2012/10/12
- Re: [Qemu-devel] [PATCH 7/7] chardev: add hotplug support.,
Paolo Bonzini <=
- Re: [Qemu-devel] [PATCH 7/7] chardev: add hotplug support., Gerd Hoffmann, 2012/10/12
- Re: [Qemu-devel] [PATCH 7/7] chardev: add hotplug support., Paolo Bonzini, 2012/10/12
- Re: [Qemu-devel] [PATCH 7/7] chardev: add hotplug support., Gerd Hoffmann, 2012/10/12
- Re: [Qemu-devel] [PATCH 7/7] chardev: add hotplug support., Paolo Bonzini, 2012/10/12
- Re: [Qemu-devel] [PATCH 7/7] chardev: add hotplug support., Gerd Hoffmann, 2012/10/12
- [Qemu-devel] [PATCH v2] chardev: add hotplug support., Gerd Hoffmann, 2012/10/12
- Re: [Qemu-devel] [PATCH v2] chardev: add hotplug support., Gerd Hoffmann, 2012/10/12
- Re: [Qemu-devel] [PATCH v2] chardev: add hotplug support., Paolo Bonzini, 2012/10/12
- Re: [Qemu-devel] [PATCH v2] chardev: add hotplug support., Paolo Bonzini, 2012/10/12
- Re: [Qemu-devel] [PATCH v2] chardev: add hotplug support., Lei Li, 2012/10/15