[libvirt] [RFC PATCH 06/12] qemu: memdev: Add infrastructure to load memory device information
John Ferlan
jferlan at redhat.com
Wed Feb 4 19:23:34 UTC 2015
On 01/30/2015 08:21 AM, Peter Krempa wrote:
> When using 'acpi-dimm' memory devices with qemu, some of the information
> like the slot number and base address need to be reloaded from qemu
> after process start so that it reflects the actual state. The state then
> allows to use memory devices across migrations.
> ---
> src/qemu/qemu_domain.c | 43 ++++++++++++++++
> src/qemu/qemu_domain.h | 4 ++
> src/qemu/qemu_monitor.c | 45 +++++++++++++++++
> src/qemu/qemu_monitor.h | 14 ++++++
> src/qemu/qemu_monitor_json.c | 116 +++++++++++++++++++++++++++++++++++++++++++
> src/qemu/qemu_monitor_json.h | 5 ++
> src/qemu/qemu_process.c | 4 ++
> 7 files changed, 231 insertions(+)
>
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 25540c4..df912a6 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -2773,6 +2773,49 @@ qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
> return 0;
> }
>
> +
> +int
> +qemuDomainUpdateMemoryDeviceInfo(virQEMUDriverPtr driver,
> + virDomainObjPtr vm,
> + int asyncJob)
> +{
> + qemuDomainObjPrivatePtr priv = vm->privateData;
> + virHashTablePtr meminfo = NULL;
> + size_t i;
> +
> + if (vm->def->nmems == 0)
> + return 0;
> +
> + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
> + return -1;
> + if (qemuMonitorGetMemoryDeviceInfo(priv->mon, &meminfo) < 0) {
> + ignore_value(qemuDomainObjExitMonitor(driver, vm));
> + return -1;
> + }
> +
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
This would leak meminfo
> + return -1;
> +
I know we don't have a "norm" for how this sequence goes, but along with
Jan's point about -2 being checked back in the caller... The "norm"
seems to be to:
ret = qemuMonitor*();
if (*ExitMonitor) < 0)
ret = -1;
goto cleanup or error;
if (ret < 0)
goto cleanup;
...
Caller would probably want to make sure the VM is still active or not.
> + for (i = 0; i < vm->def->nmems; i++) {
> + virDomainMemoryDefPtr mem = vm->def->mems[i];
> + qemuMonitorMemoryDeviceInfoPtr dimm;
> +
> + if (!mem->info.alias)
> + continue;
> +
> + if (!(dimm = virHashLookup(meminfo, mem->info.alias)))
> + continue;
> +
> + mem->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ACPI_DIMM;
> + mem->info.addr.acpiDimm.slot = dimm->slot;
> + mem->info.addr.acpiDimm.base = dimm->address;
> + }
> +
cleanup:
> + virHashFree(meminfo);
> + return ret;
> +}
> +
> +
> bool
> qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
> virDomainDefPtr src,
<...snip...>
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index b0f7b1c..ba7c8e2 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -4871,6 +4871,10 @@ int qemuProcessStart(virConnectPtr conn,
> if (qemuDomainUpdateDeviceList(driver, vm, asyncJob) < 0)
> goto cleanup;
>
> + VIR_DEBUG("Updating info of memory devices");
> + if (qemuDomainUpdateMemoryDeviceInfo(driver, vm, asyncJob) < 0)
> + goto cleanup;
> +
Haven't looked forward yet, but is this something that needs to be done
at qemuProcessReconnec ?
John
> /* Technically, qemuProcessStart can be called from inside
> * QEMU_ASYNC_JOB_MIGRATION_IN, but we are okay treating this like
> * a sync job since no other job can call into the domain until
>
More information about the libvir-list
mailing list