|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/3] mwait-idle: add support for using halt
On Wed, Feb 27, 2019 at 06:23:35PM +0000, Woods, Brian wrote:
> On 2/27/19 7:47 AM, Wei Liu wrote:
> > On Mon, Feb 25, 2019 at 08:23:58PM +0000, Woods, Brian wrote:
> >> Some AMD processors can use a mixture of mwait and halt for accessing
> >> various c-states. In preparation for adding support for AMD processors,
> >> update the mwait-idle driver to optionally use halt.
> >>
> >> Signed-off-by: Brian Woods <brian.woods@xxxxxxx>
> >> ---
> >> xen/arch/x86/cpu/mwait-idle.c | 40
> >> +++++++++++++++++++++++++++++++++-------
> >> 1 file changed, 33 insertions(+), 7 deletions(-)
> >>
> >> diff --git a/xen/arch/x86/cpu/mwait-idle.c b/xen/arch/x86/cpu/mwait-idle.c
> >> index f89c52f256..a063e39d60 100644
> >> --- a/xen/arch/x86/cpu/mwait-idle.c
> >> +++ b/xen/arch/x86/cpu/mwait-idle.c
> >> @@ -103,6 +103,11 @@ static const struct cpuidle_state {
> >>
> >> #define CPUIDLE_FLAG_DISABLED 0x1
> >> /*
> >> + * On certain AMD families that support mwait, only c1 can be reached by
> >> + * mwait and to reach c2, halt has to be used.
> >> + */
> >> +#define CPUIDLE_FLAG_USE_HALT 0x2
> >> +/*
> >> * Set this flag for states where the HW flushes the TLB for us
> >> * and so we don't need cross-calls to keep it consistent.
> >> * If this flag is set, SW flushes the TLB, so even if the
> >> @@ -783,8 +788,23 @@ static void mwait_idle(void)
> >>
> >> update_last_cx_stat(power, cx, before);
> >>
> >> - if (cpu_is_haltable(cpu))
> >> - mwait_idle_with_hints(eax, MWAIT_ECX_INTERRUPT_BREAK);
> >> + if (cpu_is_haltable(cpu)) {
> >> + struct cpu_info *info;
> >> + switch (cx->entry_method) {
> >> + case ACPI_CSTATE_EM_FFH:
> >> + mwait_idle_with_hints(eax, MWAIT_ECX_INTERRUPT_BREAK);
> >> + break;
> >> + case ACPI_CSTATE_EM_HALT:
> >
> >> + info = get_cpu_info();
> >> + spec_ctrl_enter_idle(info);
> >> + safe_halt();
> >> + spec_ctrl_exit_idle(info);
> >
> > May I suggest you make this snippet a function? The same code snippet
> > appears a few lines above.
> >
> > Wei.
> >
> It's used in various other places as well (cpu_idle.c, x86/domain.c),
> would a function like:
>
> void safe_halt_with_spec(cpu_info *info)
> {
> if (!info)
> info = get_cpu_info();
>
> spec_ctrl_enter_idle(info);
> safe_halt();
> spec_ctrl_exit_idle(info);
> }
>
> work since that way it could be used in other places where info is
> already defined?
Looks reasonable. But I will leave that to Andrew and Jan to decide what
suits them best.
Wei.
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxxx
> https://lists.xenproject.org/mailman/listinfo/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |