Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp109461img; Thu, 21 Mar 2019 15:20:54 -0700 (PDT) X-Google-Smtp-Source: APXvYqzxNPIrhECJXZ9P7960M8JWMCM9AwUzSlXH3kIIohKeBd4BN5gOrOBdAwM6W+gFkM3PRYbF X-Received: by 2002:aa7:91d7:: with SMTP id z23mr5823436pfa.137.1553206854377; Thu, 21 Mar 2019 15:20:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553206854; cv=none; d=google.com; s=arc-20160816; b=FDXUdveejXtOF1wY+oNKMcVeVuPLtinMWx7wNbKQ79VJHNDzbpdyMtK1NsKqsiFWmT UvZdJwqZqnygQTIyP78cLE8rrFasquiKMdVpYhbUxHZ+zhTFBoKIlfd9MAEAx6RvRzm2 H9hkxMtauYVyZhe4Aq2kJuHs3eutt2ha71shaEeqaF2VjU3rdqIvwHXhAgMTeVgJf+xH Ecs2+eK54+qv5m48wxTmJhmI9K+Mpn4OTkVVxiVRP0EQ9RVHW/vsZ6Wj4If1GbTJ9IWq h1Mdk91lOvelhUzQpOn7WQaM0gR3rGuAreJd/QFia/s8jmAWyzQfbOVrUxVW7qRZuavr botw== 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 :organization:references:in-reply-to:message-id:subject:cc:to:from :date; bh=FT3lN+H8IcHYappBOTA2f0pj/3ANxK8an/KpcxiHyR8=; b=FJ1RNH6HysIfRSfRFDKMsjVaMr3NWjBXrVAfZM8Ni5/6wX520DJhnTg5yk5k11+2yh yIMT4lAqlzqIpbEx0Gzbi9w0e27elh6E/jXFh5vWm/tO88Fz/5YJwiUxwblRzMlXn95R t4oUmntrldaMo116T9YcKIB57he2PwEWXgCRbjXLXS9HkxLkUBnEUgYLfJLw/TRgUXW2 MNEO6m66XuUIv7ShQoGtRXtr5hlLnxdTB8AcYfgZE7gLN1LawUgrR8MCeUF6lY2mngus RSiM6oj1ykoT9QsaFRo/rAX+hKns/SbRtkrjdGcSOrNxr369DacKsh6Ragb1dvk25pIJ 5vdw== 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 o8si5363838pfh.136.2019.03.21.15.20.36; Thu, 21 Mar 2019 15:20: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 S1727248AbfCUWTm (ORCPT + 99 others); Thu, 21 Mar 2019 18:19:42 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33018 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725999AbfCUWTm (ORCPT ); Thu, 21 Mar 2019 18:19:42 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B2DF259473; Thu, 21 Mar 2019 22:19:41 +0000 (UTC) Received: from x1.home (ovpn-116-218.phx2.redhat.com [10.3.116.218]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5AC575D9C5; Thu, 21 Mar 2019 22:19:38 +0000 (UTC) Date: Thu, 21 Mar 2019 16:19:38 -0600 From: Alex Williamson To: Eric Auger Cc: eric.auger.pro@gmail.com, iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu, joro@8bytes.org, jacob.jun.pan@linux.intel.com, yi.l.liu@linux.intel.com, jean-philippe.brucker@arm.com, will.deacon@arm.com, robin.murphy@arm.com, kevin.tian@intel.com, ashok.raj@intel.com, marc.zyngier@arm.com, christoffer.dall@arm.com, peter.maydell@linaro.org, vincent.stehle@arm.com Subject: Re: [PATCH v6 07/22] vfio: VFIO_IOMMU_ATTACH/DETACH_PASID_TABLE Message-ID: <20190321161938.4358b436@x1.home> In-Reply-To: <20190317172232.1068-8-eric.auger@redhat.com> References: <20190317172232.1068-1-eric.auger@redhat.com> <20190317172232.1068-8-eric.auger@redhat.com> Organization: Red Hat MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 21 Mar 2019 22:19:42 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, 17 Mar 2019 18:22:17 +0100 Eric Auger wrote: > From: "Liu, Yi L" > > This patch adds VFIO_IOMMU_ATTACH/DETACH_PASID_TABLE ioctl > which aims to pass/withdraw the virtual iommu guest configuration > to/from the VFIO driver downto to the iommu subsystem. > > Signed-off-by: Jacob Pan > Signed-off-by: Liu, Yi L > Signed-off-by: Eric Auger > > --- > v3 -> v4: > - restore ATTACH/DETACH > - add unwind on failure > > v2 -> v3: > - s/BIND_PASID_TABLE/SET_PASID_TABLE > > v1 -> v2: > - s/BIND_GUEST_STAGE/BIND_PASID_TABLE > - remove the struct device arg > --- > drivers/vfio/vfio_iommu_type1.c | 53 +++++++++++++++++++++++++++++++++ > include/uapi/linux/vfio.h | 17 +++++++++++ > 2 files changed, 70 insertions(+) > > diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c > index 73652e21efec..222e9199edbf 100644 > --- a/drivers/vfio/vfio_iommu_type1.c > +++ b/drivers/vfio/vfio_iommu_type1.c > @@ -1644,6 +1644,43 @@ static int vfio_domains_have_iommu_cache(struct vfio_iommu *iommu) > return ret; > } > > +static void > +vfio_detach_pasid_table(struct vfio_iommu *iommu) > +{ > + struct vfio_domain *d; > + > + mutex_lock(&iommu->lock); > + > + list_for_each_entry(d, &iommu->domain_list, next) { > + iommu_detach_pasid_table(d->domain); > + } > + mutex_unlock(&iommu->lock); > +} > + > +static int > +vfio_attach_pasid_table(struct vfio_iommu *iommu, > + struct vfio_iommu_type1_attach_pasid_table *ustruct) > +{ > + struct vfio_domain *d; > + int ret = 0; > + > + mutex_lock(&iommu->lock); > + > + list_for_each_entry(d, &iommu->domain_list, next) { > + ret = iommu_attach_pasid_table(d->domain, &ustruct->config); > + if (ret) > + goto unwind; > + } > + goto unlock; > +unwind: > + list_for_each_entry_continue_reverse(d, &iommu->domain_list, next) { > + iommu_detach_pasid_table(d->domain); > + } > +unlock: > + mutex_unlock(&iommu->lock); > + return ret; > +} > + > static long vfio_iommu_type1_ioctl(void *iommu_data, > unsigned int cmd, unsigned long arg) > { > @@ -1714,6 +1751,22 @@ static long vfio_iommu_type1_ioctl(void *iommu_data, > > return copy_to_user((void __user *)arg, &unmap, minsz) ? > -EFAULT : 0; > + } else if (cmd == VFIO_IOMMU_ATTACH_PASID_TABLE) { > + struct vfio_iommu_type1_attach_pasid_table ustruct; > + > + minsz = offsetofend(struct vfio_iommu_type1_attach_pasid_table, > + config); > + > + if (copy_from_user(&ustruct, (void __user *)arg, minsz)) > + return -EFAULT; > + > + if (ustruct.argsz < minsz || ustruct.flags) > + return -EINVAL; Who is responsible for validating the ustruct.config? arm_smmu_attach_pasid_table() only looks at the format, ignoring the version field :-\ In fact, where is struct iommu_pasid_smmuv3 ever used from the config? Should the padding fields be forced to zero? We don't have flags to incorporate use of them with future extensions, so maybe we don't care? > + > + return vfio_attach_pasid_table(iommu, &ustruct); > + } else if (cmd == VFIO_IOMMU_DETACH_PASID_TABLE) { > + vfio_detach_pasid_table(iommu); > + return 0; > } > > return -ENOTTY; > diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h > index 02bb7ad6e986..329d378565d9 100644 > --- a/include/uapi/linux/vfio.h > +++ b/include/uapi/linux/vfio.h > @@ -14,6 +14,7 @@ > > #include > #include > +#include > > #define VFIO_API_VERSION 0 > > @@ -759,6 +760,22 @@ struct vfio_iommu_type1_dma_unmap { > #define VFIO_IOMMU_ENABLE _IO(VFIO_TYPE, VFIO_BASE + 15) > #define VFIO_IOMMU_DISABLE _IO(VFIO_TYPE, VFIO_BASE + 16) > > +/** > + * VFIO_IOMMU_ATTACH_PASID_TABLE - _IOWR(VFIO_TYPE, VFIO_BASE + 22, > + * struct vfio_iommu_type1_attach_pasid_table) > + * > + * Passes the PASID table to the host. Calling ATTACH_PASID_TABLE > + * while a table is already installed is allowed: it replaces the old > + * table. DETACH does a comprehensive tear down of the nested mode. > + */ > +struct vfio_iommu_type1_attach_pasid_table { > + __u32 argsz; > + __u32 flags; > + struct iommu_pasid_table_config config; > +}; > +#define VFIO_IOMMU_ATTACH_PASID_TABLE _IO(VFIO_TYPE, VFIO_BASE + 22) > +#define VFIO_IOMMU_DETACH_PASID_TABLE _IO(VFIO_TYPE, VFIO_BASE + 23) > + DETACH should also be documented, it's not clear from the uapi that it requires no parameters. Thanks, Alex