On 06/15/2015 08:33 AM, Luyao Huang wrote:
When hot-plug a memory device, we don't check if there
is a memory device have the same address with the memory device
we want hot-pluged. Qemu forbid use/hot-plug 2 memory device
with same slot or the same base(qemu side this elemnt named addr).
Introduce a address check when build memory device qemu command line.
Signed-off-by: Luyao Huang <lhuang(a)redhat.com>
---
NOTE: Used the following for commit message:
qemu: Add a check for slot and base dimm address conflicts
When hotplugging a memory device, there wasn't a check to determine
if there is a conflict with the address space being used by the to
be added memory device and any existing device which is disallowed by qemu.
This patch adds a check to ensure the new device address doesn't
conflict with any existing device.
v3:
rename qemuBuildMemoryDeviceAddr to qemuCheckMemoryDimmConflict and
remove the refactor.
src/qemu/qemu_command.c | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
ACK
Adjusted patch as shown below and pushed.
John
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 0a6d92f..d3f0a23 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4952,6 +4952,40 @@ qemuBuildMemoryDimmBackendStr(virDomainMemoryDefPtr mem,
}
+static bool
+qemuCheckMemoryDimmConflict(virDomainDefPtr def,
+ virDomainMemoryDefPtr mem)
+{
+ size_t i;
+
+ for (i = 0; i < def->nmems; i++) {
+ virDomainMemoryDefPtr tmp = def->mems[i];
+
+ if (tmp == mem ||
+ tmp->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM)
+ continue;
+
+ if (mem->info.addr.dimm.slot == tmp->info.addr.dimm.slot) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("memory device slot '%u' is already
being"
+ " used by another memory device"),
Placed space at end of first line rather than at the beginning of the
appended string (eg "...being " and "used by...")
+ mem->info.addr.dimm.slot);
+ return true;
+ }
+
+ if (mem->info.addr.dimm.base != 0 && tmp->info.addr.dimm.base !=
0 &&
+ mem->info.addr.dimm.base == tmp->info.addr.dimm.base) {
Used:
if (mem->info.addr.dimm.base != 0 &&
mem->info.addr.dimm.base == tmp->info.addr.dimm.base) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("memory device base '0x%llx' is already
being"
+ " used by another memory device"),
Similar space adjustment here
+ mem->info.addr.dimm.base);
+ return true;
+ }
+ }
+
+ return false;
+}
+
char *
qemuBuildMemoryDeviceStr(virDomainMemoryDefPtr mem,
virDomainDefPtr def,
@@ -4993,6 +5027,9 @@ qemuBuildMemoryDeviceStr(virDomainMemoryDefPtr mem,
mem->targetNode, mem->info.alias, mem->info.alias);
if (mem->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM) {
+ if (qemuCheckMemoryDimmConflict(def, mem))
+ return NULL;
+
virBufferAsprintf(&buf, ",slot=%d",
mem->info.addr.dimm.slot);
virBufferAsprintf(&buf, ",addr=%llu",
mem->info.addr.dimm.base);
}