On 29/09/2016 13:23, Radim Krčmář wrote: > QEMU 2.7 allowed EIM even in configurations that were forbidden in the > last patch because they were not working, like old KVM or userspace > APIC. In order to keep backward compatibility, we again allow guests to > misbehave in non-obvious ways, and make it the default. > > Signed-off-by: Radim Krčmář <rkrc...@redhat.com>
Ugh, I misremembered that VTD_ECAP_EIM was not set in 2.7. :( Perhaps it's better to drop this patch... Paolo > --- > hw/i386/intel_iommu.c | 6 +++++- > hw/i386/pc_q35.c | 2 ++ > include/hw/i386/pc.h | 2 ++ > 3 files changed, 9 insertions(+), 1 deletion(-) > > diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c > index b1afe5b133e0..d6657a361ff9 100644 > --- a/hw/i386/intel_iommu.c > +++ b/hw/i386/intel_iommu.c > @@ -2458,6 +2458,7 @@ static AddressSpace *vtd_host_dma_iommu(PCIBus *bus, > void *opaque, int devfn) > static void vtd_realize(DeviceState *dev, Error **errp) > { > PCMachineState *pcms = PC_MACHINE(qdev_get_machine()); > + PCMachineClass *pcmc = PC_MACHINE_CLASS(MACHINE_GET_CLASS(pcms)); > PCIBus *bus = pcms->bus; > IntelIOMMUState *s = INTEL_IOMMU_DEVICE(dev); > X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(dev); > @@ -2481,11 +2482,14 @@ static void vtd_realize(DeviceState *dev, Error > **errp) > if (s->intr_eim == ON_OFF_AUTO_AUTO && !x86_iommu->intr_supported) { > s->intr_eim = ON_OFF_AUTO_OFF; > } > + if (s->intr_eim == ON_OFF_AUTO_AUTO && pcmc->buggy_intel_iommu_eim) { > + s->intr_eim = ON_OFF_AUTO_ON; > + } > if (s->intr_eim == ON_OFF_AUTO_AUTO) { > s->intr_eim = kvm_irqchip_in_kernel() ? ON_OFF_AUTO_ON > : ON_OFF_AUTO_OFF; > } > - if (s->intr_eim == ON_OFF_AUTO_ON) { > + if (s->intr_eim == ON_OFF_AUTO_ON && !pcmc->buggy_intel_iommu_eim) { > if (kvm_irqchip_in_kernel() && !kvm_enable_x2apic()) { > error_report("intel-iommu,eim=on requires support on the KVM > side " > "(X2APIC_API, first shipped in v4.7)."); > diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c > index 0b214f24c977..97f419fbf4dd 100644 > --- a/hw/i386/pc_q35.c > +++ b/hw/i386/pc_q35.c > @@ -304,8 +304,10 @@ DEFINE_Q35_MACHINE(v2_8, "pc-q35-2.8", NULL, > > static void pc_q35_2_7_machine_options(MachineClass *m) > { > + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); > pc_q35_2_8_machine_options(m); > m->alias = NULL; > + pcmc->buggy_intel_iommu_eim = true; > SET_MACHINE_COMPAT(m, PC_COMPAT_2_7); > } > > diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h > index 47bdf10cfd9b..4bd435f8fa5c 100644 > --- a/include/hw/i386/pc.h > +++ b/include/hw/i386/pc.h > @@ -143,6 +143,8 @@ struct PCMachineClass { > bool save_tsc_khz; > /* generate legacy CPU hotplug AML */ > bool legacy_cpu_hotplug; > + /* enable buggy Intel-IOMMU EIM by default */ > + bool buggy_intel_iommu_eim; > }; > > #define TYPE_PC_MACHINE "generic-pc-machine" >