From patchwork Wed May 19 16:28:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Eugenio Perez Martin X-Patchwork-Id: 12267959 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A1A20C433ED for ; Wed, 19 May 2021 16:42:49 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 1FE1960E0B for ; Wed, 19 May 2021 16:42:49 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1FE1960E0B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:55076 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ljPHT-0006Mk-Vh for qemu-devel@archiver.kernel.org; Wed, 19 May 2021 12:42:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:35098) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ljP6h-0005vw-20 for qemu-devel@nongnu.org; Wed, 19 May 2021 12:31:39 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:42824) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ljP6e-0005vj-TV for qemu-devel@nongnu.org; Wed, 19 May 2021 12:31:38 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1621441896; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=V9LrI5P9tyxXNbE1l58yZAifcj59RDu8GvtjXC0K7Og=; b=LcAqFqh2X7II5mS0+IPAK4TKFiTeAhxo7lCajMKLXbhmgYoE7gCR5w1fjAL1iM4knhxnVb Nq+sJ4bWG7efgL858jw3RkzgD9r89+yiG18w+pk7sRtsUxVzpnmh5rOE2EenFQ3aWBRi4/ HVbCUAN5Lg5y07vaKlVW1oyPQo/opWc= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-273-83H4Bj-EPdO9aS9zczD4mQ-1; Wed, 19 May 2021 12:31:33 -0400 X-MC-Unique: 83H4Bj-EPdO9aS9zczD4mQ-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 9F607C73A4; Wed, 19 May 2021 16:31:31 +0000 (UTC) Received: from eperezma.remote.csb (ovpn-113-65.ams2.redhat.com [10.36.113.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id A24495D6AC; Wed, 19 May 2021 16:31:28 +0000 (UTC) From: =?utf-8?q?Eugenio_P=C3=A9rez?= To: qemu-devel@nongnu.org Subject: [RFC v3 18/29] vhost: Use vhost_enable_custom_iommu to unmap everything if available Date: Wed, 19 May 2021 18:28:52 +0200 Message-Id: <20210519162903.1172366-19-eperezma@redhat.com> In-Reply-To: <20210519162903.1172366-1-eperezma@redhat.com> References: <20210519162903.1172366-1-eperezma@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=eperezma@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=216.205.24.124; envelope-from=eperezma@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -31 X-Spam_score: -3.2 X-Spam_bar: --- X-Spam_report: (-3.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.39, 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_H4=0.001, RCVD_IN_MSPIKE_WL=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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Parav Pandit , "Michael S. Tsirkin" , Jason Wang , Juan Quintela , Markus Armbruster , virtualization@lists.linux-foundation.org, Harpreet Singh Anand , Xiao W Wang , Stefan Hajnoczi , Eli Cohen , Michael Lilja , Stefano Garzarella Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" This call is the right way to unmap every IOTLB in devices with non standard IOMMU (vdpa devices), since regular one would require an IOTLB message they don't support. Another possible solution would be to implement .vhost_send_device_iotlb_msg vhost operation in vhost-vdpa, but it could conflict with expected backend iommu operations. Currently, this method does not work for vp_vdpa. For some reason, intel IOMMU is not able to map anything when vdpa has unmapped everything. However that is on kernel side, this commit code should be as intended in the final version. Signed-off-by: Eugenio PĂ©rez --- hw/virtio/vhost.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index 5b5001a08a..c8fa9df9b3 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -1241,7 +1241,12 @@ static int vhost_sw_live_migration_stop(struct vhost_dev *dev) r = dev->vhost_ops->vhost_vring_pause(dev); assert(r == 0); - if (vhost_backend_invalidate_device_iotlb(dev, 0, -1ULL)) { + if (dev->vhost_ops->vhost_enable_custom_iommu) { + r = dev->vhost_ops->vhost_enable_custom_iommu(dev, false); + } else { + r = vhost_backend_invalidate_device_iotlb(dev, 0, -1ULL); + } + if (r) { error_report("Fail to invalidate device iotlb"); } @@ -1343,7 +1348,12 @@ static int vhost_sw_live_migration_start(struct vhost_dev *dev) r = dev->vhost_ops->vhost_vring_pause(dev); assert(r == 0); - if (vhost_backend_invalidate_device_iotlb(dev, 0, -1ULL)) { + if (dev->vhost_ops->vhost_enable_custom_iommu) { + r = dev->vhost_ops->vhost_enable_custom_iommu(dev, false); + } else { + r = vhost_backend_invalidate_device_iotlb(dev, 0, -1ULL); + } + if (r) { error_report("Fail to invalidate device iotlb"); } @@ -2100,8 +2110,6 @@ void qmp_x_vhost_enable_shadow_vq(const char *name, bool enable, Error **errp) err_cause = "Cannot pause device"; } else if (hdev->vhost_ops->vhost_get_iova_range) { err_cause = "Device may not support all iova range"; - } else if (hdev->vhost_ops->vhost_enable_custom_iommu) { - err_cause = "Device does not use regular IOMMU"; } else if (!virtio_vdev_has_feature(hdev->vdev, VIRTIO_F_VERSION_1)) { err_cause = "Legacy VirtIO device"; }