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

Re: [PATCH v8 09/12] tools: add physinfo arch_capabilities handling for Arm


  • To: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
  • From: Luca Fancellu <Luca.Fancellu@xxxxxxx>
  • Date: Tue, 6 Jun 2023 13:24:17 +0000
  • Accept-language: en-GB, en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=/alJ0yr0DqSkDDfJatotMNbjqqDOddZoNdl8Kuo6dTU=; b=ZOvqDdC5eK0T+60nzQBhS2wJ1L9NuGNhTTBwvUVyI2GPHj3vyD+qqZLoeyx9cT7XW11HQUbXFEgzq3c4wDNWd3dqDV4aTJJPapmAgq4FYO1M8cgxHEytZpwsTJIBP2EGiffS6EeulnTM6X0p2KX5VrDCUJfJmr2hzOUx46txIIEwqHF10tzi4jY1E8iI/fFW9CcWCk55pkbNq5kRgGlyegyKgZWTtKGelz3wYZk5cdXvgWQra6AtoDGJkRfNZOPd1dgwBaOJ8sG8lhDZkVAO41dmgO9YfwAyHklm8Ico99MMCWH4x0mncv8bBM8zQ3Cz9CIkOKHqTw6R0OY0NSwg2Q==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=n1fORRKemvxZi/I3oC9xgiktAg/Ip2L+lIK/PQzrS8bqR1d9dzn/ygBIouBH98YfgREBn7Dtt/8T/Rc3PWjvjiY1jFvuS3nyZ51Tn5nAGu90Ia2h15x0SutHMbNTGoRhWnEmkcRoBqyXD6K7oOQtGZd4t4E/M+kEkglljRoMWpqDoA30R9eG6o9g0NAfpQWvNcVjJ9P5ZDPmRXy34PpjKuVFmE2znitKotLXhVYOvukS7SYL64fbtCv1meVEu577u/t0mOEYRxX8EkEcbuGpIH+ZiGZqmjBFxPobQE6ryytsaa+wxF7e1ejra7gdCfpoYrjlp3NUrbMsdgP4fW+oZA==
  • Authentication-results-original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Cc: Bertrand Marquis <Bertrand.Marquis@xxxxxxx>, Wei Chen <Wei.Chen@xxxxxxx>, George Dunlap <george.dunlap@xxxxxxxxxx>, Nick Rosbrook <rosbrookn@xxxxxxxxx>, Wei Liu <wl@xxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Juergen Gross <jgross@xxxxxxxx>, Christian Lindig <christian.lindig@xxxxxxxxxx>, David Scott <dave@xxxxxxxxxx>, Christian Lindig <christian.lindig@xxxxxxxxx>, Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Tue, 06 Jun 2023 13:24:51 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Nodisclaimer: true
  • Original-authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Thread-index: AQHZk5EO/ZdBT4k0K0aZv7Y6q8RtUK99zTWA
  • Thread-topic: [PATCH v8 09/12] tools: add physinfo arch_capabilities handling for Arm


> On 31 May 2023, at 08:24, Luca Fancellu <Luca.Fancellu@xxxxxxx> wrote:
> 
> On Arm, the SVE vector length is encoded in arch_capabilities field
> of struct xen_sysctl_physinfo, make use of this field in the tools
> when building for arm.
> 
> Create header arm-arch-capabilities.h to handle the arch_capabilities
> field of physinfo for Arm.
> 
> Signed-off-by: Luca Fancellu <luca.fancellu@xxxxxxx>
> Acked-by: George Dunlap <george.dunlap@xxxxxxxxxx>
> Acked-by: Christian Lindig <christian.lindig@xxxxxxxxx>
> Reviewed-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
> ---
> Changes from v7:
> - in xc.c, add "arm_sve_vl" entry to the python dict only on arm64.
>   (Marek)

Hi Marek,

Are you ok with the changes I’ve done to address your last comment on v7?

Cheers,
Luca

