[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v5 07/12] xen: enable Dom0 to use SVE feature
> On 20 Apr 2023, at 14:08, Julien Grall <julien@xxxxxxx> wrote: > > Hi Luca, > > On 20/04/2023 13:43, Luca Fancellu wrote: >>> On 20 Apr 2023, at 13:29, Julien Grall <julien@xxxxxxx> wrote: >>> >>> Hi Luca, >>> >>> On 20/04/2023 09:46, Luca Fancellu wrote: >>>>>>>>> +int __init sve_sanitize_vl_param(int val, unsigned int *out) >>>>>>>>> +{ >>>>>>>>> + /* >>>>>>>>> + * Negative SVE parameter value means to use the maximum >>>>>>>>> supported >>>>>>>>> + * vector length, otherwise if a positive value is provided, >>>>>>>>> check if the >>>>>>>>> + * vector length is a multiple of 128 and not bigger than the >>>>>>>>> maximum value >>>>>>>>> + * 2048 >>>>>>>>> + */ >>>>>>>>> + if ( val < 0 ) >>>>>>>>> + *out = get_sys_vl_len(); >>>>>>>>> + else if ( ((val % SVE_VL_MULTIPLE_VAL) == 0) && (val <= >>>>>>>>> SVE_VL_MAX_BITS) ) >>>>>>>>> + *out = val; >>>>>>>> >>>>>>>> Shouldn't you also check if it is not greater than the maximum vector >>>>>>>> length ? >>>>>>> >>>>>>> I don’t understand, I am checking that the value is below or equal to >>>>>>> SVE_VL_MAX_BITS, >>>>>>> If you mean if it should be checked also against the maximum supported >>>>>>> length by the platform, >>>>>>> I think this is not the right place, the check is already in >>>>>>> arch_sanitise_domain_config(), introduced >>>>>>> in patch #2 >>>>>> >>>>>> If this is not the right place to check it then why checking the rest >>>>>> here ? >>>>>> >>>>>> From a user or a developer point of view I would expect the validity of >>>>>> the input to be checked only >>>>>> in one place. >>>>>> If here is not the place for that it is ok but then i would check >>>>>> everything in arch_sanitise_domain_config >>>>>> (multiple, min and supported) instead of doing it partly in 2 places. >>>>> >>>>> Ok, given the way we encoded the value in xen_domctl_createdomain >>>>> structure, we have that the value takes >>>>> very little space, but a small issue is that when we encode it, we are >>>>> dividing it by 128, which is fine for user params >>>>> that are multiple of 128, but it’s less fine if the user passes “129”. >>>>> >>>>> To overcome this issue we are checking the value when it is not already >>>>> encoded. Now, thinking about it, the check >>>>> "&& (val <= SVE_VL_MAX_BITS)” is not really needed, because even if the >>>>> value is above, then in arch_sanitise_domain_config >>>>> we will hit the top limit of the platform maximum VL. >>>>> >>>>> 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 = sve_decode_vl(config->arch.sve_vl); >>>>> >>>>> if ( (config->flags & ~flags_optional) != flags_required ) >>>>> { >>>>> dprintk(XENLOG_INFO, "Unsupported configuration %#x\n", >>>>> config->flags); >>>>> return -EINVAL; >>>>> } >>>>> >>>>> /* Check feature flags */ >>>>> if ( sve_vl_bits > 0 ) >>>>> { >>>>> unsigned int zcr_max_bits = get_sys_vl_len(); >>>>> >>>>> if ( !zcr_max_bits ) >>>>> { >>>>> dprintk(XENLOG_INFO, "SVE is unsupported on this machine.\n"); >>>>> return -EINVAL; >>>>> } >>>>> >>>>> if ( sve_vl_bits > zcr_max_bits ) >>>>> { >>>>> dprintk(XENLOG_INFO, >>>>> "Requested SVE vector length (%u) > supported length >>>>> (%u)\n", >>>>> sve_vl_bits, zcr_max_bits); >>>>> return -EINVAL; >>>>> } >>>>> } >>>>> [...] >>>>> >>>>> Now, I understand your point, we could check everything in >>>>> sve_sanitize_vl_param(), but it would leave a problem >>>>> for domains created by hypercalls if I am not wrong. >>>>> >>>>> What do you think? >>>> I thought about that and another possibility is to store “sve_vl” as >>>> uint16_t inside struct xen_arch_domainconfig, and >>>> check it inside arch_sanitise_domain_config() for it to be mod 128 and >>>> less than the max supported VL, this will >>>> allow to have all the checks in one place, taking a bit more space, anyway >>>> we would take the space from the implicit >>>> padding as this is the current status: >> Hi Julien, >>> >>> Sorry, I am having trouble to follow the discussion. If you are checking >>> the value in arch_sanitise_domain_config(), then why do you need to take >>> more space in arch_domain? >> Yes I am checking the value in arch_sanitise_domain_config, the value >> checked is from arch_domain and it is the vector length divided by 128, so >> an encoded value. > > I think this is where the disconnect is coming from. > arch_sanitise_domain_config() doesn't use struct arch_domain because the > domain itself is not yet allocated. Instead, it is using > xen_arch_domainconfig. > > I care less about the increase of xen_arch_domainconfig because this is a one > off structure. I’m sorry, yes, I meant struct xen_domctl_createdomain, sorry I got confused copying from this thread > >> Bertrand was puzzled by the fact that I also put a check in >> sve_sanitize_vl_param to see if the vector length passed by the user is mod >> 128, his point is that we should check a value only in one place and not in >> two, and it is a valid point but in this case we can’t put all the check >> into arch_sanitise_domain_config because we don’t have the “full” value from >> arch_domain, and we can’t put all the checks in sve_sanitize_vl_param >> because it will leave out from the check domains created by hyper calls. >> So to have only one point where the checks are done (mod 128 and <= HW >> supported VL), we might need to have a full resolution VL value in struct >> xen_arch_domainconfig (16 bit). >> But if we want to save space for the future, we could leave the code as it >> is and rely on the fact that the tools (or Xen) when creating the domain >> configuration, will check that the SVE VL parameter is mod 128. >> In this last case what is in struct xen_arch_domainconfig is implicitly mod >> 128 and only the upper boundary of the max supported VL will be checked by >> Xen inside arch_sanitise_domain_config. > > Before answering to the approach, can you explain why you ask the user to > pass a value that is a multiple of 128 rather than the already "divided" > value? Is it more natural for the user? Yes I thought is was more natural for the user to think about number of bits (for example 512) instead of an encoded value (4 in this case). > > Cheers, > > -- > Julien Grall
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |