From patchwork Wed Dec 7 13:36:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Auger X-Patchwork-Id: 13067148 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 4E5DCC4708E for ; Wed, 7 Dec 2022 13:38:49 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p2uc7-0002MK-ES; Wed, 07 Dec 2022 08:37:31 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p2uc5-0002Lh-Nf for qemu-devel@nongnu.org; Wed, 07 Dec 2022 08:37:29 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p2ubo-0006Sp-0i for qemu-devel@nongnu.org; Wed, 07 Dec 2022 08:37:29 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670420226; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7tnKkh2H991EuhWAO/Xp+JQeGePEbB2PoZpX19x2WTg=; b=S3TIU+14QXSMXluTc+iiZgncNFBU25LrD3M/HBCok+4U5/quePm/8lFf/aRUfj4XfWNr8m qQGjVdCzPWletQSa5efJsViRxqbXh3fn9Uc7f3VL4IYTYW0hm6amVzRgd6sCW1WNI0tkaI bEPlvs1OFkeL/16X3UL954q2Gl4uLog= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-561-fbEJDFEqOMWbpRtmD3ehzQ-1; Wed, 07 Dec 2022 08:37:01 -0500 X-MC-Unique: fbEJDFEqOMWbpRtmD3ehzQ-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 81CE886F130; Wed, 7 Dec 2022 13:37:00 +0000 (UTC) Received: from laptop.redhat.com (unknown [10.39.193.86]) by smtp.corp.redhat.com (Postfix) with ESMTP id B4B969E70; Wed, 7 Dec 2022 13:36:58 +0000 (UTC) From: Eric Auger To: eric.auger.pro@gmail.com, eric.auger@redhat.com, mst@redhat.com, peterx@redhat.com, qemu-arm@nongnu.org, qemu-devel@nongnu.org, jean-philippe@linaro.org, bharat.bhushan@nxp.com, alex.williamson@redhat.com Subject: [PATCH for 8.0 1/2] virtio-iommu: Add unmap on virtio_iommu_remap() Date: Wed, 7 Dec 2022 14:36:45 +0100 Message-Id: <20221207133646.635760-2-eric.auger@redhat.com> In-Reply-To: <20221207133646.635760-1-eric.auger@redhat.com> References: <20221207133646.635760-1-eric.auger@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.5 Received-SPF: pass client-ip=170.10.129.124; envelope-from=eric.auger@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_PASS=-0.001, T_SPF_HELO_TEMPERROR=0.01 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org following replay() callback documentation in memory.h we shall first invalidate (notify with flag == IOMMU_NONE) and then map for existing mappings. The code currently skips the unmap and just do map. This may lead to duplicate mapping attempts on VFIO side (leading to spurious -EEXIST DMA_MAP failures). Add the unmap. Signed-off-by: Eric Auger Fixes 308e5e1b5f8 ("virtio-iommu: Add replay() memory region callback") --- hw/virtio/virtio-iommu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c index 62e07ec2e4..30334c85aa 100644 --- a/hw/virtio/virtio-iommu.c +++ b/hw/virtio/virtio-iommu.c @@ -1034,6 +1034,7 @@ static gboolean virtio_iommu_remap(gpointer key, gpointer value, gpointer data) trace_virtio_iommu_remap(mr->parent_obj.name, interval->low, interval->high, mapping->phys_addr); + virtio_iommu_notify_unmap(mr, interval->low, interval->high); virtio_iommu_notify_map(mr, interval->low, interval->high, mapping->phys_addr, mapping->flags); return false; From patchwork Wed Dec 7 13:36:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Auger X-Patchwork-Id: 13067147 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 83EE4C352A1 for ; Wed, 7 Dec 2022 13:38:35 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1p2ubz-0002JA-AQ; Wed, 07 Dec 2022 08:37:24 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p2ubv-0002HS-LL for qemu-devel@nongnu.org; Wed, 07 Dec 2022 08:37:21 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1p2ubn-0006Ss-GQ for qemu-devel@nongnu.org; Wed, 07 Dec 2022 08:37:14 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670420226; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5/UyHJl48vBSnvkt5+gx7qkBlKO/QFIhbVzFp57PQ5s=; b=X1mQ+kH6/UpYLFnfaz6Be3AH7vNhCtPTgovygjso6lVFb20uo0J5NUPBjF533Cgfqwko/q JIhRbyB9i/SAyk7b7ANIlQ+oQPPqOdaprNVgbFAds02O/ByQ4GJ4kYOGqVuAYyxxyOg+4W /E7ukq1INVkn4fD/l2kWcog6nxeTmUE= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-621-2JP6O_pdMFGyOYd3wVnk7Q-1; Wed, 07 Dec 2022 08:37:03 -0500 X-MC-Unique: 2JP6O_pdMFGyOYd3wVnk7Q-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id A40B3185A7AD; Wed, 7 Dec 2022 13:37:02 +0000 (UTC) Received: from laptop.redhat.com (unknown [10.39.193.86]) by smtp.corp.redhat.com (Postfix) with ESMTP id CBCD79E70; Wed, 7 Dec 2022 13:37:00 +0000 (UTC) From: Eric Auger To: eric.auger.pro@gmail.com, eric.auger@redhat.com, mst@redhat.com, peterx@redhat.com, qemu-arm@nongnu.org, qemu-devel@nongnu.org, jean-philippe@linaro.org, bharat.bhushan@nxp.com, alex.williamson@redhat.com Subject: [PATCH for 8.0 2/2] virtio-iommu: Fix replay on device attach Date: Wed, 7 Dec 2022 14:36:46 +0100 Message-Id: <20221207133646.635760-3-eric.auger@redhat.com> In-Reply-To: <20221207133646.635760-1-eric.auger@redhat.com> References: <20221207133646.635760-1-eric.auger@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.5 Received-SPF: pass client-ip=170.10.129.124; envelope-from=eric.auger@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org When attaching a device to a domain, we replay the existing domain mappings for that device. If there are several VFIO devices in the same group on the guest we may end up with duplicate mapping attempts because the mapping already exist on VFIO side. So let's do a proper remap, ie. first unmap and then map. Signed-off-by: Eric Auger Fixes 2f6eeb5f0bb ("virtio-iommu: Call memory notifiers in attach/detach") --- hw/virtio/virtio-iommu.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c index 30334c85aa..099dec1f31 100644 --- a/hw/virtio/virtio-iommu.c +++ b/hw/virtio/virtio-iommu.c @@ -277,19 +277,21 @@ static gboolean virtio_iommu_notify_unmap_cb(gpointer key, gpointer value, return false; } -static gboolean virtio_iommu_notify_map_cb(gpointer key, gpointer value, - gpointer data) +static gboolean virtio_iommu_notify_remap_cb(gpointer key, gpointer value, + gpointer data) { VirtIOIOMMUMapping *mapping = (VirtIOIOMMUMapping *) value; VirtIOIOMMUInterval *interval = (VirtIOIOMMUInterval *) key; IOMMUMemoryRegion *mr = (IOMMUMemoryRegion *) data; + virtio_iommu_notify_unmap(mr, interval->low, interval->high); virtio_iommu_notify_map(mr, interval->low, interval->high, mapping->phys_addr, mapping->flags); return false; } + static void virtio_iommu_detach_endpoint_from_domain(VirtIOIOMMUEndpoint *ep) { VirtIOIOMMUDomain *domain = ep->domain; @@ -489,7 +491,7 @@ static int virtio_iommu_attach(VirtIOIOMMU *s, virtio_iommu_switch_address_space(sdev); /* Replay domain mappings on the associated memory region */ - g_tree_foreach(domain->mappings, virtio_iommu_notify_map_cb, + g_tree_foreach(domain->mappings, virtio_iommu_notify_remap_cb, ep->iommu_mr); return VIRTIO_IOMMU_S_OK;