|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/5] x86/lbr: enable hypervisor LER with arch LBR
On Mon, Jul 04, 2022 at 08:15:15AM +0200, Jan Beulich wrote:
> On 01.07.2022 17:39, Roger Pau Monné wrote:
> > On Mon, May 30, 2022 at 05:31:18PM +0200, Jan Beulich wrote:
> >> On 20.05.2022 15:37, Roger Pau Monne wrote:
> >>> --- a/xen/arch/x86/include/asm/msr-index.h
> >>> +++ b/xen/arch/x86/include/asm/msr-index.h
> >>> @@ -139,6 +139,24 @@
> >>> #define PASID_PASID_MASK 0x000fffff
> >>> #define PASID_VALID (_AC(1, ULL) << 31)
> >>>
> >>> +#define MSR_ARCH_LBR_CTL 0x000014ce
> >>> +#define ARCH_LBR_CTL_LBREN (_AC(1, ULL) << 0)
> >>> +#define ARCH_LBR_CTL_OS (_AC(1, ULL) << 1)
> >>
> >> Bits 2 and 3 also have meaning (USR and CALL_STACK) according to
> >> ISE version 44. If it was intentional that you omitted those
> >> (perhaps you intended to add only the bits you actually use right
> >> away), it would have been nice if you said so in the description.
> >
> > Yes, I've only added the bits used. I could add all if that's better.
>
> Personally I'd slightly prefer if you added all. But if you don't, which
> is also okay, please make this explicit in the description.
>
> >>> --- a/xen/arch/x86/traps.c
> >>> +++ b/xen/arch/x86/traps.c
> >>> @@ -1963,6 +1963,29 @@ void do_device_not_available(struct cpu_user_regs
> >>> *regs)
> >>> #endif
> >>> }
> >>>
> >>> +static bool enable_lbr(void)
> >>> +{
> >>> + uint64_t debugctl;
> >>> +
> >>> + wrmsrl(MSR_IA32_DEBUGCTLMSR, IA32_DEBUGCTLMSR_LBR);
> >>> + rdmsrl(MSR_IA32_DEBUGCTLMSR, debugctl);
> >>> + if ( !(debugctl & IA32_DEBUGCTLMSR_LBR) )
> >>> + {
> >>> + /*
> >>> + * CPUs with no model-specific LBRs always return DEBUGCTLMSR.LBR
> >>> + * == 0, attempt to set arch LBR if available.
> >>> + */
> >>> + if ( !boot_cpu_has(X86_FEATURE_ARCH_LBR) )
> >>> + return false;
> >>> +
> >>> + /* Note that LASTINT{FROMIP,TOIP} matches LER_{FROM_IP,TO_IP} */
> >>> + wrmsrl(MSR_ARCH_LBR_CTL, ARCH_LBR_CTL_LBREN | ARCH_LBR_CTL_OS |
> >>> + ARCH_LBR_CTL_RECORD_ALL);
> >>> + }
> >>> +
> >>> + return true;
> >>> +}
> >>
> >> Would it make sense to try architectural LBRs first?
> >
> > I didn't want to change behavior for existing platforms that have
> > both architectural and model specific LBRs.
>
> Are there such platforms? While it may not be said explicitly, so far
> I took it that the LBR format indicator being 0x3f was connected to
> arch LBR being available.
IIRC Ice Lake has both model-specific and architectural LBRs.
While format being 0x3f could indicate the likely presence of arch
LBRs, the CPUID bit need to be checked.
> >> As there's no good place to ask the VMX-related question, it needs to
> >> go here: Aiui with this patch in place VMX guests will be run with
> >> Xen's choice of LBR_CTL. That's different from DebugCtl, which - being
> >> part of the VMCS - would be loaded by the CPU. Such a difference, if
> >> intended, would imo again want pointing out in the description.
> >
> > LBR_CTL will only be set by Xen when the CPU only supports
> > architectural LBRs (no model specific LBR support at all), and in that
> > case LBR support won't be exposed to guests, as the ARCH_LBR CPUID is
> > not exposed, neither are guests allowed access to ARCH_LBR_CTL.
> >
> > Note that in such scenario also setting DebugCtl.LBR has not effect, as
> > there's no model specific LBR support, and the hardware will just
> > ignore the bit. Also none of the LBR MSRs are exposed to guests
> > either.
>
> My question wasn't about guest support, but about us (perhaps mistakenly)
> running guest code with the Xen setting in place. It cannot be excluded
> that running with LBR enabled has a performance impact, after all.
It's possible. 'ler' option already states that it should be used for
debugging purposes only, so I think it's fine if this results in
slower guest performance, as it's not a general purpose option after
all.
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |