| Submitter | Gerd Hoffmann |
|---|---|
| Date | Jan. 7, 2013, 1:55 p.m. |
| Message ID | <1357566928-25361-5-git-send-email-kraxel@redhat.com> |
| Download | mbox | patch |
| Permalink | /patch/209927/ |
| State | New |
| Headers | show |
Comments
On 01/07/2013 06:55 AM, Gerd Hoffmann wrote: > Add chardev-add and chardev-remove qmp commands. Hotplugging > a null chardev is supported for now, more will be added later. > > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> > --- > qapi-schema.json | 32 ++++++++++++++++++++++++++++++++ q> qemu-char.c | 39 +++++++++++++++++++++++++++++++++++++++ > qmp-commands.hx | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 121 insertions(+), 0 deletions(-) > +## > +# @chardev-add: > +# > +# Add a file chardev > +# > +# @id: the chardev's ID, must be unique > +# @backend: backend type and parameters > +# > +# Returns: Nothing on success > +# > +# Since: 1.4 > +## > +{ 'type': 'ChardevDummy', 'data': { } } > + > +{ 'union': 'ChardevBackend', 'data': { 'null' : 'ChardevDummy' } } Don't we usually document types independently from their usage, so that they aren't appearing in between the documentation for chardev-add and its actual implementation? > + > +{ 'command': 'chardev-add', 'data': {'id' : 'str', > + 'backend' : 'ChardevBackend' } } > + > +SQMP > +chardev-add > +---------------- > + > +Add a chardev. > + > +Arguments: > + > +- "id": the chardev's ID, must be unique (json-string) > +- "backend": chardev backend type + parameters > + > +Example: > + > +-> { "execute" : "chardev-add", > + "arguments" : { "id" : "foo", > + FIXME } } > +<- { "return": {} } Let's get that FIXME dealt with: -> { "execute" : "chardev-add", "arguments" : { "id" : "foo", "backend" : { "type" : "null" } } } <- { "return": {} } if I'm reading the spec correctly. Or does it have to be more verbose? -> { "execute" : "chardev-add", "arguments" : { "id" : "foo", "backend" : { "type" : "null", "data" : {} } } } <- { "return": {} }
Hi, >> +-> { "execute" : "chardev-add", + "arguments" : { "id" : >> "foo", + FIXME } } +<- { "return": {} } > > Let's get that FIXME dealt with: > > -> { "execute" : "chardev-add", "arguments" : { "id" : "foo", > "backend" : { "type" : "null" } } } <- { "return": {} } > > if I'm reading the spec correctly. Or does it have to be more > verbose? > > -> { "execute" : "chardev-add", "arguments" : { "id" : "foo", > "backend" : { "type" : "null", "data" : {} } } } <- { "return": {} > } I've tested with the long form, dunno whenever the qemu marshaller also accepts the short one. cheers, Gerd
Patch
diff --git a/qapi-schema.json b/qapi-schema.json index 5dfa052..e3f0d44 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -3017,3 +3017,35 @@ # Since: 1.3.0 ## { 'command': 'nbd-server-stop' } + +## +# @chardev-add: +# +# Add a file chardev +# +# @id: the chardev's ID, must be unique +# @backend: backend type and parameters +# +# Returns: Nothing on success +# +# Since: 1.4 +## +{ 'type': 'ChardevDummy', 'data': { } } + +{ 'union': 'ChardevBackend', 'data': { 'null' : 'ChardevDummy' } } + +{ 'command': 'chardev-add', 'data': {'id' : 'str', + 'backend' : 'ChardevBackend' } } + +## +# @chardev-remove: +# +# Remove a chardev +# +# @id: the chardev's ID, must exist and not be in use +# +# Returns: Nothing on success +# +# Since: 1.4 +## +{ 'command': 'chardev-remove', 'data': {'id': 'str'} } diff --git a/qemu-char.c b/qemu-char.c index c511de3..c9ae8f3 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -2938,3 +2938,42 @@ CharDriverState *qemu_char_get_next_serial(void) return serial_hds[next_serial++]; } +void qmp_chardev_add(const char *id, ChardevBackend *backend, Error **errp) +{ + CharDriverState *chr; + + switch (backend->kind) { + case CHARDEV_BACKEND_KIND_NULL: + chr = qemu_chr_open_null(NULL); + break; + default: + error_setg(errp, "unknown chardev backend (%d)", backend->kind); + return; + } + + if (chr == NULL) { + error_setg(errp, "Failed to create chardev"); + } + if (chr) { + chr->label = g_strdup(id); + chr->avail_connections = 1; + QTAILQ_INSERT_TAIL(&chardevs, chr, next); + } +} + +void qmp_chardev_remove(const char *id, Error **errp) +{ + CharDriverState *chr; + + chr = qemu_chr_find(id); + if (NULL == chr) { + error_setg(errp, "Chardev '%s' not found", id); + return; + } + if (chr->chr_can_read || chr->chr_read || + chr->chr_event || chr->handler_opaque) { + error_setg(errp, "Chardev '%s' is busy", id); + return; + } + qemu_chr_delete(chr); +} diff --git a/qmp-commands.hx b/qmp-commands.hx index 5c692d0..11d5a1b 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -2654,3 +2654,53 @@ EQMP .args_type = "", .mhandler.cmd_new = qmp_marshal_input_query_target, }, + + { + .name = "chardev-add", + .args_type = "id:s,backend:q", + .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": chardev backend type + parameters + +Example: + +-> { "execute" : "chardev-add", + "arguments" : { "id" : "foo", + FIXME } } +<- { "return": {} } + +EQMP + + { + .name = "chardev-remove", + .args_type = "id:s", + .mhandler.cmd_new = qmp_marshal_input_chardev_remove, + }, + + +SQMP +chardev-remove +-------------- + +Remove a chardev. + +Arguments: + +- "id": the chardev's ID, must exist and not be in use (json-string) + +Example: + +-> { "execute": "chardev-remove", "arguments": { "id" : "foo" } } +<- { "return": {} } + +EQMP
Add chardev-add and chardev-remove qmp commands. Hotplugging a null chardev is supported for now, more will be added later. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- qapi-schema.json | 32 ++++++++++++++++++++++++++++++++ qemu-char.c | 39 +++++++++++++++++++++++++++++++++++++++ qmp-commands.hx | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+), 0 deletions(-)