diff mbox

KVM: No disable_irq for MSI/MSI-X interrupt on device assignment

Message ID 1241060322-25807-1-git-send-email-sheng@linux.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Sheng Yang April 30, 2009, 2:58 a.m. UTC
Disable interrupt at interrupt handler and enable it when guest ack is for
the level triggered interrupt, to prevent reinjected interrupt. MSI/MSI-X don't
need it.

One possible problem is multiply same vector interrupt injected between irq
handler and scheduled work handler would be merged as one for MSI/MSI-X.
But AFAIK, the drivers handle it well.

The patch fixed the oplin card performance issue(MSI-X performance is half of
MSI/INTx).

Signed-off-by: Sheng Yang <sheng@linux.intel.com>
---
 virt/kvm/kvm_main.c |   22 ++++++++--------------
 1 files changed, 8 insertions(+), 14 deletions(-)

Comments

Avi Kivity May 4, 2009, 8:25 a.m. UTC | #1
Sheng Yang wrote:
> Disable interrupt at interrupt handler and enable it when guest ack is for
> the level triggered interrupt, to prevent reinjected interrupt. MSI/MSI-X don't
> need it.
>
> One possible problem is multiply same vector interrupt injected between irq
> handler and scheduled work handler would be merged as one for MSI/MSI-X.
> But AFAIK, the drivers handle it well.
>
> The patch fixed the oplin card performance issue(MSI-X performance is half of
> MSI/INTx).
>
>  
>  	schedule_work(&assigned_dev->interrupt_work);
>  
> -	disable_irq_nosync(irq);
> -	assigned_dev->host_irq_disabled = true;
> +	if (assigned_dev->irq_requested_type & KVM_DEV_IRQ_GUEST_INTX) {
> +		disable_irq_nosync(irq);
> +		assigned_dev->host_irq_disabled = true;
> +	}
>  
>  out:
>  	spin_unlock_irqrestore(&assigned_dev->assigned_dev_lock, flags);
>   

I don't have the spin_lock_irqrestore() here.  The patch applies, but 
with fuzz.  Am I missing a patch?
Sheng Yang May 4, 2009, 8:30 a.m. UTC | #2
On Monday 04 May 2009 16:25:55 Avi Kivity wrote:
> Sheng Yang wrote:
> > Disable interrupt at interrupt handler and enable it when guest ack is
> > for the level triggered interrupt, to prevent reinjected interrupt.
> > MSI/MSI-X don't need it.
> >
> > One possible problem is multiply same vector interrupt injected between
> > irq handler and scheduled work handler would be merged as one for
> > MSI/MSI-X. But AFAIK, the drivers handle it well.
> >
> > The patch fixed the oplin card performance issue(MSI-X performance is
> > half of MSI/INTx).
> >
> >
> >  	schedule_work(&assigned_dev->interrupt_work);
> >
> > -	disable_irq_nosync(irq);
> > -	assigned_dev->host_irq_disabled = true;
> > +	if (assigned_dev->irq_requested_type & KVM_DEV_IRQ_GUEST_INTX) {
> > +		disable_irq_nosync(irq);
> > +		assigned_dev->host_irq_disabled = true;
> > +	}
> >
> >  out:
> >  	spin_unlock_irqrestore(&assigned_dev->assigned_dev_lock, flags);
>
> I don't have the spin_lock_irqrestore() here.  The patch applies, but
> with fuzz.  Am I missing a patch?

Oh, it's Marcelo's patchset...

[patch 0/4] use smp_send_reschedule in vcpu_kick / assigned dev host intx race 
fix
Avi Kivity May 4, 2009, 8:34 a.m. UTC | #3
Sheng Yang wrote:
> On Monday 04 May 2009 16:25:55 Avi Kivity wrote:
>   
>> Sheng Yang wrote:
>>     
>>> Disable interrupt at interrupt handler and enable it when guest ack is
>>> for the level triggered interrupt, to prevent reinjected interrupt.
>>> MSI/MSI-X don't need it.
>>>
>>> One possible problem is multiply same vector interrupt injected between
>>> irq handler and scheduled work handler would be merged as one for
>>> MSI/MSI-X. But AFAIK, the drivers handle it well.
>>>
>>> The patch fixed the oplin card performance issue(MSI-X performance is
>>> half of MSI/INTx).
>>>
>>>
>>>  	schedule_work(&assigned_dev->interrupt_work);
>>>
>>> -	disable_irq_nosync(irq);
>>> -	assigned_dev->host_irq_disabled = true;
>>> +	if (assigned_dev->irq_requested_type & KVM_DEV_IRQ_GUEST_INTX) {
>>> +		disable_irq_nosync(irq);
>>> +		assigned_dev->host_irq_disabled = true;
>>> +	}
>>>
>>>  out:
>>>  	spin_unlock_irqrestore(&assigned_dev->assigned_dev_lock, flags);
>>>       
>> I don't have the spin_lock_irqrestore() here.  The patch applies, but
>> with fuzz.  Am I missing a patch?
>>     
>
> Oh, it's Marcelo's patchset...
>
> [patch 0/4] use smp_send_reschedule in vcpu_kick / assigned dev host intx race 
> fix
>   

Okay, I am working my queue in reverse order :)

