qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v4 17/22] qapi: introduce x-query-cmma QMP command


From: Philippe Mathieu-Daudé
Subject: Re: [PATCH v4 17/22] qapi: introduce x-query-cmma QMP command
Date: Tue, 2 Nov 2021 15:53:29 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.2.0

On 10/28/21 17:54, Daniel P. Berrangé wrote:
> This is a counterpart to the HMP "info cmma" command. It is being
> added with an "x-" prefix because this QMP command is intended as an
> adhoc debugging tool and will thus not be modelled in QAPI as fully
> structured data, nor will it have long term guaranteed stability.
> The existing HMP command is rewritten to call the QMP command.
> 
> This command is unable to use the pre-existing HumanReadableText,
> because if 'common.json' is included into 'machine-target.json'
> the static marshalling method for HumanReadableText will be reported
> as unused by the compiler on all architectures except s390x.
> 
> Possible options were
> 
>  1 Support 'if' conditionals on 'include' statements in QAPI
>  2 Add further commands to 'machine-target.json' that use
>    HumanReadableText, such that it has at least one usage
>    on all architecture targets.
>  3 Duplicate HumanReadableText as TargetHumanReadableText
>    adding conditions
> 
> This patch takes option (3) in the belief that we will eventually
> get to a point where option (2) happens, and TargetHumanReadableText
> can be removed again.

Aren't you using (1) here? TargetHumanReadableText was added in v2
but v3 diverged and doesn't add it anymore.

> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>  hw/s390x/s390-stattrib.c | 56 +++++++++++++++++++++++++++-------------
>  qapi/machine-target.json | 14 ++++++++++
>  2 files changed, 52 insertions(+), 18 deletions(-)
> 
> diff --git a/hw/s390x/s390-stattrib.c b/hw/s390x/s390-stattrib.c
> index 9eda1c3b2a..d8f5867a5f 100644
> --- a/hw/s390x/s390-stattrib.c
> +++ b/hw/s390x/s390-stattrib.c
> @@ -17,6 +17,8 @@
>  #include "qemu/error-report.h"
>  #include "exec/ram_addr.h"
>  #include "qapi/error.h"
> +#include "qapi/qapi-commands-machine-target.h"
> +#include "qapi/type-helpers.h"
>  #include "qapi/qmp/qdict.h"
>  
>  /* 512KiB cover 2GB of guest memory */
> @@ -67,41 +69,59 @@ void hmp_migrationmode(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> -void hmp_info_cmma(Monitor *mon, const QDict *qdict)
> +HumanReadableText *qmp_x_query_cmma(int64_t addr,
> +                                    bool has_count,
> +                                    int64_t count,
> +                                    Error **errp)
>  {
> +    g_autoptr(GString) buf = g_string_new("");
>      S390StAttribState *sas = s390_get_stattrib_device();
>      S390StAttribClass *sac = S390_STATTRIB_GET_CLASS(sas);
> -    uint64_t addr = qdict_get_int(qdict, "addr");
> -    uint64_t buflen = qdict_get_try_int(qdict, "count", 8);
> -    uint8_t *vals;
> +    g_autofree uint8_t *vals = NULL;
>      int cx, len;
>  
> -    vals = g_try_malloc(buflen);
> +    vals = g_try_malloc(count);
>      if (!vals) {
> -        monitor_printf(mon, "Error: %s\n", strerror(errno));
> -        return;
> +        error_setg_errno(errp, errno, "cannot allocate CMMA attribute 
> values");
> +        return NULL;
>      }
>  
> -    len = sac->peek_stattr(sas, addr / TARGET_PAGE_SIZE, buflen, vals);
> +    len = sac->peek_stattr(sas, addr / TARGET_PAGE_SIZE, count, vals);
>      if (len < 0) {
> -        monitor_printf(mon, "Error: %s", strerror(-len));
> -        goto out;
> +        error_setg_errno(errp, -len, "cannot peek at CMMA attribute values");
> +        return NULL;
>      }
>  
> -    monitor_printf(mon, "  CMMA attributes, "
> -                   "pages %" PRIu64 "+%d (0x%" PRIx64 "):\n",
> -                   addr / TARGET_PAGE_SIZE, len, addr & ~TARGET_PAGE_MASK);
> +    g_string_append_printf(buf, "  CMMA attributes, "
> +                           "pages %" PRIu64 "+%d (0x%" PRIx64 "):\n",
> +                           addr / TARGET_PAGE_SIZE, len,
> +                           addr & ~TARGET_PAGE_MASK);
>      for (cx = 0; cx < len; cx++) {
>          if (cx % 8 == 7) {
> -            monitor_printf(mon, "%02x\n", vals[cx]);
> +            g_string_append_printf(buf, "%02x\n", vals[cx]);
>          } else {
> -            monitor_printf(mon, "%02x", vals[cx]);
> +            g_string_append_printf(buf, "%02x", vals[cx]);
>          }
>      }
> -    monitor_printf(mon, "\n");
> +    g_string_append_printf(buf, "\n");
> +
> +    return human_readable_text_from_str(buf);
> +}
> +
> +void hmp_info_cmma(Monitor *mon, const QDict *qdict)
> +{
> +    Error *err = NULL;
> +    g_autoptr(HumanReadableText) info = NULL;
> +    uint64_t addr = qdict_get_int(qdict, "addr");
> +    uint64_t count = qdict_get_try_int(qdict, "count", 8);
> +
> +    info = qmp_x_query_cmma(addr, true, count, &err);
> +    if (err) {
> +        error_report_err(err);
> +        return;
> +    }
>  
> -out:
> -    g_free(vals);
> +    monitor_printf(mon, "%s", info->human_readable_text);
>  }
>  
>  /* Migration support: */
> diff --git a/qapi/machine-target.json b/qapi/machine-target.json
> index 7d4e73462f..19e44987af 100644
> --- a/qapi/machine-target.json
> +++ b/qapi/machine-target.json
> @@ -345,6 +345,20 @@
>                     'TARGET_MIPS' ] } }
>  
>  
> +##
> +# @x-query-cmma:
> +#
> +# Query the values of the CMMA storage attributes for a range of pages
> +#
> +# Returns: CMMA storage attribute values
> +#
> +# Since: 6.2
> +##
> +{ 'command': 'x-query-cmma',
> +  'data': { 'addr': 'int', '*count': 'int' },
> +  'returns': 'HumanReadableText',
> +  'if': 'TARGET_S390X' }
> +
>  ##
>  # @x-query-skeys:
>  #
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]