From nobody Fri Nov 7 04:17:15 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1546948357654680.7164245065419; Tue, 8 Jan 2019 03:52:37 -0800 (PST) Received: from localhost ([127.0.0.1]:49126 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ggpvw-0002LB-NF for importer@patchew.org; Tue, 08 Jan 2019 06:52:36 -0500 Received: from eggs.gnu.org ([209.51.188.92]:37927) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ggprY-0007au-T5 for qemu-devel@nongnu.org; Tue, 08 Jan 2019 06:48:07 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ggprN-0003RN-UA for qemu-devel@nongnu.org; Tue, 08 Jan 2019 06:48:04 -0500 Received: from mx1.redhat.com ([209.132.183.28]:48882) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ggprN-0003Pc-Mi for qemu-devel@nongnu.org; Tue, 08 Jan 2019 06:47:53 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DB573DC910; Tue, 8 Jan 2019 11:47:52 +0000 (UTC) Received: from xz-x1.nay.redhat.com (dhcp-14-116.nay.redhat.com [10.66.14.116]) by smtp.corp.redhat.com (Postfix) with ESMTP id 95D6A5C21C; Tue, 8 Jan 2019 11:47:36 +0000 (UTC) From: Peter Xu To: qemu-devel@nongnu.org Date: Tue, 8 Jan 2019 19:47:16 +0800 Message-Id: <20190108114720.21760-2-peterx@redhat.com> In-Reply-To: <20190108114720.21760-1-peterx@redhat.com> References: <20190108114720.21760-1-peterx@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 08 Jan 2019 11:47:52 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 1/5] intel_iommu: fix operator in vtd_switch_address_space X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Michael S . Tsirkin" , Jason Wang , peterx@redhat.com, Eric Auger , Alex Williamson , Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" When calculating use_iommu, we wanted to first detect whether DMAR is enabled, then check whether PT is enabled if DMAR is enabled. However in the current code we used "&" rather than "&&" so the ordering requirement is lost (instead it'll be an "AND" operation). This could introduce errors dumped in QEMU console when rebooting a guest with both assigned device and vIOMMU, like: qemu-system-x86_64: vtd_dev_to_context_entry: invalid root entry: rsvd=3D0xf000ff53f000e2c3, val=3D0xf000ff53f000ff53 (reserved nonzero) Signed-off-by: Peter Xu Acked-by: Jason Wang --- hw/i386/intel_iommu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index 8b72735650..6d5cc1d039 100644 --- a/hw/i386/intel_iommu.c +++ b/hw/i386/intel_iommu.c @@ -1153,7 +1153,7 @@ static bool vtd_switch_address_space(VTDAddressSpace = *as) =20 assert(as); =20 - use_iommu =3D as->iommu_state->dmar_enabled & !vtd_dev_pt_enabled(as); + use_iommu =3D as->iommu_state->dmar_enabled && !vtd_dev_pt_enabled(as); =20 trace_vtd_switch_address_space(pci_bus_num(as->bus), VTD_PCI_SLOT(as->devfn), --=20 2.17.1 From nobody Fri Nov 7 04:17:15 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1546948259066324.36363062041926; Tue, 8 Jan 2019 03:50:59 -0800 (PST) Received: from localhost ([127.0.0.1]:48876 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ggpuM-0000uh-4M for importer@patchew.org; Tue, 08 Jan 2019 06:50:58 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38135) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ggps0-0007v6-Hy for qemu-devel@nongnu.org; Tue, 08 Jan 2019 06:48:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ggpry-0004kE-AS for qemu-devel@nongnu.org; Tue, 08 Jan 2019 06:48:32 -0500 Received: from mx1.redhat.com ([209.132.183.28]:42284) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ggprt-0004OB-LU for qemu-devel@nongnu.org; Tue, 08 Jan 2019 06:48:28 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0BEFC85541; Tue, 8 Jan 2019 11:48:20 +0000 (UTC) Received: from xz-x1.nay.redhat.com (dhcp-14-116.nay.redhat.com [10.66.14.116]) by smtp.corp.redhat.com (Postfix) with ESMTP id 64C985C21C; Tue, 8 Jan 2019 11:47:53 +0000 (UTC) From: Peter Xu To: qemu-devel@nongnu.org Date: Tue, 8 Jan 2019 19:47:17 +0800 Message-Id: <20190108114720.21760-3-peterx@redhat.com> In-Reply-To: <20190108114720.21760-1-peterx@redhat.com> References: <20190108114720.21760-1-peterx@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 08 Jan 2019 11:48:20 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 2/5] intel_iommu: reset intr_enabled when system reset X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Michael S . Tsirkin" , Jason Wang , peterx@redhat.com, Eric Auger , Alex Williamson , Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This is found when I was debugging another problem. Until now no bug is reported with this but we'd better reset the IR status correctly after a system reset. Signed-off-by: Peter Xu Acked-by: Jason Wang --- hw/i386/intel_iommu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index 6d5cc1d039..ee22e754f0 100644 --- a/hw/i386/intel_iommu.c +++ b/hw/i386/intel_iommu.c @@ -3138,6 +3138,7 @@ static void vtd_init(IntelIOMMUState *s) s->root =3D 0; s->root_extended =3D false; s->dmar_enabled =3D false; + s->intr_enabled =3D false; s->iq_head =3D 0; s->iq_tail =3D 0; s->iq =3D 0; --=20 2.17.1 From nobody Fri Nov 7 04:17:15 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1546948403203249.46552082331732; Tue, 8 Jan 2019 03:53:23 -0800 (PST) Received: from localhost ([127.0.0.1]:49227 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ggpwa-0002pr-IN for importer@patchew.org; Tue, 08 Jan 2019 06:53:16 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38190) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ggps2-0007vw-Dr for qemu-devel@nongnu.org; Tue, 08 Jan 2019 06:48:35 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ggps1-0004r4-GF for qemu-devel@nongnu.org; Tue, 08 Jan 2019 06:48:34 -0500 Received: from mx1.redhat.com ([209.132.183.28]:38978) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ggps1-0004pY-7A for qemu-devel@nongnu.org; Tue, 08 Jan 2019 06:48:33 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7D590C060214; Tue, 8 Jan 2019 11:48:32 +0000 (UTC) Received: from xz-x1.nay.redhat.com (dhcp-14-116.nay.redhat.com [10.66.14.116]) by smtp.corp.redhat.com (Postfix) with ESMTP id 872A35C236; Tue, 8 Jan 2019 11:48:20 +0000 (UTC) From: Peter Xu To: qemu-devel@nongnu.org Date: Tue, 8 Jan 2019 19:47:18 +0800 Message-Id: <20190108114720.21760-4-peterx@redhat.com> In-Reply-To: <20190108114720.21760-1-peterx@redhat.com> References: <20190108114720.21760-1-peterx@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 08 Jan 2019 11:48:32 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 3/5] pci/msi: export msi_is_masked() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Michael S . Tsirkin" , Jason Wang , peterx@redhat.com, Eric Auger , Alex Williamson , Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" It is going to be used later on outside MSI code to detect whether one MSI vector is masked out. Signed-off-by: Peter Xu --- hw/pci/msi.c | 2 +- include/hw/pci/msi.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hw/pci/msi.c b/hw/pci/msi.c index 5e05ce5ec2..47d2b0f33c 100644 --- a/hw/pci/msi.c +++ b/hw/pci/msi.c @@ -286,7 +286,7 @@ void msi_reset(PCIDevice *dev) MSI_DEV_PRINTF(dev, "reset\n"); } =20 -static bool msi_is_masked(const PCIDevice *dev, unsigned int vector) +bool msi_is_masked(const PCIDevice *dev, unsigned int vector) { uint16_t flags =3D pci_get_word(dev->config + msi_flags_off(dev)); uint32_t mask, data; diff --git a/include/hw/pci/msi.h b/include/hw/pci/msi.h index 4837bcf490..8440eaee11 100644 --- a/include/hw/pci/msi.h +++ b/include/hw/pci/msi.h @@ -39,6 +39,7 @@ int msi_init(struct PCIDevice *dev, uint8_t offset, bool msi_per_vector_mask, Error **errp); void msi_uninit(struct PCIDevice *dev); void msi_reset(PCIDevice *dev); +bool msi_is_masked(const PCIDevice *dev, unsigned int vector); void msi_notify(PCIDevice *dev, unsigned int vector); void msi_send_message(PCIDevice *dev, MSIMessage msg); void msi_write_config(PCIDevice *dev, uint32_t addr, uint32_t val, int len= ); --=20 2.17.1 From nobody Fri Nov 7 04:17:15 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1546948511718675.1274818939361; Tue, 8 Jan 2019 03:55:11 -0800 (PST) Received: from localhost ([127.0.0.1]:49426 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ggpyH-0003yf-MU for importer@patchew.org; Tue, 08 Jan 2019 06:55:01 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38336) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ggpsN-0008BX-9Q for qemu-devel@nongnu.org; Tue, 08 Jan 2019 06:48:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ggpsL-0005c9-87 for qemu-devel@nongnu.org; Tue, 08 Jan 2019 06:48:55 -0500 Received: from mx1.redhat.com ([209.132.183.28]:39518) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ggpsE-00055s-LM for qemu-devel@nongnu.org; Tue, 08 Jan 2019 06:48:48 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 90DD4369BC; Tue, 8 Jan 2019 11:48:38 +0000 (UTC) Received: from xz-x1.nay.redhat.com (dhcp-14-116.nay.redhat.com [10.66.14.116]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0459D5C21C; Tue, 8 Jan 2019 11:48:32 +0000 (UTC) From: Peter Xu To: qemu-devel@nongnu.org Date: Tue, 8 Jan 2019 19:47:19 +0800 Message-Id: <20190108114720.21760-5-peterx@redhat.com> In-Reply-To: <20190108114720.21760-1-peterx@redhat.com> References: <20190108114720.21760-1-peterx@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 08 Jan 2019 11:48:38 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 4/5] i386/kvm: ignore masked irqs when update msi routes X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Michael S . Tsirkin" , Jason Wang , peterx@redhat.com, Eric Auger , Alex Williamson , Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" When we are with intel-iommu device and with IR on, KVM will register an IEC notifier to detect interrupt updates from the guest and we'll kick off kvm_update_msi_routes_all() when it happens to make sure kernel IRQ cache is matching the latest. Though, kvm_update_msi_routes_all() is buggy in that it ignored the mask bit of either MSI/MSIX messages and it tries to translate the message even if the corresponding message was already masked by the guest driver (hence the MSI/MSIX message will be invalid). Without this patch, we can receive an error message when we reboot a guest with both an assigned vfio-pci device and intel-iommu enabled: qemu-system-x86_64: vtd_interrupt_remap_msi: MSI address low 32 bit inval= id: 0x0 The error does not affect functionality of the guest since when we failed to translate we'll just silently continue (which makes sense since crashing the VM for this seems even worse), but still it's better to fix it up. Signed-off-by: Peter Xu --- target/i386/kvm.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/target/i386/kvm.c b/target/i386/kvm.c index 739cf8c8ea..08e211c70e 100644 --- a/target/i386/kvm.c +++ b/target/i386/kvm.c @@ -3889,7 +3889,7 @@ static QLIST_HEAD(, MSIRouteEntry) msi_route_list =3D= \ static void kvm_update_msi_routes_all(void *private, bool global, uint32_t index, uint32_t mask) { - int cnt =3D 0; + int cnt =3D 0, vector; MSIRouteEntry *entry; MSIMessage msg; PCIDevice *dev; @@ -3897,11 +3897,19 @@ static void kvm_update_msi_routes_all(void *private= , bool global, /* TODO: explicit route update */ QLIST_FOREACH(entry, &msi_route_list, list) { cnt++; + vector =3D entry->vector; dev =3D entry->dev; - if (!msix_enabled(dev) && !msi_enabled(dev)) { + if (msix_enabled(dev) && !msix_is_masked(dev, vector)) { + msg =3D msix_get_message(dev, vector); + } else if (msi_enabled(dev) && !msi_is_masked(dev, vector)) { + msg =3D msi_get_message(dev, vector); + } else { + /* + * Either MSI/MSIX is disabled for the device, or the + * specific message was masked out. Skip this one. + */ continue; } - msg =3D pci_get_msi_message(dev, entry->vector); kvm_irqchip_update_msi_route(kvm_state, entry->virq, msg, dev); } kvm_irqchip_commit_routes(kvm_state); --=20 2.17.1 From nobody Fri Nov 7 04:17:15 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 154694826135555.01273660443849; Tue, 8 Jan 2019 03:51:01 -0800 (PST) Received: from localhost ([127.0.0.1]:48887 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ggpuO-00011C-E2 for importer@patchew.org; Tue, 08 Jan 2019 06:51:00 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38371) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ggpsO-0008Cf-Cm for qemu-devel@nongnu.org; Tue, 08 Jan 2019 06:48:57 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ggpsN-0005hV-9j for qemu-devel@nongnu.org; Tue, 08 Jan 2019 06:48:56 -0500 Received: from mx1.redhat.com ([209.132.183.28]:18573) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ggpsM-0005En-8q for qemu-devel@nongnu.org; Tue, 08 Jan 2019 06:48:55 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EAD4DBDEA; Tue, 8 Jan 2019 11:48:41 +0000 (UTC) Received: from xz-x1.nay.redhat.com (dhcp-14-116.nay.redhat.com [10.66.14.116]) by smtp.corp.redhat.com (Postfix) with ESMTP id 19F405C236; Tue, 8 Jan 2019 11:48:38 +0000 (UTC) From: Peter Xu To: qemu-devel@nongnu.org Date: Tue, 8 Jan 2019 19:47:20 +0800 Message-Id: <20190108114720.21760-6-peterx@redhat.com> In-Reply-To: <20190108114720.21760-1-peterx@redhat.com> References: <20190108114720.21760-1-peterx@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 08 Jan 2019 11:48:41 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 5/5] vfio: retry one more time conditionally for type1 unmap X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Michael S . Tsirkin" , Jason Wang , peterx@redhat.com, Eric Auger , Alex Williamson , Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" In Linux version v4.15+ there's a bug (introduced in 71a7d3d78e3c, "vfio/type1: silence integer overflow warning", 2017-10-20) that could potentially reject a valid unmap region that covers exactly the whole u64 address space (like iova=3D0xfef00000, size=3D2^64-0xfef00000). Besides a fix on the kernel side, QEMU also needs to live well even with the old kernels. When booting a guest with both vfio-pci and intel-iommu device, we can see error dumped: qemu-kvm: VFIO_UNMAP_DMA: -22 qemu-kvm: vfio_dma_unmap(0x561f059948f0, 0xfef00000, 0xffffffff01100000) =3D -22 (Invalid argument) This patch gives another shot of the UNMAP ioctl if the specific error was detected, while in the second UNMAP ioctl we skip the last page assuming that it's never used. In our case, currently only Intel VT-d is using this code and it should never use the iova address 2^64-4096 (so far largest supported GAW is 57 bits) so ignoring that page should be fine. After this patch is applied, the errors go away. Reported-by: Pei Zhang Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=3D1662291 Suggested-by: Alex Williamson Signed-off-by: Peter Xu --- hw/vfio/common.c | 16 ++++++++++++++++ hw/vfio/trace-events | 1 + 2 files changed, 17 insertions(+) diff --git a/hw/vfio/common.c b/hw/vfio/common.c index 7c185e5a2e..7f8de5b7a5 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -221,6 +221,22 @@ static int vfio_dma_unmap(VFIOContainer *container, }; =20 if (ioctl(container->fd, VFIO_IOMMU_UNMAP_DMA, &unmap)) { + /* + * Give it another shot due to a bug in kernel (v4.15-v4.20) + * that could potentially reject a region that exactly covers + * the whole u64 address space (71a7d3d78e3c, "vfio/type1: + * silence integer overflow warning", 2017-10-20). If that + * happens, we retry for one more time assuming that the last + * page of the address space (2^64-getpagesize()) has already + * been dropped. + */ + if (errno =3D=3D EINVAL && unmap.size && unmap.iova + unmap.size = =3D=3D 0) { + trace_vfio_dma_unmap_workaround_overflow(); + unmap.size -=3D getpagesize(); + if (ioctl(container->fd, VFIO_IOMMU_UNMAP_DMA, &unmap) =3D=3D = 0) { + return 0; + } + } error_report("VFIO_UNMAP_DMA: %d", -errno); return -errno; } diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events index a85e8662ea..2c9db4fb9a 100644 --- a/hw/vfio/trace-events +++ b/hw/vfio/trace-events @@ -110,6 +110,7 @@ vfio_region_mmaps_set_enabled(const char *name, bool en= abled) "Region %s mmaps e vfio_region_sparse_mmap_header(const char *name, int index, int nr_areas) = "Device %s region %d: %d sparse mmap entries" vfio_region_sparse_mmap_entry(int i, unsigned long start, unsigned long en= d) "sparse entry %d [0x%lx - 0x%lx]" vfio_get_dev_region(const char *name, int index, uint32_t type, uint32_t s= ubtype) "%s index %d, %08x/%0x8" +vfio_dma_unmap_workaround_overflow(void) "" =20 # hw/vfio/platform.c vfio_platform_base_device_init(char *name, int groupid) "%s belongs to gro= up #%d" --=20 2.17.1