But please note dependencies on other patches for me.
Sheng Yang May 4, 2009, 8:37 a.m. UTC | #4
On Monday 04 May 2009 16:34:00 Avi Kivity wrote:
> Sheng Yang wrote:
> > On Monday 04 May 2009 16:25:55 Avi Kivity wrote:
> >> Sheng Yang wrote:
> >>> Disable interrupt at interrupt handler and enable it when guest ack is
> >>> for the level triggered interrupt, to prevent reinjected interrupt.
> >>> MSI/MSI-X don't need it.
> >>>
> >>> One possible problem is multiply same vector interrupt injected between
> >>> irq handler and scheduled work handler would be merged as one for
> >>> MSI/MSI-X. But AFAIK, the drivers handle it well.
> >>>
> >>> The patch fixed the oplin card performance issue(MSI-X performance is
> >>> half of MSI/INTx).
> >>>
> >>>
> >>>  	schedule_work(&assigned_dev->interrupt_work);
> >>>
> >>> -	disable_irq_nosync(irq);
> >>> -	assigned_dev->host_irq_disabled = true;
> >>> +	if (assigned_dev->irq_requested_type & KVM_DEV_IRQ_GUEST_INTX) {
> >>> +		disable_irq_nosync(irq);
> >>> +		assigned_dev->host_irq_disabled = true;
> >>> +	}
> >>>
> >>>  out:
> >>>  	spin_unlock_irqrestore(&assigned_dev->assigned_dev_lock, flags);
> >>
> >> I don't have the spin_lock_irqrestore() here.  The patch applies, but
> >> with fuzz.  Am I missing a patch?
> >
> > Oh, it's Marcelo's patchset...
> >
> > [patch 0/4] use smp_send_reschedule in vcpu_kick / assigned dev host intx
> > race fix
>
> Okay, I am working my queue in reverse order :)
>
> But please note dependencies on other patches for me.

Yes, sorry for totally forgot (mine based on his patchset)... :(
Avi Kivity May 31, 2009, 9:48 a.m. UTC | #5
Sheng Yang wrote:
> Disable interrupt at interrupt handler and enable it when guest ack is for
> the level triggered interrupt, to prevent reinjected interrupt. MSI/MSI-X don't
> need it.
>
> One possible problem is multiply same vector interrupt injected between irq
> handler and scheduled work handler would be merged as one for MSI/MSI-X.
> But AFAIK, the drivers handle it well.
>
> The patch fixed the oplin card performance issue(MSI-X performance is half of
> MSI/INTx).
>   

Applied, thanks.
diff mbox

Patch

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index eebc5ed..de8f205 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -120,7 +120,7 @@  static void kvm_assigned_dev_interrupt_work_handler(struct work_struct *work)
 {
 	struct kvm_assigned_dev_kernel *assigned_dev;
 	struct kvm *kvm;
-	int irq, i;
+	int i;
 
 	assigned_dev = container_of(work, struct kvm_assigned_dev_kernel,
 				    interrupt_work);
@@ -143,20 +143,10 @@  static void kvm_assigned_dev_interrupt_work_handler(struct work_struct *work)
 			kvm_set_irq(assigned_dev->kvm,
 				    assigned_dev->irq_source_id,
 				    guest_entries[i].vector, 1);
-			irq = assigned_dev->host_msix_entries[i].vector;
-			if (irq != 0)
-				enable_irq(irq);
-			assigned_dev->host_irq_disabled = false;
 		}
-	} else {
+	} else
 		kvm_set_irq(assigned_dev->kvm, assigned_dev->irq_source_id,
 			    assigned_dev->guest_irq, 1);
-		if (assigned_dev->irq_requested_type &
-				KVM_DEV_IRQ_GUEST_MSI) {
-			enable_irq(assigned_dev->host_irq);
-			assigned_dev->host_irq_disabled = false;
-		}
-	}
 
 	spin_unlock_irq(&assigned_dev->assigned_dev_lock);
 	mutex_unlock(&assigned_dev->kvm->lock);
@@ -179,8 +169,10 @@  static irqreturn_t kvm_assigned_dev_intr(int irq, void *dev_id)
 
 	schedule_work(&assigned_dev->interrupt_work);
 
-	disable_irq_nosync(irq);
-	assigned_dev->host_irq_disabled = true;
+	if (assigned_dev->irq_requested_type & KVM_DEV_IRQ_GUEST_INTX) {
+		disable_irq_nosync(irq);
+		assigned_dev->host_irq_disabled = true;
+	}
 
 out:
 	spin_unlock_irqrestore(&assigned_dev->assigned_dev_lock, flags);
@@ -417,6 +409,7 @@  static int assigned_device_enable_guest_msi(struct kvm *kvm,
 {
 	dev->guest_irq = irq->guest_irq;
 	dev->ack_notifier.gsi = -1;
+	dev->host_irq_disabled = false;
 	return 0;
 }
 #endif
@@ -427,6 +420,7 @@  static int assigned_device_enable_guest_msix(struct kvm *kvm,
 {
 	dev->guest_irq = irq->guest_irq;
 	dev->ack_notifier.gsi = -1;
+	dev->host_irq_disabled = false;
 	return 0;
 }
 #endif