[PATCH 07/10] qemu: Refresh the actual size of virtio-mem on monitor reconnect

Peter Krempa pkrempa at redhat.com
Tue Feb 2 13:00:03 UTC 2021


On Fri, Jan 22, 2021 at 13:50:29 +0100, Michal Privoznik wrote:
> If the QEMU driver restarts it loses the track of the actual size
> of virtio-mem (because it's runtime type of information and thus
> not stored in XML) and therefore, we have to refresh it when
> reconnecting to the domain monitor.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/qemu/qemu_domain.c       | 37 ++++++++++++++++++++----
>  src/qemu/qemu_monitor.h      |  3 ++
>  src/qemu/qemu_monitor_json.c | 55 +++++++++++++++++++++---------------
>  src/qemu/qemu_process.c      |  3 ++
>  4 files changed, 70 insertions(+), 28 deletions(-)
> 
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 783756b191..5c40c02180 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c

[...]

> diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
> index 00428c14d2..9668e287a1 100644
> --- a/src/qemu/qemu_monitor.h
> +++ b/src/qemu/qemu_monitor.h
> @@ -1391,10 +1391,13 @@ typedef struct _qemuMonitorMemoryDeviceInfo qemuMonitorMemoryDeviceInfo;
>  typedef qemuMonitorMemoryDeviceInfo *qemuMonitorMemoryDeviceInfoPtr;
>  
>  struct _qemuMonitorMemoryDeviceInfo {
> +    /* For pc-dimm */
>      unsigned long long address;
>      unsigned int slot;
>      bool hotplugged;
>      bool hotpluggable;
> +    /* For virtio-mem */
> +    unsigned long long size;

Menion the unit here.

[...]

> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index b1dc527e8b..1922f84a5e 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -8228,7 +8228,6 @@ qemuMonitorJSONGetMemoryDeviceInfo(qemuMonitorPtr mon,
>      virJSONValuePtr cmd;
>      virJSONValuePtr reply = NULL;
>      virJSONValuePtr data = NULL;
> -    qemuMonitorMemoryDeviceInfoPtr meminfo = NULL;
>      size_t i;
>  
>      if (!(cmd = qemuMonitorJSONMakeCommand("query-memory-devices", NULL)))
> @@ -8249,6 +8248,9 @@ qemuMonitorJSONGetMemoryDeviceInfo(qemuMonitorPtr mon,
>  
>      for (i = 0; i < virJSONValueArraySize(data); i++) {
>          virJSONValuePtr elem = virJSONValueArrayGet(data, i);
> +        g_autofree qemuMonitorMemoryDeviceInfoPtr meminfo = NULL;
> +        virJSONValuePtr dimminfo;
> +        const char *devalias;
>          const char *type;
>  
>          if (!(type = virJSONValueObjectGetString(elem, "type"))) {
> @@ -8258,26 +8260,23 @@ qemuMonitorJSONGetMemoryDeviceInfo(qemuMonitorPtr mon,
>              goto cleanup;
>          }
>  
> +        if (!(dimminfo = virJSONValueObjectGetObject(elem, "data"))) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("query-memory-devices reply data doesn't "
> +                             "contain enum data"));
> +            goto cleanup;
> +        }
> +
> +        if (!(devalias = virJSONValueObjectGetString(dimminfo, "id"))) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("dimm memory info data is missing 'id'"));
> +            goto cleanup;
> +        }

This isn't future proof. The 'MemoryDeviceInfo' QAPI type which is the
return value of 'query-memory-devices' doesn't have any permanent
members, it's just an union of distinct sub types.

The fields you are querying are re-defined for every type, but are not
guaranteed to be present for any new type.

Thus our code must not require them to be present, only when we are
certain that we've got the correct discriminator.

> +
> +        meminfo = g_new0(qemuMonitorMemoryDeviceInfo, 1);
> +
>          /* dimm memory devices */
>          if (STREQ(type, "dimm")) {

[...]




More information about the libvir-list mailing list