[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH 1/9] x86/HVM: Introduce struct hvm_pi_ops
On Mon, Sep 19, 2016 at 12:52:40AM -0500, Suravee Suthikulpanit wrote: > The current function pointers for managing hvm posted interrupt > can be used also by SVM AVIC. Therefore, this patch introduces the > struct hvm_pi_ops in the struct hvm_domain to hold them. > > Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@xxxxxxx> You seemed to have forgotten to CC the VMX maintainers: INTEL(R) VT FOR X86 (VT-X) M: Jun Nakajima <jun.nakajima@xxxxxxxxx> M: Kevin Tian <kevin.tian@xxxxxxxxx> S: Supported ? Regardlesss of that, Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> > --- > xen/arch/x86/hvm/vmx/vmx.c | 32 +++++++++---------- > xen/include/asm-x86/hvm/domain.h | 63 > ++++++++++++++++++++++++++++++++++++++ > xen/include/asm-x86/hvm/hvm.h | 4 +-- > xen/include/asm-x86/hvm/vmx/vmcs.h | 59 ----------------------------------- > 4 files changed, 81 insertions(+), 77 deletions(-) > > diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c > index 2759e6f..8620697 100644 > --- a/xen/arch/x86/hvm/vmx/vmx.c > +++ b/xen/arch/x86/hvm/vmx/vmx.c > @@ -204,12 +204,12 @@ void vmx_pi_hooks_assign(struct domain *d) > if ( !iommu_intpost || !has_hvm_container_domain(d) ) > return; > > - ASSERT(!d->arch.hvm_domain.vmx.vcpu_block); > + ASSERT(!d->arch.hvm_domain.pi_ops.vcpu_block); > > - d->arch.hvm_domain.vmx.vcpu_block = vmx_vcpu_block; > - d->arch.hvm_domain.vmx.pi_switch_from = vmx_pi_switch_from; > - d->arch.hvm_domain.vmx.pi_switch_to = vmx_pi_switch_to; > - d->arch.hvm_domain.vmx.pi_do_resume = vmx_pi_do_resume; > + d->arch.hvm_domain.pi_ops.vcpu_block = vmx_vcpu_block; > + d->arch.hvm_domain.pi_ops.pi_switch_from = vmx_pi_switch_from; > + d->arch.hvm_domain.pi_ops.pi_switch_to = vmx_pi_switch_to; > + d->arch.hvm_domain.pi_ops.pi_do_resume = vmx_pi_do_resume; > } > > /* This function is called when pcidevs_lock is held */ > @@ -218,12 +218,12 @@ void vmx_pi_hooks_deassign(struct domain *d) > if ( !iommu_intpost || !has_hvm_container_domain(d) ) > return; > > - ASSERT(d->arch.hvm_domain.vmx.vcpu_block); > + ASSERT(d->arch.hvm_domain.pi_ops.vcpu_block); > > - d->arch.hvm_domain.vmx.vcpu_block = NULL; > - d->arch.hvm_domain.vmx.pi_switch_from = NULL; > - d->arch.hvm_domain.vmx.pi_switch_to = NULL; > - d->arch.hvm_domain.vmx.pi_do_resume = NULL; > + d->arch.hvm_domain.pi_ops.vcpu_block = NULL; > + d->arch.hvm_domain.pi_ops.pi_switch_from = NULL; > + d->arch.hvm_domain.pi_ops.pi_switch_to = NULL; > + d->arch.hvm_domain.pi_ops.pi_do_resume = NULL; > } > > static int vmx_domain_initialise(struct domain *d) > @@ -901,8 +901,8 @@ static void vmx_ctxt_switch_from(struct vcpu *v) > vmx_restore_host_msrs(); > vmx_save_dr(v); > > - if ( v->domain->arch.hvm_domain.vmx.pi_switch_from ) > - v->domain->arch.hvm_domain.vmx.pi_switch_from(v); > + if ( v->domain->arch.hvm_domain.pi_ops.pi_switch_from ) > + v->domain->arch.hvm_domain.pi_ops.pi_switch_from(v); > } > > static void vmx_ctxt_switch_to(struct vcpu *v) > @@ -916,8 +916,8 @@ static void vmx_ctxt_switch_to(struct vcpu *v) > vmx_restore_guest_msrs(v); > vmx_restore_dr(v); > > - if ( v->domain->arch.hvm_domain.vmx.pi_switch_to ) > - v->domain->arch.hvm_domain.vmx.pi_switch_to(v); > + if ( v->domain->arch.hvm_domain.pi_ops.pi_switch_to ) > + v->domain->arch.hvm_domain.pi_ops.pi_switch_to(v); > } > > > @@ -3914,8 +3914,8 @@ void vmx_vmenter_helper(const struct cpu_user_regs > *regs) > struct hvm_vcpu_asid *p_asid; > bool_t need_flush; > > - if ( curr->domain->arch.hvm_domain.vmx.pi_do_resume ) > - curr->domain->arch.hvm_domain.vmx.pi_do_resume(curr); > + if ( curr->domain->arch.hvm_domain.pi_ops.pi_do_resume ) > + curr->domain->arch.hvm_domain.pi_ops.pi_do_resume(curr); > > if ( !cpu_has_vmx_vpid ) > goto out; > diff --git a/xen/include/asm-x86/hvm/domain.h > b/xen/include/asm-x86/hvm/domain.h > index f34d784..779927b 100644 > --- a/xen/include/asm-x86/hvm/domain.h > +++ b/xen/include/asm-x86/hvm/domain.h > @@ -72,6 +72,67 @@ struct hvm_ioreq_server { > bool_t bufioreq_atomic; > }; > > +struct hvm_pi_ops { > + /* > + * To handle posted interrupts correctly, we need to set the following > + * state: > + * > + * * The PI notification vector (NV) > + * * The PI notification destination processor (NDST) > + * * The PI "suppress notification" bit (SN) > + * * The vcpu pi "blocked" list > + * > + * If a VM is currently running, we want the PI delivered to the guest > vcpu > + * on the proper pcpu (NDST = v->processor, SN clear). > + * > + * If the vm is blocked, we want the PI delivered to Xen so that it can > + * wake it up (SN clear, NV = pi_wakeup_vector, vcpu on block list). > + * > + * If the VM is currently either preempted or offline (i.e., not running > + * because of some reason other than blocking waiting for an interrupt), > + * there's nothing Xen can do -- we want the interrupt pending bit set in > + * the guest, but we don't want to bother Xen with an interrupt (SN > clear). > + * > + * There's a brief window of time between vmx_intr_assist() and checking > + * softirqs where if an interrupt comes in it may be lost; so we need Xen > + * to get an interrupt and raise a softirq so that it will go through the > + * vmx_intr_assist() path again (SN clear, NV = posted_interrupt). > + * > + * The way we implement this now is by looking at what needs to happen on > + * the following runstate transitions: > + * > + * A: runnable -> running > + * - SN = 0 > + * - NDST = v->processor > + * B: running -> runnable > + * - SN = 1 > + * C: running -> blocked > + * - NV = pi_wakeup_vector > + * - Add vcpu to blocked list > + * D: blocked -> runnable > + * - NV = posted_intr_vector > + * - Take vcpu off blocked list > + * > + * For transitions A and B, we add hooks into vmx_ctxt_switch_{from,to} > + * paths. > + * > + * For transition C, we add a new arch hook, arch_vcpu_block(), which is > + * called from vcpu_block() and vcpu_do_poll(). > + * > + * For transition D, rather than add an extra arch hook on vcpu_wake, we > + * add a hook on the vmentry path which checks to see if either of the > two > + * actions need to be taken. > + * > + * These hooks only need to be called when the domain in question > actually > + * has a physical device assigned to it, so we set and clear the > callbacks > + * as appropriate when device assignment changes. > + */ > + void (*vcpu_block) (struct vcpu *); > + void (*pi_switch_from) (struct vcpu *v); > + void (*pi_switch_to) (struct vcpu *v); > + void (*pi_do_resume) (struct vcpu *v); > +}; > + > struct hvm_domain { > /* Guest page range used for non-default ioreq servers */ > struct { > @@ -148,6 +209,8 @@ struct hvm_domain { > struct list_head list; > } write_map; > > + struct hvm_pi_ops pi_ops; > + > union { > struct vmx_domain vmx; > struct svm_domain svm; > diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h > index 81b60d5..c832d9a 100644 > --- a/xen/include/asm-x86/hvm/hvm.h > +++ b/xen/include/asm-x86/hvm/hvm.h > @@ -621,8 +621,8 @@ unsigned long hvm_cr4_guest_reserved_bits(const struct > vcpu *v, bool_t restore); > struct vcpu *v_ = (v); \ > struct domain *d_ = v_->domain; \ > if ( has_hvm_container_domain(d_) && \ > - (cpu_has_vmx && d_->arch.hvm_domain.vmx.vcpu_block) ) \ > - d_->arch.hvm_domain.vmx.vcpu_block(v_); \ > + (d_->arch.hvm_domain.pi_ops.vcpu_block) ) \ > + d_->arch.hvm_domain.pi_ops.vcpu_block(v_); \ > }) > > #endif /* __ASM_X86_HVM_HVM_H__ */ > diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h > b/xen/include/asm-x86/hvm/vmx/vmcs.h > index 997f4f5..4ec8b08 100644 > --- a/xen/include/asm-x86/hvm/vmx/vmcs.h > +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h > @@ -77,65 +77,6 @@ struct vmx_domain { > unsigned long apic_access_mfn; > /* VMX_DOMAIN_* */ > unsigned int status; > - > - /* > - * To handle posted interrupts correctly, we need to set the following > - * state: > - * > - * * The PI notification vector (NV) > - * * The PI notification destination processor (NDST) > - * * The PI "suppress notification" bit (SN) > - * * The vcpu pi "blocked" list > - * > - * If a VM is currently running, we want the PI delivered to the guest > vcpu > - * on the proper pcpu (NDST = v->processor, SN clear). > - * > - * If the vm is blocked, we want the PI delivered to Xen so that it can > - * wake it up (SN clear, NV = pi_wakeup_vector, vcpu on block list). > - * > - * If the VM is currently either preempted or offline (i.e., not running > - * because of some reason other than blocking waiting for an interrupt), > - * there's nothing Xen can do -- we want the interrupt pending bit set in > - * the guest, but we don't want to bother Xen with an interrupt (SN > clear). > - * > - * There's a brief window of time between vmx_intr_assist() and checking > - * softirqs where if an interrupt comes in it may be lost; so we need Xen > - * to get an interrupt and raise a softirq so that it will go through the > - * vmx_intr_assist() path again (SN clear, NV = posted_interrupt). > - * > - * The way we implement this now is by looking at what needs to happen on > - * the following runstate transitions: > - * > - * A: runnable -> running > - * - SN = 0 > - * - NDST = v->processor > - * B: running -> runnable > - * - SN = 1 > - * C: running -> blocked > - * - NV = pi_wakeup_vector > - * - Add vcpu to blocked list > - * D: blocked -> runnable > - * - NV = posted_intr_vector > - * - Take vcpu off blocked list > - * > - * For transitions A and B, we add hooks into vmx_ctxt_switch_{from,to} > - * paths. > - * > - * For transition C, we add a new arch hook, arch_vcpu_block(), which is > - * called from vcpu_block() and vcpu_do_poll(). > - * > - * For transition D, rather than add an extra arch hook on vcpu_wake, we > - * add a hook on the vmentry path which checks to see if either of the > two > - * actions need to be taken. > - * > - * These hooks only need to be called when the domain in question > actually > - * has a physical device assigned to it, so we set and clear the > callbacks > - * as appropriate when device assignment changes. > - */ > - void (*vcpu_block) (struct vcpu *); > - void (*pi_switch_from) (struct vcpu *v); > - void (*pi_switch_to) (struct vcpu *v); > - void (*pi_do_resume) (struct vcpu *v); > }; > > struct pi_desc { > -- > 1.9.1 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > https://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |