From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Williamson Subject: Re: VFIO no-iommu Date: Tue, 22 Dec 2015 13:20:09 -0700 Message-ID: <1450815609.2950.8.camel@redhat.com> References: <1450198398.6042.32.camel@redhat.com> <20151216040408.GA18363@sivlogin002.ir.intel.com> <1450240711.2674.11.camel@redhat.com> <1450285912.2674.22.camel@redhat.com> <1450370639.2674.93.camel@redhat.com> <20151218104310.GA11371@sivlogin002.ir.intel.com> <1450449520.2674.162.camel@redhat.com> <1450475417.2674.167.camel@redhat.com> <20151221114643.GA30129@sivlogin002.ir.intel.com> <1450725743.3781.56.camel@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Cc: "dev@dpdk.org" To: "Yigit, Ferruh" Return-path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 89E7D2A5F for ; Tue, 22 Dec 2015 21:20:10 +0100 (CET) In-Reply-To: <1450725743.3781.56.camel@redhat.com> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On Mon, 2015-12-21 at 12:22 -0700, Alex Williamson wrote: > On Mon, 2015-12-21 at 11:46 +0000, Yigit, Ferruh wrote: > > On Fri, Dec 18, 2015 at 02:50:17PM -0700, Alex Williamson wrote: > > > On Fri, 2015-12-18 at 07:38 -0700, Alex Williamson wrote: > > > > On Fri, 2015-12-18 at 10:43 +0000, Yigit, Ferruh wrote: > > > > > On Thu, Dec 17, 2015 at 09:43:59AM -0700, Alex Williamson > > > > > wrote: > > > > > <...> > > > > > > > > > > >=20 > > > > > > > > > > > Also I need to disable VFIO_CHECK_EXTENSION > > > > > > > > > > > ioctl, > > > > > > > > > > > because in > > > > > > > > > > > vfio > > > > > > > > > > > module, > > > > > > > > > > > container->noiommu is not set before doing a > > > > > > > > > > > vfio_group_set_container() > > > > > > > > > > > and vfio_for_each_iommu_driver selects wrong > > > > > > > > > > > driver. > > > > > > > > > >=20 > > > > > > > > > > Running CHECK_EXTENSION on a container without the > > > > > > > > > > group > > > > > > > > > > attached is > > > > > > > > > > only going to tell you what extensions vfio is > > > > > > > > > > capable > > > > > > > > > > of, > > > > > > > > > > not > > > > > > > > > > necessarily what extensions are available to you > > > > > > > > > > with > > > > > > > > > > that > > > > > > > > > > group. > > > > > > > > > > Is this just a general dpdk- vfio ordering bug? > > > > > > > > >=20 > > > > > > > > > Yes, that is how VFIO was implemented in DPDK. I was > > > > > > > > > under > > > > > > > > > the > > > > > > > > > impression that checking extension before assigning > > > > > > > > > devices > > > > > > > > > was > > > > > > > > > the > > > > > > > > > correct way to do things, so as to not to try > > > > > > > > > anything > > > > > > > > > we > > > > > > > > > know > > > > > > > > > would > > > > > > > > > fail anyway. Does this imply that CHECK_EXTENSION > > > > > > > > > needs > > > > > > > > > to > > > > > > > > > be > > > > > > > > > called > > > > > > > > > on both container and groups (or just on groups)? > > > > > > > >=20 > > > > > > > > Hmm, in Documentation/vfio.txt we do give the following > > > > > > > > algorithm: > > > > > > > >=20 > > > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (ioctl= (container, VFIO_GET_API_VERSION) !=3D > > > > > > > > VFIO_API_VERSION) > > > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Unknown API version */ > > > > > > > >=20 > > > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (!ioct= l(container, VFIO_CHECK_EXTENSION, > > > > > > > > VFIO_TYPE1_IOMMU)) > > > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Doesn't support the IOMMU drive= r we > > > > > > > > want. > > > > > > > > */ > > > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0... > > > > > > > >=20 > > > > > > > > That's just going to query each iommu driver and we > > > > > > > > can't > > > > > > > > yet > > > > > > > > say > > > > > > > > whether > > > > > > > > the group the user attaches to the container later will > > > > > > > > actually > > > > > > > > support that > > > > > > > > extension until we try to do it, that would come at > > > > > > > > VFIO_SET_IOMMU. > > > > > > > > =C2=A0So is > > > > > > > > it perhaps a vfio bug that we're not advertising no- > > > > > > > > iommu > > > > > > > > until > > > > > > > > the > > > > > > > > group is > > > > > > > > attached? =C2=A0After all, we are capable of it with just= an > > > > > > > > empty > > > > > > > > container, just > > > > > > > > like we are with type1, but we're going to fail > > > > > > > > SET_IOMMU > > > > > > > > for > > > > > > > > the > > > > > > > > wrong > > > > > > > > combination. > > > > > > > > =C2=A0This is exactly the sort of thing that makes me gla= d > > > > > > > > we > > > > > > > > reverted > > > > > > > > it without > > > > > > > > feedback from a working user driver. =C2=A0Thanks, > > > > > > >=20 > > > > > > > Whether it should be considered a "bug" in VFIO or "by > > > > > > > design" > > > > > > > is > > > > > > > up > > > > > > > to you, of course, but at least according to the VFIO > > > > > > > documentation, > > > > > > > we are meant to check for type 1 extension and then > > > > > > > attach > > > > > > > devices, > > > > > > > so it would be expected to get VFIO_NOIOMMU_IOMMU marked > > > > > > > as > > > > > > > supported > > > > > > > even without any devices attached to the container (just > > > > > > > like > > > > > > > we > > > > > > > get > > > > > > > type 1 as supported without any devices attached). Having > > > > > > > said > > > > > > > that, > > > > > > > if it was meant to attach devices first and then check > > > > > > > the > > > > > > > extensions, then perhaps the documentation should also > > > > > > > point > > > > > > > out > > > > > > > that > > > > > > > fact (or perhaps I missed that detail in my readings of > > > > > > > the > > > > > > > docs, > > > > > > > in > > > > > > > which case my apologies). > > > > > >=20 > > > > > > Hi Anatoly, > > > > > >=20 > > > > > > Does the below patch make it behave more like you'd expect. > > > > > > =C2=A0This > > > > > > applies to v4.4-rc4, I'd fold this into the base patch if > > > > > > we > > > > > > reincorporate it to a future kernel. =C2=A0Thanks, > > > > > >=20 > > > > > > Alex > > > > > >=20 > > > > > > commit 88d4dcb6b77624965f0b45b5cd305a2b4a105c94 > > > > > > Author: Alex Williamson > > > > > > Date:=C2=A0=C2=A0=C2=A0Wed Dec 16 19:02:01 2015 -0700 > > > > > >=20 > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0vfio: Fix no-iommu CHECK_EXTENSION > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0 > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0Previously the no-iommu iommu driver = was only visible > > > > > > when > > > > > > the > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0container had an attached no-iommu gr= oup.=C2=A0=C2=A0This means > > > > > > that > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0CHECK_EXTENSION on and empty containe= r couldn't report > > > > > > the > > > > > > possibility > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0of using VFIO_NOIOMMU_IOMMU.=C2=A0=C2= =A0We report TYPE1 whether > > > > > > or > > > > > > not > > > > > > the user > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0can make use of it with the group, so= this is > > > > > > inconsistent.=C2=A0=C2=A0Add the > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0no-iommu iommu to the list of iommu d= rivers when > > > > > > enabled > > > > > > via > > > > > > module > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0option, but skip all the others if th= e container is > > > > > > attached > > > > > > to > > > > > > a > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0no-iommu groups.=C2=A0=C2=A0Note that= tainting is now done with > > > > > > the > > > > > > "unsafe" > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0module callback rather than explictly= within vfio. > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0 > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0Also fixes module option and module d= escription name > > > > > > inconsistency. > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0 > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0Also make vfio_noiommu_ops const. > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0 > > > > > > =C2=A0=C2=A0=C2=A0=C2=A0Signed-off-by: Alex Williamson > > > > > co > > > > > > m> > > > > >=20 > > > > > Hi Alex, > > > > >=20 > > > > > I got following crash with this update: > > >=20 > > > Let's try this one: > > >=20 > > > commit 8ff839c6ffe9f3b50b50f1cc87e7afbf23171f05 > > > Author: Alex Williamson > > > Date:=C2=A0=C2=A0=C2=A0Fri Dec 18 14:45:55 2015 -0700 > > >=20 > > > =C2=A0=C2=A0=C2=A0=C2=A0v2 vfio fix no-iommu CHECK_EXTENSION > > > =C2=A0=C2=A0=C2=A0=C2=A0 > > > =C2=A0=C2=A0=C2=A0=C2=A0Register and unregister the no-iommu iommu = backend at module > > > =C2=A0=C2=A0=C2=A0=C2=A0initialization and exit, but disable it unl= ess enabled via > > > module > > > =C2=A0=C2=A0=C2=A0=C2=A0option.=C2=A0=C2=A0Rather than modify the i= ommu driver walk, > > > selectively > > > skip > > > =C2=A0=C2=A0=C2=A0=C2=A0combinations that aren't supported.=C2=A0=C2= =A0CHECK_EXTENSION on a > > > container > > > =C2=A0=C2=A0=C2=A0=C2=A0without any groups attached exposes all pos= sible > > > extensions.=C2=A0=C2=A0Once a > > > =C2=A0=C2=A0=C2=A0=C2=A0group is attached, the no-iommu backend is = skipped for > > > regular > > > groups > > > =C2=A0=C2=A0=C2=A0=C2=A0and regular iommu backends are skipped for = no-iommu groups. > > > =C2=A0=C2=A0=C2=A0=C2=A0 > > > =C2=A0=C2=A0=C2=A0=C2=A0This would be folded into a single patch to= re-propose vfio > > > no- > > > iommu > > > =C2=A0=C2=A0=C2=A0=C2=A0mode upstream. > > > =C2=A0=C2=A0=C2=A0=C2=A0 > > > =C2=A0=C2=A0=C2=A0=C2=A0Signed-off-by: Alex Williamson > > >=20 > > Hi Alex, > >=20 > > Thank you for the update. I have tested this on both no-iommu and > > iommu environment > > and worked successfully. I believe this approach is better because > > it > > is simpler. > >=20 > > From DPDK point of view, only update to support vfio no-iommu is: > > to > > use new group names > > and disable DMA mapping. > >=20 > > If VFIO module compiled with "CONFIG_VFIO_NOIOMMU=3Dy" by default, > > that > > makes things easier > > for DPDK, in no-iommu environment inserting vfio module with proper > > parameter makes it > > available for DPDK. >=20 > Thanks for the update Ferruh. =C2=A0Also note that the module option is > dynamically settable so that it can support running with statically > compiled modules where you may not know whether or not to enable no- > iommu until after boot, or where unloading and re-loading a module > might not be an option. =C2=A0It will be up to each distro to decide > whether > to enable the config option, but I think we at least highlight the > existing support issue for non-iommu protected userspace drivers, > which > is something that was not at all clear with the uio driver approach. Hi, I've re-posted the unified patch upstream and it should start showing up in the next linux-next build. =C2=A0I expect the dpdk code won't be merged until after this gets back into a proper kernel, but could we get the dpdk modifications posted as rfc for others looking to try it? =C2=A0Thanks, Alex