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

Re: [Xen-devel] [PATCH v2 18/30] x86/cpu: Rework AMD masking MSR setup



>>> On 05.02.16 at 14:42, <andrew.cooper3@xxxxxxxxxx> wrote:
> @@ -126,126 +133,189 @@ static const struct cpuidmask *__init noinline 
> get_cpuidmask(const char *opt)
>  }
>  
>  /*
> + * Sets caps in expected_levelling_cap, probes for the specified mask MSR, 
> and
> + * set caps in levelling_caps if it is found.  Processors prior to Fam 10h
> + * required a 32-bit password for masking MSRs.  Reads the default value into
> + * msr_val.
> + */
> +static void __init __probe_mask_msr(unsigned int msr, uint64_t caps,

Please reduce the leading underscores to at most one.

> +                                    uint64_t *msr_val)
> +{
> +     unsigned int hi, lo;
> +
> +        expected_levelling_cap |= caps;

Indentation.

> +     if ((rdmsr_amd_safe(msr, &lo, &hi) == 0) &&
> +         (wrmsr_amd_safe(msr, lo, hi) == 0))
> +             levelling_caps |= caps;
> +
> +     *msr_val = ((uint64_t)hi << 32) | lo;
> +}

Why can't this function, currently returning void, simply return the
value read?

> +/*
> + * Context switch levelling state to the next domain.  A parameter of NULL is
> + * used to context switch to the default host state, and is used by the 
> BSP/AP
> + * startup code.
> + */
> +static void amd_ctxt_switch_levelling(const struct domain *nextd)
> +{
> +     struct cpuidmasks *these_masks = &this_cpu(cpuidmasks);
> +     const struct cpuidmasks *masks = &cpuidmask_defaults;

May I suggest naming this "defaults", to aid clarity of the code
below?

> +#define LAZY(cap, msr, field)                                                
> \
> +     ({                                                              \
> +             if (((levelling_caps & cap) == cap) &&                  \
> +                 (these_masks->field != masks->field))               \

Perhaps worth swapping the operands of the && and wrapping
the then left side of it in unlikely(), to hopefully make the most
desirable route through this function a branch-less one?

> +static void __init noinline amd_init_levelling(void)
>  {
> -     static unsigned int feat_ecx, feat_edx;
> -     static unsigned int extfeat_ecx, extfeat_edx;
> -     static unsigned int l7s0_eax, l7s0_ebx;
> -     static unsigned int thermal_ecx;
> -     static bool_t skip_feat, skip_extfeat;
> -     static bool_t skip_l7s0_eax_ebx, skip_thermal_ecx;
> -     static enum { not_parsed, no_mask, set_mask } status;
> -     unsigned int eax, ebx, ecx, edx;
> -
> -     if (status == no_mask)
> -             return;
> +     const struct cpuidmask *m = NULL;
>  
> -     if (status == set_mask)
> -             goto setmask;
> +     probe_masking_msrs();
>  
> -     ASSERT((status == not_parsed) && (c == &boot_cpu_data));
> -     status = no_mask;
> +     if (*opt_famrev != '\0') {
> +             m = get_cpuidmask(opt_famrev);
>  
> -     /* Fam11 doesn't support masking at all. */
> -     if (c->x86 == 0x11)
> -             return;
> +             if (!m)
> +                     printk("Invalid processor string: %s\n", opt_famrev);
> +     }
>  
> -     if (~(opt_cpuid_mask_ecx & opt_cpuid_mask_edx &
> -           opt_cpuid_mask_ext_ecx & opt_cpuid_mask_ext_edx &
> -           opt_cpuid_mask_l7s0_eax & opt_cpuid_mask_l7s0_ebx &
> -           opt_cpuid_mask_thermal_ecx)) {
> -             feat_ecx = opt_cpuid_mask_ecx;
> -             feat_edx = opt_cpuid_mask_edx;
> -             extfeat_ecx = opt_cpuid_mask_ext_ecx;
> -             extfeat_edx = opt_cpuid_mask_ext_edx;
> -             l7s0_eax = opt_cpuid_mask_l7s0_eax;
> -             l7s0_ebx = opt_cpuid_mask_l7s0_ebx;
> -             thermal_ecx = opt_cpuid_mask_thermal_ecx;
> -     } else if (*opt_famrev == '\0') {
> -             return;
> -     } else {
> -             const struct cpuidmask *m = get_cpuidmask(opt_famrev);
> +     if ((levelling_caps & LCAP_1cd) == LCAP_1cd) {
> +             uint32_t ecx, edx, tmp;
>  
> -             if (!m) {
> -                     printk("Invalid processor string: %s\n", opt_famrev);
> -                     printk("CPUID will not be masked\n");
> -                     return;
> +             cpuid(0x00000001, &tmp, &tmp, &ecx, &edx);

Didn't you collect raw CPUID output already?

> +             if(~(opt_cpuid_mask_ecx & opt_cpuid_mask_edx)) {
> +                     ecx &= opt_cpuid_mask_ecx;
> +                     edx &= opt_cpuid_mask_edx;
> +             } else if ( m ) {

Partial Xen coding style slipped in here.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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