Message ID | 20170824150703.79731-2-roger.pau@citrix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
>>> On 24.08.17 at 17:07, <roger.pau@citrix.com> wrote: > The flag is part of the gflags, and should be used to request the > unmask of a MSI interrupt once it's bound. > > This is required for the device model in order to be capable of > binding MSIX interrupts that have the entry mask bit already unset at > bind time. Without this fix the interrupts would be left masked. > > Note that this commit introduces a change to the domctl, which > requires a bump of the interface version. This is done done here "... is not done here ..." I suppose (I'll try to remember changing that while committing, unless you tell me I've got it wrong). > because the interface version has already been bumped in this release > cycle. > > Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> > Reported by: Andreas Kinzler <hfp@posteo.de> Reviewed-by: Jan Beulich <jbeulich@suse.com>
>>> On 24.08.17 at 17:27, <JBeulich@suse.com> wrote: >>>> On 24.08.17 at 17:07, <roger.pau@citrix.com> wrote: >> The flag is part of the gflags, and should be used to request the >> unmask of a MSI interrupt once it's bound. >> >> This is required for the device model in order to be capable of >> binding MSIX interrupts that have the entry mask bit already unset at >> bind time. Without this fix the interrupts would be left masked. >> >> Note that this commit introduces a change to the domctl, which >> requires a bump of the interface version. This is done done here > > "... is not done here ..." I suppose (I'll try to remember changing > that while committing, unless you tell me I've got it wrong). Since I haven't heard back yet: I'm intending to commit this only once the above item was clarified. Jan >> because the interface version has already been bumped in this release >> cycle. >> >> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> >> Reported by: Andreas Kinzler <hfp@posteo.de> > > Reviewed-by: Jan Beulich <jbeulich@suse.com> > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > https://lists.xen.org/xen-devel
On Tue, Aug 29, 2017 at 03:11:09AM -0600, Jan Beulich wrote: > >>> On 24.08.17 at 17:27, <JBeulich@suse.com> wrote: > >>>> On 24.08.17 at 17:07, <roger.pau@citrix.com> wrote: > >> The flag is part of the gflags, and should be used to request the > >> unmask of a MSI interrupt once it's bound. > >> > >> This is required for the device model in order to be capable of > >> binding MSIX interrupts that have the entry mask bit already unset at > >> bind time. Without this fix the interrupts would be left masked. > >> > >> Note that this commit introduces a change to the domctl, which > >> requires a bump of the interface version. This is done done here > > > > "... is not done here ..." I suppose (I'll try to remember changing > > that while committing, unless you tell me I've got it wrong). Oh yes, sorry. Your fix is correct, please change it while committing. Roger.
diff --git a/xen/drivers/passthrough/io.c b/xen/drivers/passthrough/io.c index 19a21bf85a..1d260bd7ba 100644 --- a/xen/drivers/passthrough/io.c +++ b/xen/drivers/passthrough/io.c @@ -342,13 +342,14 @@ int pt_irq_create_bind( uint8_t dest, dest_mode, delivery_mode; int dest_vcpu_id; const struct vcpu *vcpu; + uint32_t gflags = pt_irq_bind->u.msi.gflags & ~VMSI_UNMASKED; if ( !(pirq_dpci->flags & HVM_IRQ_DPCI_MAPPED) ) { pirq_dpci->flags = HVM_IRQ_DPCI_MAPPED | HVM_IRQ_DPCI_MACH_MSI | HVM_IRQ_DPCI_GUEST_MSI; pirq_dpci->gmsi.gvec = pt_irq_bind->u.msi.gvec; - pirq_dpci->gmsi.gflags = pt_irq_bind->u.msi.gflags; + pirq_dpci->gmsi.gflags = gflags; /* * 'pt_irq_create_bind' can be called after 'pt_irq_destroy_bind'. * The 'pirq_cleanup_check' which would free the structure is only @@ -401,13 +402,13 @@ int pt_irq_create_bind( /* If pirq is already mapped as vmsi, update guest data/addr. */ if ( pirq_dpci->gmsi.gvec != pt_irq_bind->u.msi.gvec || - pirq_dpci->gmsi.gflags != pt_irq_bind->u.msi.gflags ) + pirq_dpci->gmsi.gflags != gflags ) { /* Directly clear pending EOIs before enabling new MSI info. */ pirq_guest_eoi(info); pirq_dpci->gmsi.gvec = pt_irq_bind->u.msi.gvec; - pirq_dpci->gmsi.gflags = pt_irq_bind->u.msi.gflags; + pirq_dpci->gmsi.gflags = gflags; } } /* Calculate dest_vcpu_id for MSI-type pirq migration. */ @@ -438,6 +439,21 @@ int pt_irq_create_bind( pi_update_irte(vcpu ? &vcpu->arch.hvm_vmx.pi_desc : NULL, info, pirq_dpci->gmsi.gvec); + if ( pt_irq_bind->u.msi.gflags & VMSI_UNMASKED ) + { + unsigned long flags; + struct irq_desc *desc = pirq_spin_lock_irq_desc(info, &flags); + + if ( !desc ) + { + pt_irq_destroy_bind(d, pt_irq_bind); + return -EINVAL; + } + + guest_mask_msi_irq(desc, false); + spin_unlock_irqrestore(&desc->lock, flags); + } + break; } diff --git a/xen/include/asm-x86/hvm/irq.h b/xen/include/asm-x86/hvm/irq.h index 106dc19613..9546c24879 100644 --- a/xen/include/asm-x86/hvm/irq.h +++ b/xen/include/asm-x86/hvm/irq.h @@ -136,6 +136,7 @@ struct dev_intx_gsi_link { #define VMSI_DM_MASK 0x200 #define VMSI_DELIV_MASK 0x7000 #define VMSI_TRIG_MODE 0x8000 +#define VMSI_UNMASKED 0x10000 #define GFLAGS_SHIFT_RH 8 #define GFLAGS_SHIFT_DELIV_MODE 12
The flag is part of the gflags, and should be used to request the unmask of a MSI interrupt once it's bound. This is required for the device model in order to be capable of binding MSIX interrupts that have the entry mask bit already unset at bind time. Without this fix the interrupts would be left masked. Note that this commit introduces a change to the domctl, which requires a bump of the interface version. This is done done here because the interface version has already been bumped in this release cycle. Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> Reported by: Andreas Kinzler <hfp@posteo.de> --- Cc: Jan Beulich <jbeulich@suse.com> Cc: Andrew Cooper <andrew.cooper3@citrix.com> --- Changes since v2: - Use _irqrestore. Changes since v1: - Use pirq_spin_lock_irq_desc. --- xen/drivers/passthrough/io.c | 22 +++++++++++++++++++--- xen/include/asm-x86/hvm/irq.h | 1 + 2 files changed, 20 insertions(+), 3 deletions(-)