From 62a830b688a93419baa89061b6b5faf8b5e10808 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Tue, 15 Mar 2016 19:34:54 +0100 Subject: ivshmem: Require master to have ID zero MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migration with ivshmem needs to be carefully orchestrated to work. Exactly one peer (the "master") migrates to the destination, all other peers need to unplug (and disconnect), migrate, plug back (and reconnect). This is sort of documented in qemu-doc. If peers connect on the destination before migration completes, the shared memory can get messed up. This isn't documented anywhere. Fix that in qemu-doc. To avoid messing up register IVPosition on migration, the server must assign the same ID on source and destination. ivshmem-spec.txt leaves ID assignment unspecified, however. Amend ivshmem-spec.txt to require the first client to receive ID zero. The example ivshmem-server complies: it always assigns the first unused ID. For a bit of additional safety, enforce ID zero for the master. This does nothing when we're not using a server, because the ID is zero for all peers then. Signed-off-by: Markus Armbruster Reviewed-by: Marc-André Lureau Message-Id: <1458066895-20632-40-git-send-email-armbru@redhat.com> --- hw/misc/ivshmem.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'hw/misc/ivshmem.c') diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c index 455206059f..132387f04b 100644 --- a/hw/misc/ivshmem.c +++ b/hw/misc/ivshmem.c @@ -887,6 +887,12 @@ static void ivshmem_common_realize(PCIDevice *dev, Error **errp) return; } + if (s->master == ON_OFF_AUTO_ON && s->vm_id != 0) { + error_setg(errp, + "master must connect to the server before any peers"); + return; + } + qemu_chr_add_handlers(s->server_chr, ivshmem_can_receive, ivshmem_read, NULL, s); -- cgit v1.2.3