|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v11 1/6] passthrough: don't migrate pirq when it is delivered through VT-d PI
> From: Chao Gao
> Sent: Wednesday, March 29, 2017 1:12 PM
>
> When a vCPU migrated to another pCPU, pt irqs binded to this vCPU also
> needed migration. When VT-d PI is enabled, interrupt vector will be recorded
> to a main memory resident data-structure and a notification whose
> destination is decided by NDST is generated. NDST is properly adjusted
> during vCPU migration so pirq directly injected to guest needn't be migrated.
>
> This patch adds a indicator, @posted, to show whether the pt irq is delivered
> through VT-d PI.
>
> Signed-off-by: Chao Gao <chao.gao@xxxxxxxxx>
> ---
> v11:
> - rename the indicator to 'posted'
> - move setting 'posted' field to event lock un-locked region.
>
> v10:
> - Newly added.
>
> xen/arch/x86/hvm/hvm.c | 3 +++
> xen/drivers/passthrough/io.c | 62
> +++++++++-----------------------------------
> xen/include/xen/hvm/irq.h | 1 +
> 3 files changed, 16 insertions(+), 50 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index
> 0282986..2d8de16 100644
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -438,6 +438,9 @@ static int hvm_migrate_pirq(struct domain *d, struct
> hvm_pirq_dpci *pirq_dpci,
> struct vcpu *v = arg;
>
> if ( (pirq_dpci->flags & HVM_IRQ_DPCI_MACH_MSI) &&
> + (pirq_dpci->flags & HVM_IRQ_DPCI_GUEST_MSI) &&
> + /* Needn't migrate pirq if this pirq is delivered to guest
> directly.*/
> + (!pirq_dpci->gmsi.posted) &&
> (pirq_dpci->gmsi.dest_vcpu_id == v->vcpu_id) )
simply looking at above change it's more than what you intend to change.
Previously even w/o GUEST_MSI flag will fall into that path, but now
you limit it to only GUEST_MSI and irq remapping (i.e. changed the
behavior for both posted case and w/o GUEST_MSI case). I haven't looked
whether MACH_MASI always set with GUEST_MSI, but my gut-feeling
looks not correct here.
> {
> struct irq_desc *desc =
> diff --git a/xen/drivers/passthrough/io.c b/xen/drivers/passthrough/io.c
> index 080183e..d53976c 100644
> --- a/xen/drivers/passthrough/io.c
> +++ b/xen/drivers/passthrough/io.c
> @@ -259,52 +259,6 @@ static struct vcpu *vector_hashing_dest(const struct
> domain *d,
> return dest;
> }
>
> -/*
> - * The purpose of this routine is to find the right destination vCPU for
> - * an interrupt which will be delivered by VT-d posted-interrupt. There
> - * are several cases as below:
> - *
> - * - For lowest-priority interrupts, use vector-hashing mechanism to find
> - * the destination.
> - * - Otherwise, for single destination interrupt, it is straightforward to
> - * find the destination vCPU and return true.
> - * - For multicast/broadcast vCPU, we cannot handle it via interrupt posting,
> - * so return NULL.
> - */
> -static struct vcpu *pi_find_dest_vcpu(const struct domain *d, uint32_t
> dest_id,
> - bool_t dest_mode, uint8_t
> delivery_mode,
> - uint8_t gvec)
> -{
> - unsigned int dest_vcpus = 0;
> - struct vcpu *v, *dest = NULL;
> -
> - switch ( delivery_mode )
> - {
> - case dest_LowestPrio:
> - return vector_hashing_dest(d, dest_id, dest_mode, gvec);
> - case dest_Fixed:
> - for_each_vcpu ( d, v )
> - {
> - if ( !vlapic_match_dest(vcpu_vlapic(v), NULL, APIC_DEST_NOSHORT,
> - dest_id, dest_mode) )
> - continue;
> -
> - dest_vcpus++;
> - dest = v;
> - }
> -
> - /* For fixed mode, we only handle single-destination interrupts. */
> - if ( dest_vcpus == 1 )
> - return dest;
> -
> - break;
> - default:
> - break;
> - }
> -
> - return NULL;
> -}
> -
> int pt_irq_create_bind(
> struct domain *d, xen_domctl_bind_pt_irq_t *pt_irq_bind) { @@ -365,6
> +319,7 @@ int pt_irq_create_bind(
> {
> uint8_t dest, dest_mode, delivery_mode;
> int dest_vcpu_id;
> + const struct vcpu *vcpu;
>
> if ( !(pirq_dpci->flags & HVM_IRQ_DPCI_MAPPED) )
> {
> @@ -442,17 +397,24 @@ int pt_irq_create_bind(
> dest_vcpu_id = hvm_girq_dest_2_vcpu_id(d, dest, dest_mode);
> pirq_dpci->gmsi.dest_vcpu_id = dest_vcpu_id;
> spin_unlock(&d->event_lock);
> +
> + pirq_dpci->gmsi.posted = false;
> + vcpu = (dest_vcpu_id >= 0) ? d->vcpu[dest_vcpu_id] : NULL;
> + if ( iommu_intpost && (delivery_mode == dest_LowestPrio) )
> + {
> + vcpu = vector_hashing_dest(d, dest, dest_mode,
> + pirq_dpci->gmsi.gvec);
> + if ( vcpu )
> + pirq_dpci->gmsi.posted = true;
> + }
> if ( dest_vcpu_id >= 0 )
> hvm_migrate_pirqs(d->vcpu[dest_vcpu_id]);
>
> /* Use interrupt posting if it is supported. */
> if ( iommu_intpost )
> {
> - const struct vcpu *vcpu = pi_find_dest_vcpu(d, dest, dest_mode,
> - delivery_mode,
> pirq_dpci->gmsi.gvec);
> -
> if ( vcpu )
> - pi_update_irte( vcpu, info, pirq_dpci->gmsi.gvec );
> + pi_update_irte(vcpu, info, pirq_dpci->gmsi.gvec);
> else
> dprintk(XENLOG_G_INFO,
> "%pv: deliver interrupt in remapping
> mode,gvec:%02x\n", diff -
> -git a/xen/include/xen/hvm/irq.h b/xen/include/xen/hvm/irq.h index
> d3f8623..566854a 100644
> --- a/xen/include/xen/hvm/irq.h
> +++ b/xen/include/xen/hvm/irq.h
> @@ -63,6 +63,7 @@ struct hvm_gmsi_info {
> uint32_t gvec;
> uint32_t gflags;
> int dest_vcpu_id; /* -1 :multi-dest, non-negative: dest_vcpu_id */
> + bool posted; /* directly deliver to guest via VT-d PI? */
> };
>
> struct hvm_girq_dpci_mapping {
> --
> 1.8.3.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 |