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

Re: [Xen-devel] [PATCH 1/6] x86/AMD Split init_amd() into per-uarch helpers



>>> On 28.12.18 at 13:39, <andrew.cooper3@xxxxxxxxxx> wrote:
> This reduces the complexity of init_amd(), and collects related
> workarounds together.
> 
> It also offers us the opportunity to stop performing workarounds when
> virtualised - doing so is wasteful, as it all involves poking MSRs which
> no hypervisor will let us touch in practice.

No _current_ hypervisor - perhaps. But a really good one might
emulate at least some of them.

> --- a/xen/arch/x86/cpu/amd.c
> +++ b/xen/arch/x86/cpu/amd.c
> @@ -534,22 +534,165 @@ static void early_init_amd(struct cpuinfo_x86 *c)
>       ctxt_switch_levelling(NULL);
>  }
>  
> +static void init_amd_k8(struct cpuinfo_x86 *c)
> +{
> +    uint64_t val;
> +
> +    /*
> +     * Skip errata workarounds if we are virtualised.  We won't have
> +     * sufficient control of hardware to do anything useful.
> +     */
> +    if ( !cpu_has_hypervisor )
> +        return;

Note how you then also skip ...

> +    /*
> +     * Disable TLB flush filter by setting HWCR.FFDIS bit 6
> +     *
> +     * Erratum 63 for SH-B3 steppings
> +     * Erratum 122 for all steppings (F+ have it disabled by default)
> +     */
> +    rdmsrl(MSR_K7_HWCR, val);
> +    if ( !(val & (1u << 6)) )
> +        wrmsrl(MSR_K7_HWCR, val | (1u << 6));
> +
> +    /*
> +     * Some BIOSes incorrectly force LAHF_LM, but only revisions D and later
> +     * actually support it.
> +     *
> +     * AMD Erratum #110, docId: 25759.
> +     */
> +    if ( c->x86_model < 0x14 && cpu_has(c, X86_FEATURE_LAHF_LM) )
> +    {
> +        unsigned int l, h;
> +
> +        __clear_bit(X86_FEATURE_LAHF_LM, c->x86_capability);

... this. If we expect lower level hypervisors to have fixed this already, we
should imo panic() here (and perhaps in further places) if we still find it 
wrong
(or what we consider wrong).

> +static void init_amd_k10(struct cpuinfo_x86 *c)
> +{
> +    uint64_t val;
> +
> +    /* Pointless to use MWAIT on Family10 as it does not deep sleep. */
> +    __clear_bit(X86_FEATURE_MONITOR, c->x86_capability);

See how you have this ahead of the virtualization check here?

> +static void init_amd_bulldozer(struct cpuinfo_x86 *c) /* Fam 15h */
> +{
> +    uint64_t val;
> +
> +    /*
> +     * Skip errata workarounds if we are virtualised.  We won't have
> +     * sufficient control of hardware to do anything useful.
> +     */
> +    if ( !cpu_has_hypervisor )
> +        return;
> +
> +    /* re-enable TopologyExtensions if switched off by BIOS */
> +    if ( c->x86_model >= 0x10 && c->x86_model <= 0x1f &&
> +         !cpu_has(c, X86_FEATURE_TOPOEXT) &&
> +         !rdmsr_safe(MSR_K8_EXT_FEATURE_MASK, val) )
> +    {
> +        __set_bit(X86_FEATURE_TOPOEXT, c->x86_capability);
> +        wrmsr_safe(MSR_K8_EXT_FEATURE_MASK, val | (1ull << 54));
> +    }

This is one of the cases where I'd expect a good hypervisor to permit control.
Independent of this I think now would be a good opportunity to __set_bit()
only if WRMSR actually managed to flip the bit.

> +    /*
> @@ -694,73 +798,9 @@ static void init_amd(struct cpuinfo_x86 *c)
>                      "*** Pass \"allow_unsafe\" if you're trusting"
>                      " all your (PV) guest kernels. ***\n");
>  
> -     if (c->x86 == 0x16 && c->x86_model <= 0xf) {
> -             if (c == &boot_cpu_data) {
> -                     l = pci_conf_read32(0, 0, 0x18, 0x3, 0x58);
> -                     h = pci_conf_read32(0, 0, 0x18, 0x3, 0x5c);
> -                     if ((l & 0x1f) | (h & 0x1))
> -                             printk(KERN_WARNING
> -                                    "Applying workaround for erratum 792: 
> %s%s%s\n",
> -                                    (l & 0x1f) ? "clearing D18F3x58[4:0]" : 
> "",
> -                                    ((l & 0x1f) && (h & 0x1)) ? " and " : "",
> -                                    (h & 0x1) ? "clearing D18F3x5C[0]" : "");
> -
> -                     if (l & 0x1f)
> -                             pci_conf_write32(0, 0, 0x18, 0x3, 0x58,
> -                                              l & ~0x1f);
> -
> -                     if (h & 0x1)
> -                             pci_conf_write32(0, 0, 0x18, 0x3, 0x5c,
> -                                              h & ~0x1);
> -             }
> -
> -             rdmsrl(MSR_AMD64_LS_CFG, value);
> -             if (!(value & (1 << 15))) {
> -                     static bool_t warned;
> -
> -                     if (c == &boot_cpu_data || opt_cpu_info ||
> -                         !test_and_set_bool(warned))
> -                             printk(KERN_WARNING
> -                                    "CPU%u: Applying workaround for erratum 
> 793\n",
> -                                    smp_processor_id());
> -                     wrmsrl(MSR_AMD64_LS_CFG, value | (1 << 15));
> -             }
> -     } else if (c->x86 == 0x12) {
> -             rdmsrl(MSR_AMD64_DE_CFG, value);
> -             if (!(value & (1U << 31))) {
> -                     static bool warned;
> -
> -                     if (c == &boot_cpu_data || opt_cpu_info ||
> -                         !test_and_set_bool(warned))
> -                             printk(KERN_WARNING
> -                                    "CPU%u: Applying workaround for erratum 
> 665\n",
> -                                    smp_processor_id());

While I agree with your consistency argument, messages like this one are meant 
to
hint at an outdated BIOS, which I think is helpful and hence I'm not convinced 
should
be dropped despite similar messages missing elsewhere.

Jan


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

 


Rackspace

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