On 22/10/2016 11:53, Marc-André Lureau wrote: > - if (chr->chr_can_read || chr->chr_read || > - chr->chr_event || chr->handler_opaque) { > + if (chr->be) { > error_setg(errp, "Chardev '%s' is busy", id);
This doesn't work with the mux chardev. To some extent a preexisting bug, but made worse by this patch. But it can be fixed easily: diff --git a/qemu-char.c b/qemu-char.c index b9330f3..6dd779f 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -915,6 +915,16 @@ unavailable: return false; } +static bool qemu_chr_is_busy(CharDriverState *s) +{ + if (s->is_mux) { + MuxDriver *d = s->opaque; + return d->mux_cnt >= 0; + } else { + return s->be != NULL; + } +} + void qemu_chr_fe_deinit(CharBackend *b) { assert(b); @@ -4807,7 +4817,7 @@ void qmp_chardev_remove(const char *id, Error **errp) error_setg(errp, "Chardev '%s' not found", id); return; } - if (chr->be) { + if (qemu_chr_is_busy(chr)) { error_setg(errp, "Chardev '%s' is busy", id); return; }