[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH for-4.17 v2] hvm/apic: repurpose the reporting of the APIC assist options
On Thu, Nov 10, 2022 at 10:47:07PM +0000, Andrew Cooper wrote: > On 04/11/2022 16:18, Roger Pau Monne wrote: > > The current reporting of the hardware assisted APIC options is done by > > checking "virtualize APIC accesses" which is not very helpful, as that > > feature doesn't avoid a vmexit, instead it does provide some help in > > order to detect APIC MMIO accesses in vmexit processing. > > > > Repurpose the current reporting of xAPIC assistance to instead report > > such feature as present when there's support for "TPR shadow" and > > "APIC register virtualization" because in that case some xAPIC MMIO > > register accesses are handled directly by the hardware, without > > requiring a vmexit. > > > > For symetry also change assisted x2APIC reporting to require > > "virtualize x2APIC mode" and "APIC register virtualization", dropping > > the option to also be reported when "virtual interrupt delivery" is > > available. Presence of the "virtual interrupt delivery" feature will > > be reported using a different option. > > > > Fixes: 2ce11ce249 ('x86/HVM: allow per-domain usage of hardware virtualized > > APIC') > > Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> > > --- > > I find the logic in vmx_vlapic_msr_changed() hard to follow, but I > > don't want to rewrite the function logic at this point. > > --- > > Changes since v1: > > - Fix Viridian MSR tip conditions. > > --- > > xen/arch/x86/hvm/viridian/viridian.c | 2 +- > > xen/arch/x86/hvm/vmx/vmcs.c | 8 ++++---- > > xen/arch/x86/hvm/vmx/vmx.c | 25 ++++++++++++++++++------- > > xen/arch/x86/traps.c | 4 +--- > > 4 files changed, 24 insertions(+), 15 deletions(-) > > > > diff --git a/xen/arch/x86/hvm/viridian/viridian.c > > b/xen/arch/x86/hvm/viridian/viridian.c > > index 25dca93e8b..44eb3d0519 100644 > > --- a/xen/arch/x86/hvm/viridian/viridian.c > > +++ b/xen/arch/x86/hvm/viridian/viridian.c > > @@ -197,7 +197,7 @@ void cpuid_viridian_leaves(const struct vcpu *v, > > uint32_t leaf, > > res->a = CPUID4A_RELAX_TIMER_INT; > > if ( viridian_feature_mask(d) & HVMPV_hcall_remote_tlb_flush ) > > res->a |= CPUID4A_HCALL_REMOTE_TLB_FLUSH; > > - if ( !cpu_has_vmx_apic_reg_virt ) > > + if ( !has_assisted_xapic(d) ) > > res->a |= CPUID4A_MSR_BASED_APIC; > > This check is broken before and after. It needs to be keyed on > virtualised interrupt delivery, not register acceleration. > > But doing this correctly needs a per-domain vintr setting, which we > don't have yet. > > It is marginally less broken with this change, than without, but that's > not saying much. > > > if ( viridian_feature_mask(d) & HVMPV_hcall_ipi ) > > res->a |= CPUID4A_SYNTHETIC_CLUSTER_IPI; > > diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c > > index a1aca1ec04..7bb96e1a8e 100644 > > --- a/xen/arch/x86/hvm/vmx/vmcs.c > > +++ b/xen/arch/x86/hvm/vmx/vmcs.c > > @@ -1136,7 +1136,7 @@ static int construct_vmcs(struct vcpu *v) > > > > if ( !has_assisted_xapic(d) ) > > v->arch.hvm.vmx.secondary_exec_control &= > > - ~SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES; > > + ~SECONDARY_EXEC_APIC_REGISTER_VIRT; > > > > if ( cpu_has_vmx_secondary_exec_control ) > > __vmwrite(SECONDARY_VM_EXEC_CONTROL, > > @@ -2156,10 +2156,10 @@ int __init vmx_vmcs_init(void) > > if ( !ret ) > > { > > /* Check whether hardware supports accelerated xapic and x2apic. */ > > - assisted_xapic_available = cpu_has_vmx_virtualize_apic_accesses; > > + assisted_xapic_available = cpu_has_vmx_tpr_shadow && > > + cpu_has_vmx_apic_reg_virt; > > assisted_x2apic_available = cpu_has_vmx_virtualize_x2apic_mode && > > - (cpu_has_vmx_apic_reg_virt || > > - cpu_has_vmx_virtual_intr_delivery); > > + cpu_has_vmx_apic_reg_virt; > > apic reg virt already depends on tpr shadow, so that part of the > condition is redundant. > > virtualise x2apic mode and apic reg virt aren't dependent, but they do > only ever appear together in hardware. > > Keeping the conditionals might be ok to combat a bad outer hypervisor, > but ... > > > register_keyhandler('v', vmcs_dump, "dump VT-x VMCSs", 1); > > } > > > > diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c > > index e624b415c9..bf0fe3355c 100644 > > --- a/xen/arch/x86/hvm/vmx/vmx.c > > +++ b/xen/arch/x86/hvm/vmx/vmx.c > > @@ -3405,25 +3405,29 @@ static void vmx_install_vlapic_mapping(struct vcpu > > *v) > > > > void vmx_vlapic_msr_changed(struct vcpu *v) > > { > > + bool virtualize_x2apic_mode = has_assisted_x2apic(v->domain) || > > + (cpu_has_vmx_virtualize_x2apic_mode && > > + cpu_has_vmx_virtual_intr_delivery); > > ... this is still wrong, and ... > > > struct vlapic *vlapic = vcpu_vlapic(v); > > unsigned int msr; > > > > - if ( !has_assisted_xapic(v->domain) && > > - !has_assisted_x2apic(v->domain) ) > > + if ( !cpu_has_vmx_virtualize_apic_accesses && > > + !virtualize_x2apic_mode ) > > return; > > ... this surely cannot be right. > > While attempting to figure ^ out, I've found yet another regression vs > 4.16. Because virt intr delivery is set in the execution controls > system-wide and not controlled per domain, we'll take a vmentry failure > on SKX/CLX/ICX when trying to build an HVM domain without xAPIC > acceleration. > > > This, combined with the ABI errors (/misfeatures) that we really don't > want to escape into the world but I haven't finished fixing yet, means > that the only appropriate course of action is to revert. > > I'd really hoped to avoid a full revert, but we've run out of time. Can we wait for the revert until Monday, it's a public holiday here today and won't be able to reply to the comments. Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |