[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <YWCAeCIYovTnqvbd@zn.tnic>
Date: Fri, 8 Oct 2021 19:31:36 +0200
From: Borislav Petkov <bp@...en8.de>
To: Kuppuswamy Sathyanarayanan
<sathyanarayanan.kuppuswamy@...ux.intel.com>
Cc: Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...hat.com>, x86@...nel.org,
Paolo Bonzini <pbonzini@...hat.com>,
David Hildenbrand <david@...hat.com>,
Andrea Arcangeli <aarcange@...hat.com>,
Josh Poimboeuf <jpoimboe@...hat.com>,
Juergen Gross <jgross@...e.com>, Deep Shah <sdeep@...are.com>,
VMware Inc <pv-drivers@...are.com>,
Vitaly Kuznetsov <vkuznets@...hat.com>,
Wanpeng Li <wanpengli@...cent.com>,
Jim Mattson <jmattson@...gle.com>,
Joerg Roedel <joro@...tes.org>, Peter H Anvin <hpa@...or.com>,
Dave Hansen <dave.hansen@...el.com>,
Tony Luck <tony.luck@...el.com>,
Dan Williams <dan.j.williams@...el.com>,
Andi Kleen <ak@...ux.intel.com>,
Kirill Shutemov <kirill.shutemov@...ux.intel.com>,
Sean Christopherson <seanjc@...gle.com>,
Kuppuswamy Sathyanarayanan <knsathya@...nel.org>,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH v8 07/11] x86/tdx: Add HLT support for TDX guest
On Mon, Oct 04, 2021 at 07:52:01PM -0700, Kuppuswamy Sathyanarayanan wrote:
> @@ -240,6 +243,33 @@ SYM_FUNC_START(__tdx_hypercall)
>
> movl $TDVMCALL_EXPOSE_REGS_MASK, %ecx
>
> + /*
> + * For the idle loop STI needs to be called directly before
> + * the TDCALL that enters idle (EXIT_REASON_HLT case). STI
> + * enables interrupts only one instruction later. If there
> + * are any instructions between the STI and the TDCALL for
> + * HLT then an interrupt could happen in that time, but the
> + * code would go back to sleep afterwards, which can cause
> + * longer delays.
> + *
> + * This leads to significant difference in network performance
> + * benchmarks. So add a special case for EXIT_REASON_HLT to
> + * trigger STI before TDCALL. But this change is not required
> + * for all HLT cases. So use R15 register value to identify the
> + * case which needs STI. So, if R11 is EXIT_REASON_HLT and R15
> + * is 1, then call STI before TDCALL instruction. Note that R15
> + * register is not required by TDCALL ABI when triggering the
> + * hypercall for EXIT_REASON_HLT case. So use it in software to
> + * select the STI case.
> + */
> + cmpl $EXIT_REASON_HLT, %r11d
> + jne skip_sti
> + cmpl $1, %r15d
> + jne skip_sti
> + /* Set R15 register to 0, it is unused in EXIT_REASON_HLT case */
> + xor %r15, %r15
Then you don't need to clear it either, right?
> + sti
> +skip_sti:
> tdcall
>
> /* Restore output pointer to R9 */
...
> +static __cpuidle void tdx_halt(void)
> +{
> + const bool irq_disabled = irqs_disabled();
> + const bool do_sti = false;
> +
> + /*
> + * Non safe halt is mainly used in CPU off-lining
> + * and the guest will stay in halt state. So,
> + * STI instruction call is not required (set
> + * do_sti as false).
> + */
Just like you've done below, put the comment over the variable assignment:
/*
* Non safe halt is mainly used in CPU offlining and the guest will stay in halt
* state. So, STI instruction call is not required.
*/
const bool do_sti = false;
> + _tdx_halt(irq_disabled, do_sti);
> +}
> +
> +static __cpuidle void tdx_safe_halt(void)
> +{
> + /*
> + * Since STI instruction will be called in __tdx_hypercall()
> + * set irq_disabled as false.
> + */
> + const bool irq_disabled = false;
> + const bool do_sti = true;
> +
> + _tdx_halt(irq_disabled, do_sti);
> +}
> +
> unsigned long tdx_get_ve_info(struct ve_info *ve)
> {
> struct tdx_module_output out = {0};
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette
Powered by blists - more mailing lists