From: Markus Armbruster <armbru@redhat.com>
To: Andrew Jones <drjones@redhat.com>
Cc: qemu-devel@nongnu.org, qemu-arm@nongnu.org,
peter.maydell@linaro.org, richard.henderson@linaro.org,
abologna@redhat.com, alex.bennee@linaro.org,
Dave.Martin@arm.com
Subject: Re: [Qemu-devel] [PATCH 08/13] target/arm/monitor: Add query-sve-vector-lengths
Date: Mon, 13 May 2019 18:12:38 +0200 [thread overview]
Message-ID: <87ftpie3k9.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <20190512083624.8916-9-drjones@redhat.com> (Andrew Jones's message of "Sun, 12 May 2019 10:36:19 +0200")
Andrew Jones <drjones@redhat.com> writes:
> Provide a QMP interface to query the supported SVE vector lengths.
> A migratable guest will need to explicitly specify a valid set of
> lengths on the command line and that set can be obtained from the
> list returned with this QMP command.
>
> This patch only introduces the QMP command with the TCG implementation.
> The result may not yet be correct for KVM. Following patches ensure
> the KVM result is correct.
>
> Signed-off-by: Andrew Jones <drjones@redhat.com>
> ---
> qapi/target.json | 34 ++++++++++++++++++++++++
> target/arm/monitor.c | 62 ++++++++++++++++++++++++++++++++++++++++++++
> tests/qmp-cmd-test.c | 1 +
> 3 files changed, 97 insertions(+)
>
> diff --git a/qapi/target.json b/qapi/target.json
> index 1d4d54b6002e..ca1e85254780 100644
> --- a/qapi/target.json
> +++ b/qapi/target.json
> @@ -397,6 +397,40 @@
> { 'command': 'query-gic-capabilities', 'returns': ['GICCapability'],
> 'if': 'defined(TARGET_ARM)' }
>
> +##
> +# @SVEVectorLengths:
> +#
> +# The struct contains a list of integers where each integer is a valid
Suggest to s/The struct contains/Contains/.
> +# SVE vector length for a KVM guest on this host. The vector lengths
> +# are in quadword (128-bit) units, e.g. '4' means 512 bits (64 bytes).
Any particular reason for counting quad-words instead of bytes, or
perhaps bits?
> +#
> +# @vls: list of vector lengths in quadwords.
> +#
> +# Since: 4.1
> +##
> +{ 'struct': 'SVEVectorLengths',
> + 'data': { 'vls': ['int'] },
> + 'if': 'defined(TARGET_ARM)' }
> +
> +##
> +# @query-sve-vector-lengths:
> +#
> +# This command is ARM-only. It will return a list of SVEVectorLengths
No other target-specific command documents its target-specificness like
this. Suggest
# Query valid SVE vector length sets.
> +# objects. The list describes all valid SVE vector length sets.
> +#
> +# Returns: a list of SVEVectorLengths objects
> +#
> +# Since: 4.1
> +#
> +# -> { "execute": "query-sve-vector-lengths" }
> +# <- { "return": [ { "vls": [ 1 ] },
> +# { "vls": [ 1, 2 ] },
> +# { "vls": [ 1, 2, 4 ] } ] }
> +#
> +##
> +{ 'command': 'query-sve-vector-lengths', 'returns': ['SVEVectorLengths'],
> + 'if': 'defined(TARGET_ARM)' }
> +
> ##
> # @CpuModelExpansionInfo:
> #
> diff --git a/target/arm/monitor.c b/target/arm/monitor.c
> index 41b32b94b258..8b2afa255c92 100644
> --- a/target/arm/monitor.c
> +++ b/target/arm/monitor.c
> @@ -24,6 +24,7 @@
> #include "hw/boards.h"
> #include "kvm_arm.h"
> #include "qapi/qapi-commands-target.h"
> +#include "monitor/hmp-target.h"
Uh, hmp-target.h when the patch is supposedly about QMP only...
>
> static GICCapability *gic_cap_new(int version)
> {
> @@ -82,3 +83,64 @@ GICCapabilityList *qmp_query_gic_capabilities(Error **errp)
>
> return head;
> }
> +
> +static SVEVectorLengths *qmp_sve_vls_get(void)
> +{
> + CPUArchState *env = mon_get_cpu_env();
Aha, you need it for mon_get_cpu_env().
mon_get_cpu_env() returns the current monitor's current CPU. This is an
HMP thing, QMP commands should never access it.
Looks like you use it to find one of the CPUs, so you can access its
->sve_max_vq.
"One of the CPUs" smells odd: what if they aren't all the same? Perhaps
that can't happen. I don't know, you tell me :)
If any CPU will do, what about simply using first_cpu?
> + ARMCPU *cpu = arm_env_get_cpu(env);
> + SVEVectorLengths *vls = g_new(SVEVectorLengths, 1);
> + intList **v = &vls->vls;
> + int i;
> +
> + if (cpu->sve_max_vq == 0) {
> + *v = g_new0(intList, 1); /* one vl of 0 means none supported */
> + return vls;
> + }
> +
> + for (i = 1; i <= cpu->sve_max_vq; ++i) {
> + *v = g_new0(intList, 1);
> + (*v)->value = i;
> + v = &(*v)->next;
> + }
What this loop does is not immediately obvious. I think you could use a
function comment.
> +
> + return vls;
> +}
> +
> +static SVEVectorLengths *qmp_sve_vls_dup_and_truncate(SVEVectorLengths *vls)
> +{
> + SVEVectorLengths *trunc_vls;
> + intList **v, *p = vls->vls;
> +
> + if (!p->next) {
> + return NULL;
> + }
> +
> + trunc_vls = g_new(SVEVectorLengths, 1);
> + v = &trunc_vls->vls;
> +
> + for (; p->next; p = p->next) {
> + *v = g_new0(intList, 1);
> + (*v)->value = p->value;
> + v = &(*v)->next;
> + }
> +
> + return trunc_vls;
> +}
More so.
> +
> +SVEVectorLengthsList *qmp_query_sve_vector_lengths(Error **errp)
> +{
> + SVEVectorLengthsList *vls_list = g_new0(SVEVectorLengthsList, 1);
> + SVEVectorLengths *vls = qmp_sve_vls_get();
> +
> + while (vls) {
> + vls_list->value = vls;
> + vls = qmp_sve_vls_dup_and_truncate(vls);
> + if (vls) {
> + SVEVectorLengthsList *next = vls_list;
> + vls_list = g_new0(SVEVectorLengthsList, 1);
> + vls_list->next = next;
> + }
> + }
> +
> + return vls_list;
> +}
> diff --git a/tests/qmp-cmd-test.c b/tests/qmp-cmd-test.c
> index 9f5228cd9951..3d714dbc6a4a 100644
> --- a/tests/qmp-cmd-test.c
> +++ b/tests/qmp-cmd-test.c
> @@ -90,6 +90,7 @@ static bool query_is_blacklisted(const char *cmd)
> /* Success depends on target arch: */
> "query-cpu-definitions", /* arm, i386, ppc, s390x */
> "query-gic-capabilities", /* arm */
> + "query-sve-vector-lengths", /* arm */
> /* Success depends on target-specific build configuration: */
> "query-pci", /* CONFIG_PCI */
> /* Success depends on launching SEV guest */
WARNING: multiple messages have this Message-ID (diff)
From: Markus Armbruster <armbru@redhat.com>
To: Andrew Jones <drjones@redhat.com>
Cc: peter.maydell@linaro.org, richard.henderson@linaro.org,
qemu-devel@nongnu.org, abologna@redhat.com, qemu-arm@nongnu.org,
alex.bennee@linaro.org, Dave.Martin@arm.com
Subject: Re: [Qemu-devel] [PATCH 08/13] target/arm/monitor: Add query-sve-vector-lengths
Date: Mon, 13 May 2019 18:12:38 +0200 [thread overview]
Message-ID: <87ftpie3k9.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <20190512083624.8916-9-drjones@redhat.com> (Andrew Jones's message of "Sun, 12 May 2019 10:36:19 +0200")
Andrew Jones <drjones@redhat.com> writes:
> Provide a QMP interface to query the supported SVE vector lengths.
> A migratable guest will need to explicitly specify a valid set of
> lengths on the command line and that set can be obtained from the
> list returned with this QMP command.
>
> This patch only introduces the QMP command with the TCG implementation.
> The result may not yet be correct for KVM. Following patches ensure
> the KVM result is correct.
>
> Signed-off-by: Andrew Jones <drjones@redhat.com>
> ---
> qapi/target.json | 34 ++++++++++++++++++++++++
> target/arm/monitor.c | 62 ++++++++++++++++++++++++++++++++++++++++++++
> tests/qmp-cmd-test.c | 1 +
> 3 files changed, 97 insertions(+)
>
> diff --git a/qapi/target.json b/qapi/target.json
> index 1d4d54b6002e..ca1e85254780 100644
> --- a/qapi/target.json
> +++ b/qapi/target.json
> @@ -397,6 +397,40 @@
> { 'command': 'query-gic-capabilities', 'returns': ['GICCapability'],
> 'if': 'defined(TARGET_ARM)' }
>
> +##
> +# @SVEVectorLengths:
> +#
> +# The struct contains a list of integers where each integer is a valid
Suggest to s/The struct contains/Contains/.
> +# SVE vector length for a KVM guest on this host. The vector lengths
> +# are in quadword (128-bit) units, e.g. '4' means 512 bits (64 bytes).
Any particular reason for counting quad-words instead of bytes, or
perhaps bits?
> +#
> +# @vls: list of vector lengths in quadwords.
> +#
> +# Since: 4.1
> +##
> +{ 'struct': 'SVEVectorLengths',
> + 'data': { 'vls': ['int'] },
> + 'if': 'defined(TARGET_ARM)' }
> +
> +##
> +# @query-sve-vector-lengths:
> +#
> +# This command is ARM-only. It will return a list of SVEVectorLengths
No other target-specific command documents its target-specificness like
this. Suggest
# Query valid SVE vector length sets.
> +# objects. The list describes all valid SVE vector length sets.
> +#
> +# Returns: a list of SVEVectorLengths objects
> +#
> +# Since: 4.1
> +#
> +# -> { "execute": "query-sve-vector-lengths" }
> +# <- { "return": [ { "vls": [ 1 ] },
> +# { "vls": [ 1, 2 ] },
> +# { "vls": [ 1, 2, 4 ] } ] }
> +#
> +##
> +{ 'command': 'query-sve-vector-lengths', 'returns': ['SVEVectorLengths'],
> + 'if': 'defined(TARGET_ARM)' }
> +
> ##
> # @CpuModelExpansionInfo:
> #
> diff --git a/target/arm/monitor.c b/target/arm/monitor.c
> index 41b32b94b258..8b2afa255c92 100644
> --- a/target/arm/monitor.c
> +++ b/target/arm/monitor.c
> @@ -24,6 +24,7 @@
> #include "hw/boards.h"
> #include "kvm_arm.h"
> #include "qapi/qapi-commands-target.h"
> +#include "monitor/hmp-target.h"
Uh, hmp-target.h when the patch is supposedly about QMP only...
>
> static GICCapability *gic_cap_new(int version)
> {
> @@ -82,3 +83,64 @@ GICCapabilityList *qmp_query_gic_capabilities(Error **errp)
>
> return head;
> }
> +
> +static SVEVectorLengths *qmp_sve_vls_get(void)
> +{
> + CPUArchState *env = mon_get_cpu_env();
Aha, you need it for mon_get_cpu_env().
mon_get_cpu_env() returns the current monitor's current CPU. This is an
HMP thing, QMP commands should never access it.
Looks like you use it to find one of the CPUs, so you can access its
->sve_max_vq.
"One of the CPUs" smells odd: what if they aren't all the same? Perhaps
that can't happen. I don't know, you tell me :)
If any CPU will do, what about simply using first_cpu?
> + ARMCPU *cpu = arm_env_get_cpu(env);
> + SVEVectorLengths *vls = g_new(SVEVectorLengths, 1);
> + intList **v = &vls->vls;
> + int i;
> +
> + if (cpu->sve_max_vq == 0) {
> + *v = g_new0(intList, 1); /* one vl of 0 means none supported */
> + return vls;
> + }
> +
> + for (i = 1; i <= cpu->sve_max_vq; ++i) {
> + *v = g_new0(intList, 1);
> + (*v)->value = i;
> + v = &(*v)->next;
> + }
What this loop does is not immediately obvious. I think you could use a
function comment.
> +
> + return vls;
> +}
> +
> +static SVEVectorLengths *qmp_sve_vls_dup_and_truncate(SVEVectorLengths *vls)
> +{
> + SVEVectorLengths *trunc_vls;
> + intList **v, *p = vls->vls;
> +
> + if (!p->next) {
> + return NULL;
> + }
> +
> + trunc_vls = g_new(SVEVectorLengths, 1);
> + v = &trunc_vls->vls;
> +
> + for (; p->next; p = p->next) {
> + *v = g_new0(intList, 1);
> + (*v)->value = p->value;
> + v = &(*v)->next;
> + }
> +
> + return trunc_vls;
> +}
More so.
> +
> +SVEVectorLengthsList *qmp_query_sve_vector_lengths(Error **errp)
> +{
> + SVEVectorLengthsList *vls_list = g_new0(SVEVectorLengthsList, 1);
> + SVEVectorLengths *vls = qmp_sve_vls_get();
> +
> + while (vls) {
> + vls_list->value = vls;
> + vls = qmp_sve_vls_dup_and_truncate(vls);
> + if (vls) {
> + SVEVectorLengthsList *next = vls_list;
> + vls_list = g_new0(SVEVectorLengthsList, 1);
> + vls_list->next = next;
> + }
> + }
> +
> + return vls_list;
> +}
> diff --git a/tests/qmp-cmd-test.c b/tests/qmp-cmd-test.c
> index 9f5228cd9951..3d714dbc6a4a 100644
> --- a/tests/qmp-cmd-test.c
> +++ b/tests/qmp-cmd-test.c
> @@ -90,6 +90,7 @@ static bool query_is_blacklisted(const char *cmd)
> /* Success depends on target arch: */
> "query-cpu-definitions", /* arm, i386, ppc, s390x */
> "query-gic-capabilities", /* arm */
> + "query-sve-vector-lengths", /* arm */
> /* Success depends on target-specific build configuration: */
> "query-pci", /* CONFIG_PCI */
> /* Success depends on launching SEV guest */
next prev parent reply other threads:[~2019-05-13 16:12 UTC|newest]
Thread overview: 131+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-12 8:36 [PATCH 00/13] target/arm/kvm: enable SVE in guests Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-12 8:36 ` [PATCH 01/13] target/arm/kvm64: fix error returns Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-06-05 7:20 ` Auger Eric
2019-05-12 8:36 ` [PATCH 02/13] update-linux-headers: Add sve_context.h to asm-arm64 Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-06-05 7:21 ` Auger Eric
2019-06-05 7:30 ` Andrew Jones
2019-06-05 7:30 ` Andrew Jones
2019-05-12 8:36 ` [PATCH 03/13] HACK: linux header update Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-12 8:36 ` [PATCH 04/13] target/arm/kvm: Move the get/put of fpsimd registers out Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-06-05 7:15 ` Auger Eric
2019-06-05 7:27 ` Andrew Jones
2019-06-05 7:27 ` Andrew Jones
2019-05-12 8:36 ` [PATCH 05/13] target/arm/kvm: Add kvm_arch_get/put_sve Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-13 12:31 ` Dave Martin
2019-05-13 12:31 ` [Qemu-devel] " Dave Martin
2019-05-13 13:55 ` Andrew Jones
2019-05-13 13:55 ` Andrew Jones
2019-05-13 15:31 ` Dave Martin
2019-05-13 15:31 ` Dave Martin
2019-05-13 15:40 ` Peter Maydell
2019-05-13 15:40 ` Peter Maydell
2019-05-13 16:05 ` Dave Martin
2019-05-13 16:05 ` Dave Martin
2019-05-13 16:40 ` Richard Henderson
2019-05-13 16:40 ` [Qemu-devel] " Richard Henderson
2019-05-13 18:14 ` Andrew Jones
2019-05-13 18:14 ` [Qemu-devel] " Andrew Jones
2019-05-13 18:31 ` Richard Henderson
2019-05-13 18:31 ` [Qemu-devel] " Richard Henderson
2019-05-13 12:43 ` Dave Martin
2019-05-13 12:43 ` [Qemu-devel] " Dave Martin
2019-05-13 14:07 ` Andrew Jones
2019-05-13 14:07 ` Andrew Jones
2019-05-13 14:39 ` Dave Martin
2019-05-13 14:39 ` Dave Martin
2019-05-13 16:58 ` Richard Henderson
2019-05-13 16:58 ` Richard Henderson
2019-05-14 9:10 ` Dave Martin
2019-05-14 9:10 ` Dave Martin
2019-05-12 8:36 ` [PATCH 06/13] target/arm/kvm: max cpu: Enable SVE when available Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-06-05 9:09 ` Auger Eric
2019-06-05 11:04 ` Andrew Jones
2019-06-05 11:04 ` Andrew Jones
2019-05-12 8:36 ` [PATCH 07/13] target/arm/kvm: max cpu: Allow sve max vector length setting Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-13 17:19 ` Richard Henderson
2019-05-13 17:19 ` [Qemu-devel] " Richard Henderson
2019-05-13 18:19 ` Andrew Jones
2019-05-13 18:19 ` Andrew Jones
2019-06-06 8:30 ` Auger Eric
2019-06-06 8:53 ` Andrew Jones
2019-06-06 8:53 ` Andrew Jones
2019-05-12 8:36 ` [PATCH 08/13] target/arm/monitor: Add query-sve-vector-lengths Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-13 16:12 ` Markus Armbruster [this message]
2019-05-13 16:12 ` Markus Armbruster
2019-05-13 18:30 ` Andrew Jones
2019-05-13 18:30 ` Andrew Jones
2019-05-14 5:32 ` Markus Armbruster
2019-05-12 8:36 ` [PATCH 09/13] target/arm/kvm: Export kvm_arm_get_sve_vls Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-12 8:36 ` [PATCH 10/13] target/arm/monitor: kvm: only return valid sve vector sets Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-12 8:36 ` [PATCH 11/13] target/arm/cpu64: max cpu: Introduce sve-vls-map Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-13 11:26 ` Dave Martin
2019-05-13 11:26 ` [Qemu-devel] " Dave Martin
2019-05-13 12:30 ` Andrew Jones
2019-05-13 12:30 ` Andrew Jones
2019-05-13 12:41 ` Dave Martin
2019-05-13 12:41 ` Dave Martin
2019-05-13 12:57 ` Andrew Jones
2019-05-13 12:57 ` Andrew Jones
2019-05-13 13:12 ` Dave Martin
2019-05-13 13:12 ` Dave Martin
2019-05-13 13:45 ` Andrew Jones
2019-05-13 13:45 ` Andrew Jones
2019-05-13 14:35 ` Dave Martin
2019-05-13 14:35 ` Dave Martin
2019-05-13 15:25 ` Markus Armbruster
2019-05-13 15:25 ` Markus Armbruster
2019-05-13 18:31 ` Andrew Jones
2019-05-13 18:31 ` Andrew Jones
2019-05-12 8:36 ` [PATCH 12/13] target/arm/kvm: max cpu: Add support for sve-vls-map Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-12 8:36 ` [PATCH 13/13] target/arm/kvm: host " Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-13 15:37 ` Markus Armbruster
2019-05-13 15:37 ` Markus Armbruster
2019-05-13 18:33 ` Andrew Jones
2019-05-13 18:33 ` Andrew Jones
2019-05-13 9:32 ` [PATCH 00/13] target/arm/kvm: enable SVE in guests Andrea Bolognani
2019-05-13 9:32 ` [Qemu-devel] " Andrea Bolognani
2019-05-13 11:15 ` Dave Martin
2019-05-13 11:15 ` [Qemu-devel] " Dave Martin
2019-05-13 12:38 ` Andrew Jones
2019-05-13 12:38 ` [Qemu-devel] " Andrew Jones
2019-05-13 12:50 ` Dave Martin
2019-05-13 12:50 ` [Qemu-devel] " Dave Martin
2019-05-13 12:36 ` Andrew Jones
2019-05-13 12:36 ` Andrew Jones
2019-05-14 12:29 ` Andrea Bolognani
2019-05-14 12:29 ` Andrea Bolognani
2019-05-14 12:53 ` Andrew Jones
2019-05-14 16:03 ` Andrea Bolognani
2019-05-14 20:14 ` Richard Henderson
2019-05-15 8:03 ` Andrea Bolognani
2019-05-15 11:14 ` Dave Martin
2019-05-15 11:14 ` Dave Martin
2019-05-15 11:28 ` Andrea Bolognani
2019-05-15 11:28 ` Andrea Bolognani
2019-05-15 12:47 ` Dave Martin
2019-05-15 12:47 ` Dave Martin
2019-05-15 9:15 ` Andrew Jones
2019-05-13 9:52 ` Peter Maydell
2019-05-13 9:52 ` [Qemu-devel] " Peter Maydell
2019-05-13 12:43 ` Andrew Jones
2019-05-13 12:43 ` Andrew Jones
2019-05-13 18:46 ` Richard Henderson
2019-05-13 18:46 ` [Qemu-devel] " Richard Henderson
2019-05-13 19:16 ` Andrew Jones
2019-05-13 19:16 ` [Qemu-devel] " Andrew Jones
2019-05-14 9:05 ` Peter Maydell
2019-05-14 9:05 ` [Qemu-devel] " Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87ftpie3k9.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=Dave.Martin@arm.com \
--cc=abologna@redhat.com \
--cc=alex.bennee@linaro.org \
--cc=drjones@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.