On 06/09/2019 16:18, Jan Beulich wrote:
> On 05.09.2019 21:49, Andrew Cooper wrote:
>> --- a/xen/arch/x86/cpuid.c
>> +++ b/xen/arch/x86/cpuid.c
>> @@ -21,45 +21,62 @@ static const uint32_t deep_features[] = 
>> INIT_DEEP_FEATURES;
>>  
>>  static int __init parse_xen_cpuid(const char *s)
>>  {
>> +    static const struct feature {
>> +        const char *name;
>> +        unsigned int bit;
>> +    } features[] __initconst = INIT_FEATURE_NAMES, *lhs, *mid, *rhs;
> The pointer field want this to use __initconstrel.

Ok.

> And I don't think you mean lhs, mid, and rhs to also be static?

No - not intentional.

>  Albeit ...
>
>>      const char *ss;
>>      int val, rc = 0;
>>  
>>      do {
>> +        const char *feat;
>> +
>>          ss = strchr(s, ',');
>>          if ( !ss )
>>              ss = strchr(s, '\0');
>>  
>> -        if ( (val = parse_boolean("md-clear", s, ss)) >= 0 )
>> -        {
>> -            if ( !val )
>> -                setup_clear_cpu_cap(X86_FEATURE_MD_CLEAR);
>> -        }
>> -        else if ( (val = parse_boolean("ibpb", s, ss)) >= 0 )
>> -        {
>> -            if ( !val )
>> -                setup_clear_cpu_cap(X86_FEATURE_IBPB);
>> -        }
>> -        else if ( (val = parse_boolean("ibrsb", s, ss)) >= 0 )
>> -        {
>> -            if ( !val )
>> -                setup_clear_cpu_cap(X86_FEATURE_IBRSB);
>> -        }
>> -        else if ( (val = parse_boolean("stibp", s, ss)) >= 0 )
>> -        {
>> -            if ( !val )
>> -                setup_clear_cpu_cap(X86_FEATURE_STIBP);
>> -        }
>> -        else if ( (val = parse_boolean("l1d-flush", s, ss)) >= 0 )
>> -        {
>> -            if ( !val )
>> -                setup_clear_cpu_cap(X86_FEATURE_L1D_FLUSH);
>> -        }
>> -        else if ( (val = parse_boolean("ssbd", s, ss)) >= 0 )
>> +        /* Skip the 'no-' prefix for name comparisons. */
>> +        feat = s;
>> +        if ( strncmp(s, "no-", 3) == 0 )
>> +            feat += 3;
>> +
>> +        /* (Re)initalise lhs and rhs for binary search. */
>> +        lhs = features;
>> +        rhs = features + ARRAY_SIZE(features);
> ... the comment here suggests you do, but I don't currently see why.

We are inside a do { } () while loop, parsing something such as
cpuid=avx512,ss,smx

The binary search over the feature names needs to start again from
scratch for each new cpuid= list item.

Otherwise, the while ( lhs < rhs ) binary search will never be entered
for the second cpuid= item.

~Andrew

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Reply via email to