kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] KVM: PIC: call ack notifiers for irqs that are dropped form irr
@ 2012-07-17 11:59 Gleb Natapov
  2012-07-20 11:58 ` Marcelo Tosatti
  2012-07-24 12:35 ` Gleb Natapov
  0 siblings, 2 replies; 6+ messages in thread
From: Gleb Natapov @ 2012-07-17 11:59 UTC (permalink / raw)
  To: kvm; +Cc: avi, mtosatti

After commit 242ec97c358256 PIT interrupts are no longer delivered after
PIC reset. It happens because PIT injects interrupt only if previous one
was acked, but since on PIC reset it is dropped from irr it will never
be delivered and hence acknowledged. Fix that by calling ack notifier on
PIC reset.

Signed-off-by: Gleb Natapov <gleb@redhat.com>
diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
index 81cf4fa..f09e790 100644
--- a/arch/x86/kvm/i8259.c
+++ b/arch/x86/kvm/i8259.c
@@ -305,6 +305,7 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
 	addr &= 1;
 	if (addr == 0) {
 		if (val & 0x10) {
+			u8 edge_irr = s->irr & ~s->elcr;
 			s->init4 = val & 1;
 			s->last_irr = 0;
 			s->irr &= s->elcr;
@@ -322,6 +323,9 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
 			if (val & 0x08)
 				pr_pic_unimpl(
 					"level sensitive irq not supported");
+			for (irq = 0; irq < PIC_NUM_PINS/2; irq++)
+				if (edge_irr & (1 << irq))
+					pic_clear_isr(s, irq);
 		} else if (val & 0x08) {
 			if (val & 0x04)
 				s->poll = 1;
--
			Gleb.

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] KVM: PIC: call ack notifiers for irqs that are dropped form irr
  2012-07-17 11:59 [PATCH] KVM: PIC: call ack notifiers for irqs that are dropped form irr Gleb Natapov
@ 2012-07-20 11:58 ` Marcelo Tosatti
  2012-07-20 13:20   ` Gleb Natapov
  2012-07-24 12:35 ` Gleb Natapov
  1 sibling, 1 reply; 6+ messages in thread
From: Marcelo Tosatti @ 2012-07-20 11:58 UTC (permalink / raw)
  To: Gleb Natapov; +Cc: kvm, avi

On Tue, Jul 17, 2012 at 02:59:11PM +0300, Gleb Natapov wrote:
> After commit 242ec97c358256 PIT interrupts are no longer delivered after
> PIC reset. It happens because PIT injects interrupt only if previous one
> was acked, but since on PIC reset it is dropped from irr it will never
> be delivered and hence acknowledged. Fix that by calling ack notifier on
> PIC reset.
> 
> Signed-off-by: Gleb Natapov <gleb@redhat.com>
> diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
> index 81cf4fa..f09e790 100644
> --- a/arch/x86/kvm/i8259.c
> +++ b/arch/x86/kvm/i8259.c
> @@ -305,6 +305,7 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
>  	addr &= 1;
>  	if (addr == 0) {
>  		if (val & 0x10) {
> +			u8 edge_irr = s->irr & ~s->elcr;
>  			s->init4 = val & 1;
>  			s->last_irr = 0;
>  			s->irr &= s->elcr;
> @@ -322,6 +323,9 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
>  			if (val & 0x08)
>  				pr_pic_unimpl(
>  					"level sensitive irq not supported");
> +			for (irq = 0; irq < PIC_NUM_PINS/2; irq++)
> +				if (edge_irr & (1 << irq))
> +					pic_clear_isr(s, irq);
>  		} else if (val & 0x08) {
>  			if (val & 0x04)
>  				s->poll = 1;
> --
> 			Gleb.

Can modify kvm_pic_reset (currently unused BTW) to conform to
9ed049c3b6230b6898 ? It checks for APIC handling interrupts
before acking.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] KVM: PIC: call ack notifiers for irqs that are dropped form irr
  2012-07-20 11:58 ` Marcelo Tosatti
@ 2012-07-20 13:20   ` Gleb Natapov
  0 siblings, 0 replies; 6+ messages in thread
From: Gleb Natapov @ 2012-07-20 13:20 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: kvm, avi

On Fri, Jul 20, 2012 at 08:58:56AM -0300, Marcelo Tosatti wrote:
> On Tue, Jul 17, 2012 at 02:59:11PM +0300, Gleb Natapov wrote:
> > After commit 242ec97c358256 PIT interrupts are no longer delivered after
> > PIC reset. It happens because PIT injects interrupt only if previous one
> > was acked, but since on PIC reset it is dropped from irr it will never
> > be delivered and hence acknowledged. Fix that by calling ack notifier on
> > PIC reset.
> > 
> > Signed-off-by: Gleb Natapov <gleb@redhat.com>
> > diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
> > index 81cf4fa..f09e790 100644
> > --- a/arch/x86/kvm/i8259.c
> > +++ b/arch/x86/kvm/i8259.c
> > @@ -305,6 +305,7 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
> >  	addr &= 1;
> >  	if (addr == 0) {
> >  		if (val & 0x10) {
> > +			u8 edge_irr = s->irr & ~s->elcr;
> >  			s->init4 = val & 1;
> >  			s->last_irr = 0;
> >  			s->irr &= s->elcr;
> > @@ -322,6 +323,9 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
> >  			if (val & 0x08)
> >  				pr_pic_unimpl(
> >  					"level sensitive irq not supported");
> > +			for (irq = 0; irq < PIC_NUM_PINS/2; irq++)
> > +				if (edge_irr & (1 << irq))
> > +					pic_clear_isr(s, irq);
> >  		} else if (val & 0x08) {
> >  			if (val & 0x04)
> >  				s->poll = 1;
> > --
> > 			Gleb.
> 
> Can modify kvm_pic_reset (currently unused BTW) to conform to
> 9ed049c3b6230b6898 ? It checks for APIC handling interrupts
> before acking.
Since it is not used we can make it do anything. But preferably in
speared patch otherwise bug fix will be obfuscated by code move.

--
			Gleb.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] KVM: PIC: call ack notifiers for irqs that are dropped form irr
  2012-07-17 11:59 [PATCH] KVM: PIC: call ack notifiers for irqs that are dropped form irr Gleb Natapov
  2012-07-20 11:58 ` Marcelo Tosatti
@ 2012-07-24 12:35 ` Gleb Natapov
  2012-07-24 12:40   ` Marcelo Tosatti
  1 sibling, 1 reply; 6+ messages in thread
From: Gleb Natapov @ 2012-07-24 12:35 UTC (permalink / raw)
  To: kvm; +Cc: avi, mtosatti

Ping. Is some additional work expected from me before this is applied?

On Tue, Jul 17, 2012 at 02:59:11PM +0300, Gleb Natapov wrote:
> After commit 242ec97c358256 PIT interrupts are no longer delivered after
> PIC reset. It happens because PIT injects interrupt only if previous one
> was acked, but since on PIC reset it is dropped from irr it will never
> be delivered and hence acknowledged. Fix that by calling ack notifier on
> PIC reset.
> 
> Signed-off-by: Gleb Natapov <gleb@redhat.com>
> diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
> index 81cf4fa..f09e790 100644
> --- a/arch/x86/kvm/i8259.c
> +++ b/arch/x86/kvm/i8259.c
> @@ -305,6 +305,7 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
>  	addr &= 1;
>  	if (addr == 0) {
>  		if (val & 0x10) {
> +			u8 edge_irr = s->irr & ~s->elcr;
>  			s->init4 = val & 1;
>  			s->last_irr = 0;
>  			s->irr &= s->elcr;
> @@ -322,6 +323,9 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
>  			if (val & 0x08)
>  				pr_pic_unimpl(
>  					"level sensitive irq not supported");
> +			for (irq = 0; irq < PIC_NUM_PINS/2; irq++)
> +				if (edge_irr & (1 << irq))
> +					pic_clear_isr(s, irq);
>  		} else if (val & 0x08) {
>  			if (val & 0x04)
>  				s->poll = 1;
> --
> 			Gleb.
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
			Gleb.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] KVM: PIC: call ack notifiers for irqs that are dropped form irr
  2012-07-24 12:35 ` Gleb Natapov
@ 2012-07-24 12:40   ` Marcelo Tosatti
  2012-07-24 13:15     ` Gleb Natapov
  0 siblings, 1 reply; 6+ messages in thread
From: Marcelo Tosatti @ 2012-07-24 12:40 UTC (permalink / raw)
  To: Gleb Natapov; +Cc: kvm, avi


On Tue, Jul 24, 2012 at 03:35:14PM +0300, Gleb Natapov wrote:
> Ping. Is some additional work expected from me before this is applied?

Still not clear to me why its safe to skip kvm_apic_accept_pic_intr check
before calling ack notifier. 

> On Tue, Jul 17, 2012 at 02:59:11PM +0300, Gleb Natapov wrote:
> > After commit 242ec97c358256 PIT interrupts are no longer delivered after
> > PIC reset. It happens because PIT injects interrupt only if previous one
> > was acked, but since on PIC reset it is dropped from irr it will never
> > be delivered and hence acknowledged. Fix that by calling ack notifier on
> > PIC reset.
> > 
> > Signed-off-by: Gleb Natapov <gleb@redhat.com>
> > diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
> > index 81cf4fa..f09e790 100644
> > --- a/arch/x86/kvm/i8259.c
> > +++ b/arch/x86/kvm/i8259.c
> > @@ -305,6 +305,7 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
> >  	addr &= 1;
> >  	if (addr == 0) {
> >  		if (val & 0x10) {
> > +			u8 edge_irr = s->irr & ~s->elcr;
> >  			s->init4 = val & 1;
> >  			s->last_irr = 0;
> >  			s->irr &= s->elcr;
> > @@ -322,6 +323,9 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
> >  			if (val & 0x08)
> >  				pr_pic_unimpl(
> >  					"level sensitive irq not supported");
> > +			for (irq = 0; irq < PIC_NUM_PINS/2; irq++)
> > +				if (edge_irr & (1 << irq))
> > +					pic_clear_isr(s, irq);
> >  		} else if (val & 0x08) {
> >  			if (val & 0x04)
> >  				s->poll = 1;
> > --
> > 			Gleb.
> > --

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] KVM: PIC: call ack notifiers for irqs that are dropped form irr
  2012-07-24 12:40   ` Marcelo Tosatti
@ 2012-07-24 13:15     ` Gleb Natapov
  0 siblings, 0 replies; 6+ messages in thread
From: Gleb Natapov @ 2012-07-24 13:15 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: kvm, avi

On Tue, Jul 24, 2012 at 09:40:26AM -0300, Marcelo Tosatti wrote:
> 
> On Tue, Jul 24, 2012 at 03:35:14PM +0300, Gleb Natapov wrote:
> > Ping. Is some additional work expected from me before this is applied?
> 
> Still not clear to me why its safe to skip kvm_apic_accept_pic_intr check
> before calling ack notifier. 
> 
I do not think it is actually.

> > On Tue, Jul 17, 2012 at 02:59:11PM +0300, Gleb Natapov wrote:
> > > After commit 242ec97c358256 PIT interrupts are no longer delivered after
> > > PIC reset. It happens because PIT injects interrupt only if previous one
> > > was acked, but since on PIC reset it is dropped from irr it will never
> > > be delivered and hence acknowledged. Fix that by calling ack notifier on
> > > PIC reset.
> > > 
> > > Signed-off-by: Gleb Natapov <gleb@redhat.com>
> > > diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
> > > index 81cf4fa..f09e790 100644
> > > --- a/arch/x86/kvm/i8259.c
> > > +++ b/arch/x86/kvm/i8259.c
> > > @@ -305,6 +305,7 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
> > >  	addr &= 1;
> > >  	if (addr == 0) {
> > >  		if (val & 0x10) {
> > > +			u8 edge_irr = s->irr & ~s->elcr;
> > >  			s->init4 = val & 1;
> > >  			s->last_irr = 0;
> > >  			s->irr &= s->elcr;
> > > @@ -322,6 +323,9 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
> > >  			if (val & 0x08)
> > >  				pr_pic_unimpl(
> > >  					"level sensitive irq not supported");
> > > +			for (irq = 0; irq < PIC_NUM_PINS/2; irq++)
> > > +				if (edge_irr & (1 << irq))
> > > +					pic_clear_isr(s, irq);
> > >  		} else if (val & 0x08) {
> > >  			if (val & 0x04)
> > >  				s->poll = 1;
> > > --
> > > 			Gleb.
> > > --

--
			Gleb.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-07-24 13:15 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-17 11:59 [PATCH] KVM: PIC: call ack notifiers for irqs that are dropped form irr Gleb Natapov
2012-07-20 11:58 ` Marcelo Tosatti
2012-07-20 13:20   ` Gleb Natapov
2012-07-24 12:35 ` Gleb Natapov
2012-07-24 12:40   ` Marcelo Tosatti
2012-07-24 13:15     ` Gleb Natapov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).