[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 37/38] ivshmem: Require master to have ID zero
From: |
Markus Armbruster |
Subject: |
[Qemu-devel] [PATCH 37/38] ivshmem: Require master to have ID zero |
Date: |
Mon, 29 Feb 2016 19:40:53 +0100 |
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 <address@hidden>
---
docs/specs/ivshmem-spec.txt | 2 ++
hw/misc/ivshmem.c | 6 ++++++
qemu-doc.texi | 5 +++++
3 files changed, 13 insertions(+)
diff --git a/docs/specs/ivshmem-spec.txt b/docs/specs/ivshmem-spec.txt
index 047dfc0..b062acd 100644
--- a/docs/specs/ivshmem-spec.txt
+++ b/docs/specs/ivshmem-spec.txt
@@ -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.
diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
index f6fce15..9a292e5 100644
--- a/hw/misc/ivshmem.c
+++ b/hw/misc/ivshmem.c
@@ -869,6 +869,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);
diff --git a/qemu-doc.texi b/qemu-doc.texi
index 0dd01c7..79141d3 100644
--- a/qemu-doc.texi
+++ b/qemu-doc.texi
@@ -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).
address@hidden 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
--
2.4.3
- [Qemu-devel] [PATCH 21/38] ivshmem: Disentangle ivshmem_read(), (continued)
- [Qemu-devel] [PATCH 21/38] ivshmem: Disentangle ivshmem_read(), Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 32/38] qdev: New DEFINE_PROP_ON_OFF_AUTO, Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 26/38] ivshmem: Drop the hackish test for UNIX domain chardev, Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 19/38] ivshmem: Assert interrupts are set up once, Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 28/38] ivshmem: Tighten check of property "size", Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 30/38] ivshmem: Simplify memory regions for BAR 2 (shared memory), Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 38/38] contrib/ivshmem-server: Print "not for production" warning, Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 25/38] ivshmem: Rely on server sending the ID right after the version, Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 04/38] tests/libqos/pci-pc: Fix qpci_pc_iomap() to map BARs aligned, Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 08/38] ivshmem: Rewrite specification document, Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 37/38] ivshmem: Require master to have ID zero,
Markus Armbruster <=
- [Qemu-devel] [PATCH 36/38] ivshmem: Drop ivshmem property x-memdev, Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 24/38] ivshmem: Propagate errors through ivshmem_recv_setup(), Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 23/38] ivshmem: Receive shared memory synchronously in realize(), Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 18/38] ivshmem: Leave INTx alone when using MSI-X, Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 31/38] ivshmem: Inline check_shm_size() into its only caller, Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 35/38] ivshmem: Clean up after the previous commit, Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 29/38] ivshmem: Implement shm=... with a memory backend, Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 27/38] ivshmem: Simplify how we cope with short reads from server, Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 17/38] ivshmem: Clean up MSI-X conditions, Markus Armbruster, 2016/02/29
- [Qemu-devel] [PATCH 20/38] ivshmem: Simplify rejection of invalid peer ID from server, Markus Armbruster, 2016/02/29