|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 1/2] x86/idle: rework C6 EOI workaround
On 15.05.2020 15:58, Roger Pau Monne wrote:
> Change the C6 EOI workaround (errata AAJ72) to use x86_match_cpu. Also
> call the workaround from mwait_idle, previously it was only used by
> the ACPI idle driver. Finally make sure the routine is called for all
> states equal or greater than ACPI_STATE_C3, note that the ACPI driver
> doesn't currently handle them, but the errata condition shouldn't be
> limited by that.
>
> Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
with two nits:
> --- a/xen/arch/x86/acpi/cpu_idle.c
> +++ b/xen/arch/x86/acpi/cpu_idle.c
> @@ -548,26 +548,35 @@ void trace_exit_reason(u32 *irq_traced)
> }
> }
>
> -/*
> - * "AAJ72. EOI Transaction May Not be Sent if Software Enters Core C6 During
> - * an Interrupt Service Routine"
> - *
> - * There was an errata with some Core i7 processors that an EOI transaction
> - * may not be sent if software enters core C6 during an interrupt service
> - * routine. So we don't enter deep Cx state if there is an EOI pending.
> - */
> -static bool errata_c6_eoi_workaround(void)
> +bool errata_c6_eoi_workaround(void)
> {
> - static int8_t fix_needed = -1;
> + static int8_t __read_mostly fix_needed = -1;
>
> if ( unlikely(fix_needed == -1) )
> {
> - int model = boot_cpu_data.x86_model;
> - fix_needed = (cpu_has_apic && !directed_eoi_enabled &&
> - (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) &&
> - (boot_cpu_data.x86 == 6) &&
> - ((model == 0x1a) || (model == 0x1e) || (model == 0x1f)
> ||
> - (model == 0x25) || (model == 0x2c) || (model ==
> 0x2f)));
> +#define INTEL_FAM6_MODEL(m) { X86_VENDOR_INTEL, 6, m, X86_FEATURE_ALWAYS }
> + /*
> + * Errata AAJ72: EOI Transaction May Not be Sent if Software Enters
> + * Core C6 During an Interrupt Service Routine"
> + *
> + * There was an errata with some Core i7 processors that an EOI
> + * transaction may not be sent if software enters core C6 during an
> + * interrupt service routine. So we don't enter deep Cx state if
> + * there is an EOI pending.
> + */
> + const static struct x86_cpu_id eoi_errata[] = {
Commonly we use "static const".
> --- a/xen/arch/x86/cpu/mwait-idle.c
> +++ b/xen/arch/x86/cpu/mwait-idle.c
> @@ -770,6 +770,9 @@ static void mwait_idle(void)
> return;
> }
>
> + if ((cx->type >= 3) && errata_c6_eoi_workaround())
> + cx = power->safe_state;
> +
> eax = cx->address;
> cstate = ((eax >> MWAIT_SUBSTATE_SIZE) & MWAIT_CSTATE_MASK) + 1;
>
> diff --git a/xen/include/asm-x86/cpuidle.h b/xen/include/asm-x86/cpuidle.h
> index 5d7dffd228..13879f58a1 100644
> --- a/xen/include/asm-x86/cpuidle.h
> +++ b/xen/include/asm-x86/cpuidle.h
> @@ -26,4 +26,5 @@ void update_idle_stats(struct acpi_processor_power *,
> void update_last_cx_stat(struct acpi_processor_power *,
> struct acpi_processor_cx *, uint64_t);
>
> +bool errata_c6_eoi_workaround(void);
> #endif /* __X86_ASM_CPUIDLE_H__ */
I'd prefer if a blank line was left ahead of #ifdef-s of this kind.
Both are easy enough to do while committing, I guess.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |