Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp3590568imm; Mon, 4 Jun 2018 06:15:56 -0700 (PDT) X-Google-Smtp-Source: ADUXVKJ05hzBcdYSMbKwMVS24MIDj1+Mei7IhMAEtJg+/23T1n6EmNqqK+KxBMj6KqwARy4n4pPW X-Received: by 2002:a65:6008:: with SMTP id m8-v6mr934389pgu.134.1528118156696; Mon, 04 Jun 2018 06:15:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528118156; cv=none; d=google.com; s=arc-20160816; b=yhYtJD84seHKplVKs6fHNag5irn9T73LfYrv+12wsF+L2xfF3zwqViGQgL0IzKjpGr DXNmoi8oVl1fe2STgMlnwWSa8N6tnUp4ENzSMtw5ao12hlnBOp/GmYyUVeS8m1/Uzd1i aApxJkLH6JnX1JFXcVhcOuAgvjbD1uaTg2bUTXb3dmDrurC5ls+o0MV2taHIBagagnRm T0/xiljPqKXfRxkdTEwjULHBP5Kyxp1eeXs8jstd1xLFttHoOX0N2jcBR1jpc8tScuVO WZCcFkmmgQUOXLxTsV6H2pfcH93UX88XzGb++m8PphgLY0WSe3h6W1Qu8pILk02knQEE i1qw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:date:cc:to:from:subject:message-id :arc-authentication-results; bh=UmC5VthVpRRc12hE/dMbggBfJ5OrYuVTB+yapJ0WbDk=; b=bUkZZaAHqWqPBQDw+ToG86H2VzLbkMJ4tDWxp8gF4IPak7LKB4cE5MQ+UCD6uk/Flp ULn4kmIxzz+5tV6N7Cpq4htWXE6VnfiJ/YCSUFKC4SIOriCrKc8yKpwtHaH4e9+1ucil dAsKlz1wTXq9LuPY4v51GrpJmzJaZK56xUwJZLUoJB7nlACwBep5HRVZ+bFl/QAcPS2d Pa57/ixav2BsBzTGEEVQ1QEQIpOeV/73KLJq3uocsd5/kImY+AfYHwPlWegOw43Ync0P cRfBeEJ/ABW1iPmb05GfoFicNnZcWZmsSQBi+/3Jza2WmRMOeLXyupPEKxbPOfpiJoqY 3RcA== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a66-v6si10778018pfe.364.2018.06.04.06.15.41; Mon, 04 Jun 2018 06:15:56 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753014AbeFDNOG (ORCPT + 99 others); Mon, 4 Jun 2018 09:14:06 -0400 Received: from gate.crashing.org ([63.228.1.57]:35375 "EHLO gate.crashing.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752429AbeFDNOF (ORCPT ); Mon, 4 Jun 2018 09:14:05 -0400 Received: from localhost (localhost.localdomain [127.0.0.1]) by gate.crashing.org (8.14.1/8.14.1) with ESMTP id w54DBqXW029600; Mon, 4 Jun 2018 08:11:53 -0500 Message-ID: Subject: Re: [RFC V2] virtio: Add platform specific DMA API translation for virito devices From: Benjamin Herrenschmidt To: "Michael S. Tsirkin" 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 Date: Mon, 04 Jun 2018 23:11:52 +1000 In-Reply-To: <20180604153558-mutt-send-email-mst@kernel.org> References: <20180522063317.20956-1-khandual@linux.vnet.ibm.com> <20180523213703-mutt-send-email-mst@kernel.org> <20180604153558-mutt-send-email-mst@kernel.org> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.28.1 (3.28.1-2.fc28) Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 2018-06-04 at 15:43 +0300, Michael S. Tsirkin wrote: > 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". That's completely backwards. The user has no idea what that stuff is. And it would have to percolate all the way up the management stack, libvirt, kimchi, whatever else ... that's just nonsense. Especially since, as I explained in my other email, this is *not* a qemu problem and thus the solution shouldn't be messing around with qemu. > > > - 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. The point is that requiring specific qemu command line arguments isn't going to fly. We have additional problems due to the fact that our firmware (SLOF) inside qemu doesn't currently deal with iommu's etc... though those can be fixed. Overall, however, this seems to be the most convoluted way of achieving things, require user interventions where none should be needed etc... Again, what's wrong with a 2 lines hook instead that solves it all and completely avoids involving qemu ? Ben. > > > > > > > > > > > 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