|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [RFC PATCH 2/8] xen/arm: add sve_vl_bits field to domain
>>>> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
>>>> index 8ea3843ea8e8..27f38729302b 100644
>>>> --- a/xen/arch/arm/domain.c
>>>> +++ b/xen/arch/arm/domain.c
>>>> @@ -13,6 +13,7 @@
>>>> #include <xen/wait.h>
>>>> #include <asm/alternative.h>
>>>> +#include <asm/arm64/sve.h>
>>>> #include <asm/cpuerrata.h>
>>>> #include <asm/cpufeature.h>
>>>> #include <asm/current.h>
>>>> @@ -183,6 +184,11 @@ static void ctxt_switch_to(struct vcpu *n)
>>>> WRITE_SYSREG(n->arch.cptr_el2, CPTR_EL2);
>>>> +#ifdef CONFIG_ARM64_SVE
>>>> + if ( is_sve_domain(n->domain) )
>>>> + WRITE_SYSREG(n->arch.zcr_el2, ZCR_EL2);
>>>> +#endif
>>>
>>> I would actually expect that is_sve_domain() returns false when the SVE is
>>> not enabled. So can we simply remove the #ifdef?
>> I was tricked by it too, the arm32 build will fail because it doesn’t know
>> ZCR_EL2
>
> Ok. In which case, I think we should move the call to sve_restore_state().
Ok for me, I will move the zcr_el2 introduction together with the context
switch code introduced by the patch
later.
>
>>>
>>>> +
>>>> /* VFP */
>>>> vfp_restore_state(n);
>>>> @@ -551,6 +557,11 @@ int arch_vcpu_create(struct vcpu *v)
>>>> v->arch.vmpidr = MPIDR_SMP | vcpuid_to_vaffinity(v->vcpu_id);
>>>> v->arch.cptr_el2 = get_default_cptr_flags();
>>>> + if ( is_sve_domain(v->domain) )
>>>> + {
>>>> + v->arch.cptr_el2 &= ~HCPTR_CP(8);
>>>> + v->arch.zcr_el2 = vl_to_zcr(v->domain->arch.sve_vl_bits);
>>>> + }
>>>> v->arch.hcr_el2 = get_default_hcr_flags();
>>>> @@ -595,6 +606,7 @@ int arch_sanitise_domain_config(struct
>>>> xen_domctl_createdomain *config)
>>>> unsigned int max_vcpus;
>>>> unsigned int flags_required = (XEN_DOMCTL_CDF_hvm |
>>>> XEN_DOMCTL_CDF_hap);
>>>> unsigned int flags_optional = (XEN_DOMCTL_CDF_iommu |
>>>> XEN_DOMCTL_CDF_vpmu);
>>>> + unsigned int sve_vl_bits = config->arch.sve_vl_bits;
>>>> if ( (config->flags & ~flags_optional) != flags_required )
>>>> {
>>>> @@ -603,6 +615,36 @@ int arch_sanitise_domain_config(struct
>>>> xen_domctl_createdomain *config)
>>>> return -EINVAL;
>>>> }
>>>> + /* Check feature flags */
>>>> + if ( sve_vl_bits > 0 ) {
>>>> + unsigned int zcr_max_bits;
>>>> +
>>>> + if ( !cpu_has_sve )
>>>> + {
>>>> + dprintk(XENLOG_INFO, "SVE is unsupported on this machine.\n");
>>>> + return -EINVAL;
>>>> + }
>>>> + else if ( !is_vl_valid(sve_vl_bits) )
>>>> + {
>>>> + dprintk(XENLOG_INFO, "Unsupported SVE vector length (%u)\n",
>>>> + sve_vl_bits);
>>>> + return -EINVAL;
>>>> + }
>>>> + /*
>>>> + * get_sys_vl_len() is the common safe value among all cpus, so
>>>> if the
>>>> + * value specified by the user is above that value, use the safe
>>>> value
>>>> + * instead.
>>>> + */
>>>> + zcr_max_bits = get_sys_vl_len();
>>>> + if ( sve_vl_bits > zcr_max_bits )
>>>> + {
>>>> + config->arch.sve_vl_bits = zcr_max_bits;
>>>> + dprintk(XENLOG_INFO,
>>>> + "SVE vector length lowered to %u, safe value among
>>>> CPUs\n",
>>>> + zcr_max_bits);
>>>> + }
>>>
>>> I don't think Xen should "downgrade" the value. Instead, this should be the
>>> decision from the tools. So we want to find a different way to reproduce
>>> the value (Andrew may have some ideas here as he was looking at it).
>> Can you explain this in more details?
>
> I would extend XEN_SYSCTL_physinfo to return the maximum SVE vecto length
> supported by the Hardware.
>
> Libxl would then read the value and compare to what the user requested. This
> would then be up to the toolstack to decide what to do.
Sounds good, looking into struct xen_sysctl_physinfo, seems that I might be the
first user of the arch_capabilities field
(as well as introducing a new one for the VL value), where can I put the define
for the arch_capabilities flag?
Is it ok inside sysctl.h something along these lines:
#define XEN_SYSCTL_PHYSCAP_ARM_SVE (1u << 0)
or
#define XEN_SYSCTL_PHYSCAP_ARM_SVE (1u)
And, is it ok to put the VL value in the struct xen_sysctl_physinfo even if
it’s just for arm64?
>
>> By the tools you mean xl?
>
> I think libxl should do strict checking. If we also want to reduce what the
> user requested, then this part should be in xl.
>
>> This would be ok for DomUs, but how to do it for Dom0?
> Then we should fail to create dom0 and say the vector-length requested is not
> supported.
Fine for me
>
> Cheers,
>
> --
> Julien Grall
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |