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@xxxxxxxxxx> > --- 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); > } > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list