From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35810) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bXWqi-0001w9-45 for qemu-devel@nongnu.org; Wed, 10 Aug 2016 12:59:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bXWqd-00075a-Uy for qemu-devel@nongnu.org; Wed, 10 Aug 2016 12:59:23 -0400 Received: from mx1.redhat.com ([209.132.183.28]:44194) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bXWqd-00075S-Ml for qemu-devel@nongnu.org; Wed, 10 Aug 2016 12:59:19 -0400 Date: Wed, 10 Aug 2016 18:59:14 +0200 From: Radim =?utf-8?B?S3LEjW3DocWZ?= Message-ID: <20160810165912.GC1574@potion> References: <20160809150333.9991-1-rkrcmar@redhat.com> <20160809150333.9991-3-rkrcmar@redhat.com> <20160810032946.GG4201@pxdev.xzpeter.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20160810032946.GG4201@pxdev.xzpeter.org> Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH 2/2] intel-iommu: restrict EIM to quirkless KVM List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Xu Cc: qemu-devel@nongnu.org, Jan Kiszka , Paolo Bonzini , Richard Henderson , Eduardo Habkost , "Michael S. Tsirkin" 2016-08-10 11:29+0800, Peter Xu: > On Tue, Aug 09, 2016 at 05:03:33PM +0200, Radim Kr=C4=8Dm=C3=A1=C5=99 w= rote: >> APIC in QEMU doesn't support x2APIC so exposing EIM is pointless and K= VM >> has a quirk that needs to be disabled unless we want x2APIC message wi= th >> destination 0xff to be misinterpreted as a broadcast. >>=20 >> Signed-off-by: Radim Kr=C4=8Dm=C3=A1=C5=99 >> --- >> diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c >> @@ -31,6 +31,7 @@ >> #include "hw/i386/x86-iommu.h" >> #include "hw/pci-host/q35.h" >> #include "sysemu/kvm.h" >> +#include "kvm_i386.h" >> =20 >> /*#define DEBUG_INTEL_IOMMU*/ >> #ifdef DEBUG_INTEL_IOMMU >> @@ -2364,7 +2365,14 @@ static void vtd_init(IntelIOMMUState *s) >> s->ecap =3D VTD_ECAP_QI | VTD_ECAP_IRO; >> =20 >> if (x86_iommu->intr_supported) { >> - s->ecap |=3D VTD_ECAP_IR | VTD_ECAP_EIM | VTD_ECAP_MHMV; >> + s->ecap |=3D VTD_ECAP_IR | VTD_ECAP_MHMV; >> + /* QEMU APIC does not support x2APIC and KVM does not work we= ll without >> + * disabling a quirk. IOMMU is unmigratable so we unconditio= nally use >> + * optional KVM features. >> + */ >> + if (kvm_irqchip_in_kernel() && kvm_disable_x2apic_broadcast_q= uirk()) { >> + s->ecap |=3D VTD_ECAP_EIM; >> + } >=20 > Good to me if this patch is only going to disable x2apic when we > failed to disable the x2apic broadcast quirk in KVM. Do you mean to also allow QEMU's APIC? if (!kvm_irqchip_in_kernel() || kvm_disable_x2apic_broadcast_quirk()) Thanks. > Question: still not too clear about how KVM treats the case when > x2apic and xapic are used in a single VM. E.g., if dest_id of an > interrupt is 0xff from a peripheral device, how should I know this is > a x2apic broadcast to 0-7 cpu in cluster 0, or an apic broadcast to > all? If a KVM guest has LAPICs in both x and x2 modes, then every interrupt arrives to all LAPICs and is accepted according to ID/LDR/DFR where every LAPIC assumes that the sender matches LAPIC's mode =3D> all xLAPICs would accept 0xff and x2LAPICs with ID 0-7 would as well. kvm_apic_match_dest() is the function that decides and kvm_apic_mda() does most of the magic. The quirk disables a case that translated 0xff to 0xffffffff for x2LAPICs. I don't know how real hardware does it and the behavior might even differ between FSB and QPI. I think KVM differs from both of them, but it's not that any behavior makes a difference in practice, so running a test kernel to figure it out has never been a priority ...