Skip to content

Commit

Permalink
ivshmem: Require master to have ID zero
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Marc-André Lureau <[email protected]>
Message-Id: <[email protected]>
  • Loading branch information
Markus Armbruster committed Mar 21, 2016
1 parent 13fd2cb commit 62a830b
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 0 deletions.
2 changes: 2 additions & 0 deletions docs/specs/ivshmem-spec.txt
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,8 @@ For each new client that connects to the server, the server
- sends interrupt setup messages to the new client (these contain file
descriptors for receiving interrupts).

The first client to connect to the server receives ID zero.

When a client disconnects from the server, the server sends disconnect
notifications to the other clients.

Expand Down
6 changes: 6 additions & 0 deletions hw/misc/ivshmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
5 changes: 5 additions & 0 deletions qemu-doc.texi
Original file line number Diff line number Diff line change
Expand Up @@ -1295,12 +1295,17 @@ When using the server, the guest will be assigned a VM ID (>=0) that allows gues
using the same server to communicate via interrupts. Guests can read their
VM ID from a device register (see ivshmem-spec.txt).

@subsubsection Migration with ivshmem

With device property @option{master=on}, the guest will copy the shared
memory on migration to the destination host. With @option{master=off},
the guest will not be able to migrate with the device attached. In the
latter case, the device should be detached and then reattached after
migration using the PCI hotplug support.

At most one of the devices sharing the same memory can be master. The
master must complete migration before you plug back the other devices.

@subsubsection ivshmem and hugepages

Instead of specifying the <shm size> using POSIX shm, you may specify
Expand Down

0 comments on commit 62a830b

Please sign in to comment.