[libvirt] [PATCHv3] qemu: add a check for slot and base when build dimm address
John Ferlan
jferlan at redhat.com
Thu Jun 18 12:12:18 UTC 2015
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 at 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);
> }
>
More information about the libvir-list
mailing list