From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 0DE7E8D9E for ; Thu, 1 Oct 2015 20:25:46 +0200 (CEST) Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 28457C0B1B49; Thu, 1 Oct 2015 18:25:45 +0000 (UTC) Received: from redhat.com (ovpn-116-83.ams2.redhat.com [10.36.116.83]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id t91IPfIR019257; Thu, 1 Oct 2015 14:25:42 -0400 Date: Thu, 1 Oct 2015 21:25:40 +0300 From: "Michael S. Tsirkin" To: Stephen Hemminger Message-ID: <20151001210358-mutt-send-email-mst@redhat.com> References: <1443652138-31782-1-git-send-email-stephen@networkplumber.org> <1443652138-31782-3-git-send-email-stephen@networkplumber.org> <20151001104505-mutt-send-email-mst@redhat.com> <20151001192911-mutt-send-email-mst@redhat.com> <20151001102619.1944fffa@urahara> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20151001102619.1944fffa@urahara> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 Cc: dev@dpdk.org, hjk@hansjkoch.de, gregkh@linux-foundation.org, linux-kernel@vger.kernel.org Subject: Re: [dpdk-dev] [PATCH 2/2] uio: new driver to support PCI MSI-X X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 01 Oct 2015 18:25:46 -0000 On Thu, Oct 01, 2015 at 10:26:19AM -0700, Stephen Hemminger wrote: > On Thu, 1 Oct 2015 19:31:08 +0300 > "Michael S. Tsirkin" wrote: > > > On Thu, Oct 01, 2015 at 11:33:06AM +0300, Michael S. Tsirkin wrote: > > > On Wed, Sep 30, 2015 at 03:28:58PM -0700, Stephen Hemminger wrote: > > > > This driver allows using PCI device with Message Signalled Interrupt > > > > from userspace. The API is similar to the igb_uio driver used by the DPDK. > > > > Via ioctl it provides a mechanism to map MSI-X interrupts into event > > > > file descriptors similar to VFIO. > > > > > > > > VFIO is a better choice if IOMMU is available, but often userspace drivers > > > > have to work in environments where IOMMU support (real or emulated) is > > > > not available. All UIO drivers that support DMA are not secure against > > > > rogue userspace applications programming DMA hardware to access > > > > private memory; this driver is no less secure than existing code. > > > > > > > > Signed-off-by: Stephen Hemminger > > > > > > I don't think copying the igb_uio interface is a good idea. > > > What DPDK is doing with igb_uio (and indeed uio_pci_generic) > > > is abusing the sysfs BAR access to provide unlimited > > > access to hardware. > > > > > > MSI messages are memory writes so any generic device capable > > > of MSI is capable of corrupting kernel memory. > > > This means that a bug in userspace will lead to kernel memory corruption > > > and crashes. This is something distributions can't support. > > > > > > uio_pci_generic is already abused like that, mostly > > > because when I wrote it, I didn't add enough protections > > > against using it with DMA capable devices, > > > and we can't go back and break working userspace. > > > But at least it does not bind to VFs which all of > > > them are capable of DMA. > > > > > > The result of merging this driver will be userspace abusing the > > > sysfs BAR access with VFs as well, and we do not want that. > > > > > > > > > Just forwarding events is not enough to make a valid driver. > > > What is missing is a way to access the device in a safe way. > > > > > > On a more positive note: > > > > > > What would be a reasonable interface? One that does the following > > > in kernel: > > > > > > 1. initializes device rings (can be in pinned userspace memory, > > > but can not be writeable by userspace), brings up interface link > > > 2. pins userspace memory (unless using e.g. hugetlbfs) > > > 3. gets request, make sure it's valid and belongs to > > > the correct task, put it in the ring > > > 4. in the reverse direction, notify userspace when buffers > > > are available in the ring > > > 5. notify userspace about MSI (what this driver does) > > > > > > What userspace can be allowed to do: > > > > > > format requests (e.g. transmit, receive) in userspace > > > read ring contents > > > > > > What userspace can't be allowed to do: > > > > > > access BAR > > > write rings > > > > > > > > > This means that the driver can not be a generic one, > > > and there will be a system call overhead when you > > > write the ring, but that's the price you have to > > > pay for ability to run on systems without an IOMMU. > > > > > > > > > The device specific parts can be taken from John Fastabend's patches > > BTW: > > > > https://patchwork.ozlabs.org/patch/396713/ > > > > IIUC what was missing there was exactly the memory protection > > we are looking for here. > > The bifuricated drivers are interesting from an architecture > point of view, but do nothing to solve the immediate use case. > The problem is not on bare metal environment, most of those already have IOMMU. > The issues are on environments like VMWare with SRIOV or vmxnet3, > neither of those are really helped by bifirucated driver or VFIO. Two points I tried to make (and apparently failed, so I'm trying again, more verbosely): - bifurcated drivers do DMA into both kernel and userspace memory from same pci address (bus/dev/fn). As IOMMU uses this source address to validated accesses, there is no way to have IOMMU prevent userspace from accessing kernel memory. If you are prepared to use dynamic mappings for kernel memory, it might be possible to limit the harm that userspace can do, but this will slow down kernel networking (changing IOMMU mappings is expensive) and userspace will likely be able to at least disrupt kernel networking. So what I am discussing might still have value there. - bifurcated drivers have code to bring up link and map rings into userspace (they also map other rings into kernel, and tweak rx filter in hardware, that might not be necessary for this usecase). What I proposed above can use that code, with the twist that the RX ring is made RO for userspace, and a system call to safely copy from userspace ring there is supported. In other words, here's the device specific part in kernel that you wanted to use, which will only need some tweaks. -- MST