[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH for-4.14 v2 2/2] x86/passthrough: introduce a flag for GSIs not requiring an EOI or unmask
> -----Original Message----- > From: Roger Pau Monne <roger.pau@xxxxxxxxxx> > Sent: 10 June 2020 15:29 > To: xen-devel@xxxxxxxxxxxxxxxxxxxx > Cc: paul@xxxxxxx; Roger Pau Monne <roger.pau@xxxxxxxxxx>; Jan Beulich > <jbeulich@xxxxxxxx>; Andrew > Cooper <andrew.cooper3@xxxxxxxxxx>; Wei Liu <wl@xxxxxxx> > Subject: [PATCH for-4.14 v2 2/2] x86/passthrough: introduce a flag for GSIs > not requiring an EOI or > unmask > > There's no need to setup a timer for GSIs that are edge triggered, > since those don't require any EIO or unmask, and hence couldn't block > other interrupts. > > Note this is only used by PVH dom0, that can setup the passthrough of > edge triggered interrupts from the vIO-APIC. One example of such kind > of interrupt that can be used by a PVH dom0 would be the RTC timer. > > While there introduce an out label to do the unlock and reduce code > duplication. > > Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> Reviewed-by: Paul Durrant <paul@xxxxxxx> > --- > Changes since v1: > - Introduce an out label that does the unlock. > --- > xen/drivers/passthrough/io.c | 24 +++++++++++++++--------- > xen/include/asm-x86/hvm/irq.h | 2 ++ > 2 files changed, 17 insertions(+), 9 deletions(-) > > diff --git a/xen/drivers/passthrough/io.c b/xen/drivers/passthrough/io.c > index b292e79382..6b1305a3e5 100644 > --- a/xen/drivers/passthrough/io.c > +++ b/xen/drivers/passthrough/io.c > @@ -138,7 +138,8 @@ static void pt_pirq_softirq_reset(struct hvm_pirq_dpci > *pirq_dpci) > > bool pt_irq_need_timer(uint32_t flags) > { > - return !(flags & (HVM_IRQ_DPCI_GUEST_MSI | HVM_IRQ_DPCI_TRANSLATE)); > + return !(flags & (HVM_IRQ_DPCI_GUEST_MSI | HVM_IRQ_DPCI_TRANSLATE | > + HVM_IRQ_DPCI_NO_EOI)); > } > > static int pt_irq_guest_eoi(struct domain *d, struct hvm_pirq_dpci > *pirq_dpci, > @@ -558,6 +559,12 @@ int pt_irq_create_bind( > */ > ASSERT(!mask); > share = trigger_mode; > + if ( trigger_mode == VIOAPIC_EDGE_TRIG ) > + /* > + * Edge IO-APIC interrupt, no EOI or unmask to > perform > + * and hence no timer needed. > + */ > + pirq_dpci->flags |= HVM_IRQ_DPCI_NO_EOI; > } > } > > @@ -897,17 +904,13 @@ static void hvm_dirq_assist(struct domain *d, struct > hvm_pirq_dpci *pirq_dpci) > send_guest_pirq(d, pirq); > > if ( pirq_dpci->flags & HVM_IRQ_DPCI_GUEST_MSI ) > - { > - spin_unlock(&d->event_lock); > - return; > - } > + goto out; > } > > if ( pirq_dpci->flags & HVM_IRQ_DPCI_GUEST_MSI ) > { > vmsi_deliver_pirq(d, pirq_dpci); > - spin_unlock(&d->event_lock); > - return; > + goto out; > } > > list_for_each_entry ( digl, &pirq_dpci->digl_list, list ) > @@ -920,6 +923,8 @@ static void hvm_dirq_assist(struct domain *d, struct > hvm_pirq_dpci *pirq_dpci) > if ( pirq_dpci->flags & HVM_IRQ_DPCI_IDENTITY_GSI ) > { > hvm_gsi_assert(d, pirq->pirq); > + if ( pirq_dpci->flags & HVM_IRQ_DPCI_NO_EOI ) > + goto out; > pirq_dpci->pending++; > } > > @@ -927,8 +932,7 @@ static void hvm_dirq_assist(struct domain *d, struct > hvm_pirq_dpci *pirq_dpci) > { > /* for translated MSI to INTx interrupt, eoi as early as > possible */ > __msi_pirq_eoi(pirq_dpci); > - spin_unlock(&d->event_lock); > - return; > + goto out; > } > > /* > @@ -941,6 +945,8 @@ static void hvm_dirq_assist(struct domain *d, struct > hvm_pirq_dpci *pirq_dpci) > ASSERT(pt_irq_need_timer(pirq_dpci->flags)); > set_timer(&pirq_dpci->timer, NOW() + PT_IRQ_TIME_OUT); > } > + > + out: > spin_unlock(&d->event_lock); > } > > diff --git a/xen/include/asm-x86/hvm/irq.h b/xen/include/asm-x86/hvm/irq.h > index d306cfeade..532880d497 100644 > --- a/xen/include/asm-x86/hvm/irq.h > +++ b/xen/include/asm-x86/hvm/irq.h > @@ -121,6 +121,7 @@ struct dev_intx_gsi_link { > #define _HVM_IRQ_DPCI_GUEST_PCI_SHIFT 4 > #define _HVM_IRQ_DPCI_GUEST_MSI_SHIFT 5 > #define _HVM_IRQ_DPCI_IDENTITY_GSI_SHIFT 6 > +#define _HVM_IRQ_DPCI_NO_EOI_SHIFT 7 > #define _HVM_IRQ_DPCI_TRANSLATE_SHIFT 15 > #define HVM_IRQ_DPCI_MACH_PCI (1u << _HVM_IRQ_DPCI_MACH_PCI_SHIFT) > #define HVM_IRQ_DPCI_MACH_MSI (1u << _HVM_IRQ_DPCI_MACH_MSI_SHIFT) > @@ -129,6 +130,7 @@ struct dev_intx_gsi_link { > #define HVM_IRQ_DPCI_GUEST_PCI (1u << _HVM_IRQ_DPCI_GUEST_PCI_SHIFT) > #define HVM_IRQ_DPCI_GUEST_MSI (1u << _HVM_IRQ_DPCI_GUEST_MSI_SHIFT) > #define HVM_IRQ_DPCI_IDENTITY_GSI (1u << _HVM_IRQ_DPCI_IDENTITY_GSI_SHIFT) > +#define HVM_IRQ_DPCI_NO_EOI (1u << _HVM_IRQ_DPCI_NO_EOI_SHIFT) > #define HVM_IRQ_DPCI_TRANSLATE (1u << _HVM_IRQ_DPCI_TRANSLATE_SHIFT) > > struct hvm_gmsi_info { > -- > 2.26.2
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |