From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kiszka Subject: Re: [PATCH 1/3] KVM: x86: Relax accept conditions of kvm_apic_accept_pic_intr Date: Fri, 17 Oct 2008 20:12:00 +0200 Message-ID: <48F8D570.5010308@web.de> References: <20081015142748.385784583@mchn012c.ww002.siemens.net> <20081015142748.606503565@mchn012c.ww002.siemens.net> <200810171311.11309.sheng@linux.intel.com> <48F8488E.9070700@siemens.com> <20081017163530.GA20831@yukikaze> <48F8CCC5.8060502@web.de> <20081017174722.GA24078@yukikaze> <48F8D1BD.5050709@web.de> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig2EA1BB8B281D908333F345A5" Cc: kvm@vger.kernel.org, avi@redhat.com, jiajun.xu@intel.com, Jan Kiszka To: Sheng Yang Return-path: Received: from fmmailgate01.web.de ([217.72.192.221]:33379 "EHLO fmmailgate01.web.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751237AbYJQSOD (ORCPT ); Fri, 17 Oct 2008 14:14:03 -0400 In-Reply-To: <48F8D1BD.5050709@web.de> Sender: kvm-owner@vger.kernel.org List-ID: This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig2EA1BB8B281D908333F345A5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Jan Kiszka wrote: > Sheng Yang wrote: >> On Fri, Oct 17, 2008 at 07:35:01PM +0200, Jan Kiszka wrote: >>> Sheng Yang wrote: >>>> On Fri, Oct 17, 2008 at 10:10:54AM +0200, Jan Kiszka wrote: >>>>> Sheng Yang wrote: >>>>>> On Wednesday 15 October 2008 22:27:49 Jan Kiszka wrote: >>>>>>> Aligning in-kernel kvm_apic_accept_pic_intr with its user space m= ate, >>>>>>> this patch relaxes the conditions under which PIC IRQs are accept= ed >>>>>>> by LVT0. This reflects reality and allows to reuse the service fo= r the >>>>>>> NMI watchdog use case. >>>>>>> >>>>>>> Signed-off-by: Jan Kiszka >>>>>>> --- >>>>>>> arch/x86/kvm/lapic.c | 13 ++++--------- >>>>>>> 1 file changed, 4 insertions(+), 9 deletions(-) >>>>>>> >>>>>>> Index: b/arch/x86/kvm/lapic.c >>>>>>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >>>>>>> --- a/arch/x86/kvm/lapic.c >>>>>>> +++ b/arch/x86/kvm/lapic.c >>>>>>> @@ -1072,16 +1072,11 @@ int kvm_apic_has_interrupt(struct kvm_vc >>>>>>> int kvm_apic_accept_pic_intr(struct kvm_vcpu *vcpu) >>>>>>> { >>>>>>> u32 lvt0 =3D apic_get_reg(vcpu->arch.apic, APIC_LVT0); >>>>>>> - int r =3D 0; >>>>>>> >>>>>>> - if (vcpu->vcpu_id =3D=3D 0) { >>>>>>> - if (!apic_hw_enabled(vcpu->arch.apic)) >>>>>>> - r =3D 1; >>>>>>> - if ((lvt0 & APIC_LVT_MASKED) =3D=3D 0 && >>>>>>> - GET_APIC_DELIVERY_MODE(lvt0) =3D=3D APIC_MODE_EXTINT) >>>>>>> - r =3D 1; >>>>>>> - } >>>>>>> - return r; >>>>>>> + if (!apic_hw_enabled(vcpu->arch.apic) || >>>>>>> + (lvt0 & APIC_LVT_MASKED) =3D=3D 0) >>>>>>> + return 1; >>>>>>> + return 0; >>>>>>> } >>>>>>> >>>>>>> void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu) >>>>>>> >>>>>> (sorry for late review...) >>>>>> >>>>>> Thanks to find out the root cause of BSOD! >>>>>> >>>>>> But I am a little concern about this change. As you know, PIC only= connect to=20 >>>>>> cpu0. So I think it's not proper to make it generic.=20 >>>>> I don't think so - and if it were true, qemu would have a bug then,= see >>>>> its corresponding code. >>>> You can refer to Intel MP spec, virtual wire mode. Google >>>> "MP spec" can find it. >>> Ah, good reference. >>> >>>> Normally PIC is only used in BSP boot up for SMP guest(PIC can't aff= ord SMP, >>>> otherwise we won't need IOAPIC/LAPIC). After that, it should be disa= bled. >>>> And virtual wire mode works with APIC_MODE_EXTINT on LVT0 of BSP lap= ic, so >>>> that's why you see >>>> >>>> GET_APIC_DELIVERY_MODE(lvt0) =3D=3D APIC_MODE_EXTINT >>>> >>>> KVM follow virtual wire mode exactly. >>> According to my understanding of the spec, the virtual wire mode mean= s >>> that the PIC signal is delivered via LVT0, and thus can be received b= y >>> _all_ CPUs in the system. However, only the BSP usually enables LVT0,= >>> thus is receiving the IRQ. When Linux switches to NMI watchdog mode 1= , >>> it also unmasks the other CPUs (and reprograms all to deliver NMIs >>> instead of EXTINTs). >>> >>> Then there is also the "PIC Mode", ie. direct delivery to the BSP, an= d >>> only the latter. That mode is obviously target by the current >>> kvm_apic_accept_pic_intr implementation. But I find no indication in = the >>> spec yet that both modes cannot exists in the same system. But I also= >>> fail to understand how one could switch between both modes (via softw= are). >> No. If so, we don't need to check LVT0. >=20 > OK, there is that IMCR register to enable/disable the PIC Mode - but > neither KVM nor QEMU implement it (which may indicate they both want to= > provide Virtual Wire Mode?). When enabled, Virtual Wire Mode is > effectively disabled (for the BSP at least) as the LAPIC is disconnecte= d > (from the BSP). >=20 > Still, I find not trace in the spec that says only the BSP can receive > PIC interrupts in Virtual Wire Mode (the LVT0 line is connected to _all= _ > CPUs). Now I checked also the BIOS KVM is shipping, and the MP Feature byte 2, bit 7 (IMCRP) is cleared, thus KVM is providing the Virtual Wire mode. Looking at Figure 3-3 of the MP spec, one can see that the PIC's output is connected to the LVT0 line in this mode, and that this line is connected to all CPUs in the system. So I can't help concluding that a) QEMU's implementation is correct and b) my patch is correct as well. Or please tell me where I'm wrong now... Jan --------------enig2EA1BB8B281D908333F345A5 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org iEYEARECAAYFAkj41XMACgkQniDOoMHTA+lgHACeOvTZvRom1P6VxQQInvODIOEV Y8UAnRSkCajdbPVo3LLx5Z2RHnz0g6DM =rO83 -----END PGP SIGNATURE----- --------------enig2EA1BB8B281D908333F345A5--