[libvirt] [PATCH V2 2/4] qemu: Add monitor support for CPU halted state

John Ferlan jferlan at redhat.com
Thu Sep 29 14:34:23 UTC 2016



On 09/20/2016 04:10 AM, Viktor Mihajlovski wrote:
> Extended the qemuMonitorCPUInfo with a halted flag. Extract the halted
> flag for both text and JSON monitor.
> 
> Signed-off-by: Viktor Mihajlovski <mihajlov at linux.vnet.ibm.com>
> Signed-off-by: Boris Fiuczynski <fiuczy at linux.vnet.ibm.com>
> ---
>  src/qemu/qemu_monitor.c      | 6 +++++-
>  src/qemu/qemu_monitor.h      | 5 +++++
>  src/qemu/qemu_monitor_json.c | 3 +++
>  src/qemu/qemu_monitor_text.c | 8 +++++++-
>  tests/qemumonitorjsontest.c  | 8 ++++----
>  5 files changed, 24 insertions(+), 6 deletions(-)
> 
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index b9e2910..c61fac7 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -1677,6 +1677,7 @@ qemuMonitorCPUInfoClear(qemuMonitorCPUInfoPtr cpus,
>          cpus[i].thread_id = -1;
>          cpus[i].vcpus = 0;
>          cpus[i].tid = 0;
> +        cpus[i].halted = true;
>  
>          VIR_FREE(cpus[i].qom_path);
>          VIR_FREE(cpus[i].alias);
> @@ -1725,8 +1726,10 @@ qemuMonitorGetCPUInfoLegacy(struct qemuMonitorQueryCpusEntry *cpuentries,
>      size_t i;
>  
>      for (i = 0; i < maxvcpus; i++) {
> -        if (i < ncpuentries)
> +        if (i < ncpuentries) {
>              vcpus[i].tid = cpuentries[i].tid;
> +            vcpus[i].halted = cpuentries[i].halted;
> +        }
>  
>          /* for legacy hotplug to work we need to fake the vcpu count added by
>           * enabling a given vcpu */
> @@ -1864,6 +1867,7 @@ qemuMonitorGetCPUInfoHotplug(struct qemuMonitorQueryHotpluggableCpusEntry *hotpl
>          }
>  
>          vcpus[anyvcpu].tid = cpuentries[j].tid;
> +        vcpus[anyvcpu].halted = cpuentries[j].halted;
>      }
>  
>      return 0;
> diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
> index 615ab3e..8d0aa01 100644
> --- a/src/qemu/qemu_monitor.h
> +++ b/src/qemu/qemu_monitor.h
> @@ -394,6 +394,8 @@ int qemuMonitorSystemPowerdown(qemuMonitorPtr mon);
>  struct qemuMonitorQueryCpusEntry {
>      pid_t tid;
>      char *qom_path;
> +    /* halted indicator */

I can't believe I'm typing this, I'll blame pkrempa's influence ;-) -
but the comment is unnecessary since the name of the variable makes it
really obvious.

> +    bool halted;
>  };
>  void qemuMonitorQueryCpusFree(struct qemuMonitorQueryCpusEntry *entries,
>                                size_t nentries);
> @@ -441,6 +443,9 @@ struct _qemuMonitorCPUInfo {
>  
>      /* internal for use in the matching code */
>      char *qom_path;
> +
> +    /* halted indicator */

Ditto

John

> +    bool halted;
>  };
>  typedef struct _qemuMonitorCPUInfo qemuMonitorCPUInfo;
>  typedef qemuMonitorCPUInfo *qemuMonitorCPUInfoPtr;
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index de746f1..64f9d01 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -1349,6 +1349,7 @@ qemuMonitorJSONExtractCPUInfo(virJSONValuePtr data,
>      for (i = 0; i < ncpus; i++) {
>          virJSONValuePtr entry = virJSONValueArrayGet(data, i);
>          int thread = 0;
> +        bool halted = true;
>          const char *qom_path;
>          if (!entry) {
>              ret = -2;
> @@ -1358,9 +1359,11 @@ qemuMonitorJSONExtractCPUInfo(virJSONValuePtr data,
>          /* Some older qemu versions don't report the thread_id so treat this as
>           * non-fatal, simply returning no data */
>          ignore_value(virJSONValueObjectGetNumberInt(entry, "thread_id", &thread));
> +        ignore_value(virJSONValueObjectGetBoolean(entry, "halted", &halted));
>          qom_path = virJSONValueObjectGetString(entry, "qom_path");
>  
>          cpus[i].tid = thread;
> +        cpus[i].halted = halted;
>          if (VIR_STRDUP(cpus[i].qom_path, qom_path) < 0)
>              goto cleanup;
>      }
> diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
> index ff7cc79..f975347 100644
> --- a/src/qemu/qemu_monitor_text.c
> +++ b/src/qemu/qemu_monitor_text.c
> @@ -521,7 +521,7 @@ qemuMonitorTextQueryCPUs(qemuMonitorPtr mon,
>       * (qemu) info cpus
>       * * CPU #0: pc=0x00000000000f0c4a thread_id=30019
>       *   CPU #1: pc=0x00000000fffffff0 thread_id=30020
> -     *   CPU #2: pc=0x00000000fffffff0 thread_id=30021
> +     *   CPU #2: pc=0x00000000fffffff0 (halted) thread_id=30021
>       *
>       */
>      line = qemucpus;
> @@ -541,6 +541,12 @@ qemuMonitorTextQueryCPUs(qemuMonitorPtr mon,
>  
>          cpu.tid = tid;
>  
> +        /* Extract halted indicator */
> +        if ((offset = strstr(line, "(halted)")) != NULL)
> +            cpu.halted = true;
> +        else
> +            cpu.halted = false;
> +
>          if (VIR_APPEND_ELEMENT_COPY(cpus, ncpus, cpu) < 0) {
>              ret = -1;
>              goto cleanup;
> diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
> index 9e195d7..8749ea1 100644
> --- a/tests/qemumonitorjsontest.c
> +++ b/tests/qemumonitorjsontest.c
> @@ -1221,10 +1221,10 @@ testQemuMonitorJSONqemuMonitorJSONQueryCPUs(const void *data)
>      int ret = -1;
>      struct qemuMonitorQueryCpusEntry *cpudata = NULL;
>      struct qemuMonitorQueryCpusEntry expect[] = {
> -        {17622, (char *) "/machine/unattached/device[0]"},
> -        {17624, (char *) "/machine/unattached/device[1]"},
> -        {17626, (char *) "/machine/unattached/device[2]"},
> -        {17628, NULL},
> +        {17622, (char *) "/machine/unattached/device[0]", true},
> +        {17624, (char *) "/machine/unattached/device[1]", true},
> +        {17626, (char *) "/machine/unattached/device[2]", true},
> +        {17628, NULL, true},
>      };
>      size_t ncpudata = 0;
>      size_t i;
> 




More information about the libvir-list mailing list