From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> Technically speaking we should wait until we receive the QMP greeting message before attempting to send any QMP monitor commands. Mostly we've got away with this, but there is a race in some QEMU which cause it to SEGV if you sent it data too soon after startup. Waiting for the QMP greeting avoids the race Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> --- src/qemu/qemu_monitor.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 290f150..fb67b9a 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -79,6 +79,7 @@ struct _qemuMonitor { unsigned json: 1; unsigned json_hmp: 1; + unsigned wait_greeting: 1; }; static virClassPtr qemuMonitorClass; @@ -365,6 +366,9 @@ qemuMonitorIOProcess(qemuMonitorPtr mon) if (len < 0) return -1; + if (len && mon->wait_greeting) + mon->wait_greeting = 0; + if (len < mon->bufferOffset) { memmove(mon->buffer, mon->buffer + len, mon->bufferOffset - len); mon->bufferOffset -= len; @@ -538,7 +542,8 @@ static void qemuMonitorUpdateWatch(qemuMonitorPtr mon) if (mon->lastError.code == VIR_ERR_OK) { events |= VIR_EVENT_HANDLE_READABLE; - if (mon->msg && mon->msg->txOffset < mon->msg->txLength) + if ((mon->msg && mon->msg->txOffset < mon->msg->txLength) && + !mon->wait_greeting) events |= VIR_EVENT_HANDLE_WRITABLE; } @@ -716,6 +721,8 @@ qemuMonitorOpen(virDomainObjPtr vm, mon->fd = -1; mon->vm = vm; mon->json = json; + if (json) + mon->wait_greeting = 1; mon->cb = cb; qemuMonitorLock(mon); -- 1.7.11.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list