> Changes from v6:
> - Fix licence header in arm-atch-capabilities.h, add R-by (Anthony)
> Changes from v5:
> - no changes
> Changes from v4:
> - Move arm-arch-capabilities.h into xen-tools/, add LIBXL_HAVE_,
>   fixed python return type to I instead of i. (Anthony)
> Changes from v3:
> - add Ack-by for the Golang bits (George)
> - add Ack-by for the OCaml tools (Christian)
> - now xen-tools/libs.h is named xen-tools/common-macros.h
> - changed commit message to explain why the header modification
>   in python/xen/lowlevel/xc/xc.c
> Changes from v2:
> - rename arm_arch_capabilities.h in arm-arch-capabilities.h, use
>   MASK_EXTR.
> - Now arm-arch-capabilities.h needs MASK_EXTR macro, but it is
>   defined in libxl_internal.h, it doesn't feel right to include
>   that header so move MASK_EXTR into xen-tools/libs.h that is also
>   included in libxl_internal.h
> Changes from v1:
> - now SVE VL is encoded in arch_capabilities on Arm
> Changes from RFC:
> - new patch
> ---
> tools/golang/xenlight/helpers.gen.go          |  2 +
> tools/golang/xenlight/types.gen.go            |  1 +
> tools/include/libxl.h                         |  6 +++
> .../include/xen-tools/arm-arch-capabilities.h | 28 +++++++++++++
> tools/include/xen-tools/common-macros.h       |  2 +
> tools/libs/light/libxl.c                      |  1 +
> tools/libs/light/libxl_internal.h             |  1 -
> tools/libs/light/libxl_types.idl              |  1 +
> tools/ocaml/libs/xc/xenctrl.ml                |  4 +-
> tools/ocaml/libs/xc/xenctrl.mli               |  4 +-
> tools/ocaml/libs/xc/xenctrl_stubs.c           |  8 ++--
> tools/python/xen/lowlevel/xc/xc.c             | 42 ++++++++++++++-----
> tools/xl/xl_info.c                            |  8 ++++
> 13 files changed, 87 insertions(+), 21 deletions(-)
> create mode 100644 tools/include/xen-tools/arm-arch-capabilities.h
> 
> diff --git a/tools/golang/xenlight/helpers.gen.go 
> b/tools/golang/xenlight/helpers.gen.go
> index 0a203d22321f..35397be2f9e2 100644
> --- a/tools/golang/xenlight/helpers.gen.go
> +++ b/tools/golang/xenlight/helpers.gen.go
> @@ -3506,6 +3506,7 @@ x.CapVmtrace = bool(xc.cap_vmtrace)
> x.CapVpmu = bool(xc.cap_vpmu)
> x.CapGnttabV1 = bool(xc.cap_gnttab_v1)
> x.CapGnttabV2 = bool(xc.cap_gnttab_v2)
> +x.ArchCapabilities = uint32(xc.arch_capabilities)
> 
>  return nil}
> 
> @@ -3540,6 +3541,7 @@ xc.cap_vmtrace = C.bool(x.CapVmtrace)
> xc.cap_vpmu = C.bool(x.CapVpmu)
> xc.cap_gnttab_v1 = C.bool(x.CapGnttabV1)
> xc.cap_gnttab_v2 = C.bool(x.CapGnttabV2)
> +xc.arch_capabilities = C.uint32_t(x.ArchCapabilities)
> 
>  return nil
>  }
> diff --git a/tools/golang/xenlight/types.gen.go 
> b/tools/golang/xenlight/types.gen.go
> index a7c17699f80e..3d968a496744 100644
> --- a/tools/golang/xenlight/types.gen.go
> +++ b/tools/golang/xenlight/types.gen.go
> @@ -1079,6 +1079,7 @@ CapVmtrace bool
> CapVpmu bool
> CapGnttabV1 bool
> CapGnttabV2 bool
> +ArchCapabilities uint32
> }
> 
> type Connectorinfo struct {
> diff --git a/tools/include/libxl.h b/tools/include/libxl.h
> index cfa1a191318c..4fa09ff7635a 100644
> --- a/tools/include/libxl.h
> +++ b/tools/include/libxl.h
> @@ -525,6 +525,12 @@
>  */
> #define LIBXL_HAVE_PHYSINFO_CAP_GNTTAB 1
> 
> +/*
> + * LIBXL_HAVE_PHYSINFO_ARCH_CAPABILITIES indicates that libxl_physinfo has a
> + * arch_capabilities field.
> + */
> +#define LIBXL_HAVE_PHYSINFO_ARCH_CAPABILITIES 1
> +
> /*
>  * LIBXL_HAVE_MAX_GRANT_VERSION indicates libxl_domain_build_info has a
>  * max_grant_version field for setting the max grant table version per
> diff --git a/tools/include/xen-tools/arm-arch-capabilities.h 
> b/tools/include/xen-tools/arm-arch-capabilities.h
> new file mode 100644
> index 000000000000..3849e897925d
> --- /dev/null
> +++ b/tools/include/xen-tools/arm-arch-capabilities.h
> @@ -0,0 +1,28 @@
> +/* SPDX-License-Identifier: LGPL-2.1-only */
> +/*
> + * Copyright (C) 2023 ARM Ltd.
> + */
> +
> +#ifndef ARM_ARCH_CAPABILITIES_H
> +#define ARM_ARCH_CAPABILITIES_H
> +
> +#include <stdint.h>
> +#include <xen/sysctl.h>
> +
> +#include <xen-tools/common-macros.h>
> +
> +static inline
> +unsigned int arch_capabilities_arm_sve(unsigned int arch_capabilities)
> +{
> +#if defined(__aarch64__)
> +    unsigned int sve_vl = MASK_EXTR(arch_capabilities,
> +                                    XEN_SYSCTL_PHYSCAP_ARM_SVE_MASK);
> +
> +    /* Vector length is divided by 128 before storing it in 
> arch_capabilities */
> +    return sve_vl * 128U;
> +#else
> +    return 0;
> +#endif
> +}
> +
> +#endif /* ARM_ARCH_CAPABILITIES_H */
> diff --git a/tools/include/xen-tools/common-macros.h 
> b/tools/include/xen-tools/common-macros.h
> index 76b55bf62085..d53b88182560 100644
> --- a/tools/include/xen-tools/common-macros.h
> +++ b/tools/include/xen-tools/common-macros.h
> @@ -72,6 +72,8 @@
> #define ROUNDUP(_x,_w) (((unsigned long)(_x)+(1UL<<(_w))-1) & 
> ~((1UL<<(_w))-1))
> #endif
> 
> +#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m)))
> +
> #ifndef __must_check
> #define __must_check __attribute__((__warn_unused_result__))
> #endif
> diff --git a/tools/libs/light/libxl.c b/tools/libs/light/libxl.c
> index a0bf7d186f69..175d6dde0b80 100644
> --- a/tools/libs/light/libxl.c
> +++ b/tools/libs/light/libxl.c
> @@ -409,6 +409,7 @@ int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo 
> *physinfo)
>         !!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_gnttab_v1);
>     physinfo->cap_gnttab_v2 =
>         !!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_gnttab_v2);
> +    physinfo->arch_capabilities = xcphysinfo.arch_capabilities;
> 
>     GC_FREE;
>     return 0;
> diff --git a/tools/libs/light/libxl_internal.h 
> b/tools/libs/light/libxl_internal.h
> index 5244fde6239a..8aba3e138909 100644
> --- a/tools/libs/light/libxl_internal.h
> +++ b/tools/libs/light/libxl_internal.h
> @@ -132,7 +132,6 @@
> 
> #define DIV_ROUNDUP(n, d) (((n) + (d) - 1) / (d))
> 
> -#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m)))
> #define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m))
> 
> #define LIBXL__LOGGING_ENABLED
> diff --git a/tools/libs/light/libxl_types.idl 
> b/tools/libs/light/libxl_types.idl
> index c10292e0d7e3..fd31dacf7d5a 100644
> --- a/tools/libs/light/libxl_types.idl
> +++ b/tools/libs/light/libxl_types.idl
> @@ -1133,6 +1133,7 @@ libxl_physinfo = Struct("physinfo", [
>     ("cap_vpmu", bool),
>     ("cap_gnttab_v1", bool),
>     ("cap_gnttab_v2", bool),
> +    ("arch_capabilities", uint32),
>     ], dir=DIR_OUT)
> 
> libxl_connectorinfo = Struct("connectorinfo", [
> diff --git a/tools/ocaml/libs/xc/xenctrl.ml b/tools/ocaml/libs/xc/xenctrl.ml
> index e4096bf92c1d..bf23ca50bb15 100644
> --- a/tools/ocaml/libs/xc/xenctrl.ml
> +++ b/tools/ocaml/libs/xc/xenctrl.ml
> @@ -128,12 +128,10 @@ type physinfo_cap_flag =
>   | CAP_Gnttab_v1
>   | CAP_Gnttab_v2
> 
> -type arm_physinfo_cap_flag
> -
> type x86_physinfo_cap_flag
> 
> type arch_physinfo_cap_flags =
> -  | ARM of arm_physinfo_cap_flag list
> +  | ARM of int
>   | X86 of x86_physinfo_cap_flag list
> 
> type physinfo =
> diff --git a/tools/ocaml/libs/xc/xenctrl.mli b/tools/ocaml/libs/xc/xenctrl.mli
> index ef2254537430..ed1e28ea30a0 100644
> --- a/tools/ocaml/libs/xc/xenctrl.mli
> +++ b/tools/ocaml/libs/xc/xenctrl.mli
> @@ -113,12 +113,10 @@ type physinfo_cap_flag =
>   | CAP_Gnttab_v1
>   | CAP_Gnttab_v2
> 
> -type arm_physinfo_cap_flag
> -
> type x86_physinfo_cap_flag
> 
> type arch_physinfo_cap_flags =
> -  | ARM of arm_physinfo_cap_flag list
> +  | ARM of int
>   | X86 of x86_physinfo_cap_flag list
> 
> type physinfo = {
> diff --git a/tools/ocaml/libs/xc/xenctrl_stubs.c 
> b/tools/ocaml/libs/xc/xenctrl_stubs.c
> index f686db3124ee..a03da31f6f2c 100644
> --- a/tools/ocaml/libs/xc/xenctrl_stubs.c
> +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c
> @@ -851,13 +851,15 @@ CAMLprim value stub_xc_physinfo(value xch_val)
> arch_cap_list = Tag_cons;
> 
> arch_cap_flags_tag = 1; /* tag x86 */
> -#else
> - caml_failwith("Unhandled architecture");
> -#endif
> 
> arch_cap_flags = caml_alloc_small(1, arch_cap_flags_tag);
> Store_field(arch_cap_flags, 0, arch_cap_list);
> Store_field(physinfo, 10, arch_cap_flags);
> +#elif defined(__aarch64__)
> + Store_field(physinfo, 10, Val_int(c_physinfo.arch_capabilities));
> +#else
> + caml_failwith("Unhandled architecture");
> +#endif
> 
> CAMLreturn(physinfo);
> }
> diff --git a/tools/python/xen/lowlevel/xc/xc.c 
> b/tools/python/xen/lowlevel/xc/xc.c
> index 9728b34185ac..491e88977fd3 100644
> --- a/tools/python/xen/lowlevel/xc/xc.c
> +++ b/tools/python/xen/lowlevel/xc/xc.c
> @@ -22,6 +22,7 @@
> #include <xen/hvm/hvm_info_table.h>
> #include <xen/hvm/params.h>
> 
> +#include <xen-tools/arm-arch-capabilities.h>
> #include <xen-tools/common-macros.h>
> 
> /* Needed for Python versions earlier than 2.3. */
> @@ -871,6 +872,7 @@ static PyObject *pyxc_physinfo(XcObject *self)
>     const char *virtcap_names[] = { "hvm", "pv" };
>     const unsigned virtcaps_bits[] = { XEN_SYSCTL_PHYSCAP_hvm,
>                                        XEN_SYSCTL_PHYSCAP_pv };
> +    PyObject *objret;
> 
>     if ( xc_physinfo(self->xc_handle, &pinfo) != 0 )
>         return pyxc_error_to_exception(self->xc_handle);
> @@ -897,17 +899,35 @@ static PyObject *pyxc_physinfo(XcObject *self)
>     if ( p != virt_caps )
>       *(p-1) = '\0';
> 
> -    return Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:l,s:l,s:i,s:s,s:s}",
> -                            "nr_nodes",         pinfo.nr_nodes,
> -                            "threads_per_core", pinfo.threads_per_core,
> -                            "cores_per_socket", pinfo.cores_per_socket,
> -                            "nr_cpus",          pinfo.nr_cpus,
> -                            "total_memory",     
> pages_to_kib(pinfo.total_pages),
> -                            "free_memory",      
> pages_to_kib(pinfo.free_pages),
> -                            "scrub_memory",     
> pages_to_kib(pinfo.scrub_pages),
> -                            "cpu_khz",          pinfo.cpu_khz,
> -                            "hw_caps",          cpu_cap,
> -                            "virt_caps",        virt_caps);
> +    objret = Py_BuildValue("{s:i,s:i,s:i,s:i,s:l,s:l,s:l,s:i,s:s,s:s}",
> +                           "nr_nodes",         pinfo.nr_nodes,
> +                           "threads_per_core", pinfo.threads_per_core,
> +                           "cores_per_socket", pinfo.cores_per_socket,
> +                           "nr_cpus",          pinfo.nr_cpus,
> +                           "total_memory",     
> pages_to_kib(pinfo.total_pages),
> +                           "free_memory",      
> pages_to_kib(pinfo.free_pages),
> +                           "scrub_memory",     
> pages_to_kib(pinfo.scrub_pages),
> +                           "cpu_khz",          pinfo.cpu_khz,
> +                           "hw_caps",          cpu_cap,
> +                           "virt_caps",        virt_caps);
> +
> +#if defined(__aarch64__)
> +    if ( objret ) {
> +        unsigned int sve_vl_bits;
> +        PyObject *py_arm_sve_vl;
> +
> +        sve_vl_bits = arch_capabilities_arm_sve(pinfo.arch_capabilities);
> +        py_arm_sve_vl = PyLong_FromUnsignedLong(sve_vl_bits);
> +
> +        if ( !py_arm_sve_vl )
> +            return NULL;
> +
> +        if( PyDict_SetItemString(objret, "arm_sve_vl", py_arm_sve_vl) )
> +            return NULL;
> +    }
> +#endif
> +
> +    return objret;
> }
> 
> static PyObject *pyxc_getcpuinfo(XcObject *self, PyObject *args, PyObject 
> *kwds)
> diff --git a/tools/xl/xl_info.c b/tools/xl/xl_info.c
> index 712b7638b013..ddc42f96b979 100644
> --- a/tools/xl/xl_info.c
> +++ b/tools/xl/xl_info.c
> @@ -27,6 +27,7 @@
> #include <libxl_json.h>
> #include <libxl_utils.h>
> #include <libxlutil.h>
> +#include <xen-tools/arm-arch-capabilities.h>
> 
> #include "xl.h"
> #include "xl_utils.h"
> @@ -224,6 +225,13 @@ static void output_physinfo(void)
>          info.cap_gnttab_v2 ? " gnttab-v2" : ""
>         );
> 
> +    /* Print arm SVE vector length only on ARM platforms */
> +#if defined(__aarch64__)
> +    maybe_printf("arm_sve_vector_length  : %u\n",
> +         arch_capabilities_arm_sve(info.arch_capabilities)
> +        );
> +#endif
> +
>     vinfo = libxl_get_version_info(ctx);
>     if (vinfo) {
>         i = (1 << 20) / vinfo->pagesize;
> -- 
> 2.34.1
> 
> 


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.