Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp3556975imm; Mon, 4 Jun 2018 05:43:54 -0700 (PDT) X-Google-Smtp-Source: ADUXVKLdCD/r3BJHL3tPI7rp4Zrjc4OZSgoFAVTF8izgg+qR/hEafjc4UQQyiYHsFxsrciQP73uI X-Received: by 2002:a17:902:1a8:: with SMTP id b37-v6mr22258546plb.326.1528116234769; Mon, 04 Jun 2018 05:43:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528116234; cv=none; d=google.com; s=arc-20160816; b=JOYI4w7f/+l0R/J+8CgeWQPVqw1GhUEwyNFrYJFDrhv2X7aRee6yExqte+G4+NRgLf CHEcHXHtC/Ep3mn1ZAXRwK3wPgnGDojOTfwfrKh1NY79xgt2OV9mVJST4cO0fMEmKS8+ uvqbWNvv3/j7q4YEhN0AB4uThX9qHUWgSOVkts+hzd99HhDPWHiH+9mpq7kzlVWESFs2 UYuQxRkY7HnaZOZLT8OdqwHY6A2MxffPElD+yS/cDTdEFFSZ79M0iW3FlUXSvp0jzDYD 4D5clLBs+vgfyw/EqCycGM1kNGWlSB5Lv9s0N4ttjZjkT4wouMulnsPmZ/NPPy2ZDq1h JoUA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :arc-authentication-results; bh=sJY8nCscIm1AZUKxTm1CYrB4HsDaGw7LB2mwiE2xdDI=; b=WB2Sf+zqnJ7Mt7BLQbiaBXSV8h1tz7VSkixwTuBFEH4IFErQRRHNd1RCY60VhOPcz9 q5CqciMp/CV7rOJy70gDuS3x3E/8Z5mVPIXurtJ5LpTuxGkQNaG+CN/9wFtWJTDR7Bm2 D5C14i2K3ZmENpOcy6bsaZNn+jWcLQaSJRHwjSd8n+qhbSL5Ajq/NJEsDkhiK03HIiko 8C5RcqGv/TGssygn+n8j3vR3zUyEOllnpjrzn+6cSSbboC4qwZZGfaPopeUPmyXDrhWq v+zisZzSsl0iXuvZPjbrE3ga4Fze49J9UytOvRXwaWaT5ZhcBwnIoVKaQXc0iuNyTpsM jtOw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 189-v6si8764417pfg.163.2018.06.04.05.43.40; Mon, 04 Jun 2018 05:43:54 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752675AbeFDMnO (ORCPT + 99 others); Mon, 4 Jun 2018 08:43:14 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:43164 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752143AbeFDMnN (ORCPT ); Mon, 4 Jun 2018 08:43:13 -0400 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 mx1.redhat.com (Postfix) with ESMTPS id A86A38424B; Mon, 4 Jun 2018 12:43:12 +0000 (UTC) Received: from redhat.com (ovpn-120-211.rdu2.redhat.com [10.10.120.211]) by smtp.corp.redhat.com (Postfix) with SMTP id 2801263F38; Mon, 4 Jun 2018 12:43:10 +0000 (UTC) Date: Mon, 4 Jun 2018 15:43:09 +0300 From: "Michael S. Tsirkin" To: Benjamin Herrenschmidt Cc: Anshuman Khandual , virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, aik@ozlabs.ru, robh@kernel.org, joe@perches.com, elfring@users.sourceforge.net, david@gibson.dropbear.id.au, jasowang@redhat.com, mpe@ellerman.id.au, hch@infradead.org Subject: Re: [RFC V2] virtio: Add platform specific DMA API translation for virito devices Message-ID: <20180604153558-mutt-send-email-mst@kernel.org> References: <20180522063317.20956-1-khandual@linux.vnet.ibm.com> <20180523213703-mutt-send-email-mst@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Mon, 04 Jun 2018 12:43:12 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Mon, 04 Jun 2018 12:43:12 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'mst@redhat.com' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, May 24, 2018 at 08:27:04AM +1000, Benjamin Herrenschmidt wrote: > On Wed, 2018-05-23 at 21:50 +0300, Michael S. Tsirkin wrote: > > > I re-read that discussion and I'm still unclear on the > > original question, since I got several apparently > > conflicting answers. > > > > I asked: > > > > Why isn't setting VIRTIO_F_IOMMU_PLATFORM on the > > hypervisor side sufficient? > > I thought I had replied to this... > > There are a couple of reasons: > > - First qemu doesn't know that the guest will switch to "secure mode" > in advance. There is no difference between a normal and a secure > partition until the partition does the magic UV call to "enter secure > mode" and qemu doesn't see any of it. So who can set the flag here ? The user should set it. You just tell user "to be able to use with feature X, enable IOMMU". > - Second, when using VIRTIO_F_IOMMU_PLATFORM, we also make qemu (or > vhost) go through the emulated MMIO for every access to the guest, > which adds additional overhead. > > Cheers, > Ben. There are several answers to this. One is that we are working hard to make overhead small when the mappings are static (which they would be if there's no actual IOMMU). So maybe especially given you are using a bounce buffer on top it's not so bad - did you try to benchmark? Another is that given the basic functionality is in there, optimizations can possibly wait until per-device quirks in DMA API are supported. > > > > > > > arch/powerpc/include/asm/dma-mapping.h | 6 ++++++ > > > arch/powerpc/platforms/pseries/iommu.c | 11 +++++++++++ > > > drivers/virtio/virtio_ring.c | 10 ++++++++++ > > > 3 files changed, 27 insertions(+) > > > > > > diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h > > > index 8fa3945..056e578 100644 > > > --- a/arch/powerpc/include/asm/dma-mapping.h > > > +++ b/arch/powerpc/include/asm/dma-mapping.h > > > @@ -115,4 +115,10 @@ extern u64 __dma_get_required_mask(struct device *dev); > > > #define ARCH_HAS_DMA_MMAP_COHERENT > > > > > > #endif /* __KERNEL__ */ > > > + > > > +#define platform_forces_virtio_dma platform_forces_virtio_dma > > > + > > > +struct virtio_device; > > > + > > > +extern bool platform_forces_virtio_dma(struct virtio_device *vdev); > > > #endif /* _ASM_DMA_MAPPING_H */ > > > diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c > > > index 06f0296..a2ec15a 100644 > > > --- a/arch/powerpc/platforms/pseries/iommu.c > > > +++ b/arch/powerpc/platforms/pseries/iommu.c > > > @@ -38,6 +38,7 @@ > > > #include > > > #include > > > #include > > > +#include > > > #include > > > #include > > > #include > > > @@ -1396,3 +1397,13 @@ static int __init disable_multitce(char *str) > > > __setup("multitce=", disable_multitce); > > > > > > machine_subsys_initcall_sync(pseries, tce_iommu_bus_notifier_init); > > > + > > > +bool platform_forces_virtio_dma(struct virtio_device *vdev) > > > +{ > > > + /* > > > + * On protected guest platforms, force virtio core to use DMA > > > + * MAP API for all virtio devices. But there can also be some > > > + * exceptions for individual devices like virtio balloon. > > > + */ > > > + return (of_find_compatible_node(NULL, NULL, "ibm,ultravisor") != NULL); > > > +} > > > > Isn't this kind of slow? vring_use_dma_api is on > > data path and supposed to be very fast. > > > > > diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c > > > index 21d464a..47ea6c3 100644 > > > --- a/drivers/virtio/virtio_ring.c > > > +++ b/drivers/virtio/virtio_ring.c > > > @@ -141,8 +141,18 @@ struct vring_virtqueue { > > > * unconditionally on data path. > > > */ > > > > > > +#ifndef platform_forces_virtio_dma > > > +static inline bool platform_forces_virtio_dma(struct virtio_device *vdev) > > > +{ > > > + return false; > > > +} > > > +#endif > > > + > > > static bool vring_use_dma_api(struct virtio_device *vdev) > > > { > > > + if (platform_forces_virtio_dma(vdev)) > > > + return true; > > > + > > > if (!virtio_has_iommu_quirk(vdev)) > > > return true; > > > > > > -- > > > 2.9.3