Re: [PATCH v3 2/2] iommu/sva: Remove mm parameter from SVA bind API
Hi Jacob, I love your patch! Yet something to improve: [auto build test ERROR on e49d033bddf5b565044e2abe4241353959bc9120] url: https://github.com/0day-ci/linux/commits/Jacob-Pan/Simplify-and-restrict-IOMMU-SVA-APIs/20210417-052451 base: e49d033bddf5b565044e2abe4241353959bc9120 config: arm64-randconfig-r034-20210416 (attached as .config) compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project f549176ad976caa3e19edd036df9a7e12770af7c) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install arm64 cross compiling tool for clang build # apt-get install binutils-aarch64-linux-gnu # https://github.com/0day-ci/linux/commit/6d85fee95bdcd7e53f10442ddc71d0c310d43367 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Jacob-Pan/Simplify-and-restrict-IOMMU-SVA-APIs/20210417-052451 git checkout 6d85fee95bdcd7e53f10442ddc71d0c310d43367 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 ARCH=arm64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All errors (new ones prefixed by >>): >> drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c:2631:15: error: incompatible >> function pointer types initializing 'struct iommu_sva *(*)(struct device *, >> unsigned int)' with an expression of type 'struct iommu_sva *(struct device >> *, struct mm_struct *, unsigned int)' >> [-Werror,-Wincompatible-function-pointer-types] .sva_bind = arm_smmu_sva_bind, ^ 1 error generated. vim +2631 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c f534d98b9d2705 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c Jean-Philippe Brucker 2020-09-18 2608 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2609 static struct iommu_ops arm_smmu_ops = { 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2610 .capable= arm_smmu_capable, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2611 .domain_alloc = arm_smmu_domain_alloc, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2612 .domain_free= arm_smmu_domain_free, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2613 .attach_dev = arm_smmu_attach_dev, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2614 .map= arm_smmu_map, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2615 .unmap = arm_smmu_unmap, 07fdef34d2be68 drivers/iommu/arm-smmu-v3.c Zhen Lei 2018-09-20 2616 .flush_iotlb_all= arm_smmu_flush_iotlb_all, 32b124492bdf97 drivers/iommu/arm-smmu-v3.c Robin Murphy 2017-09-28 2617 .iotlb_sync = arm_smmu_iotlb_sync, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2618 .iova_to_phys = arm_smmu_iova_to_phys, cefa0d55da3753 drivers/iommu/arm-smmu-v3.c Joerg Roedel 2020-04-29 2619 .probe_device = arm_smmu_probe_device, cefa0d55da3753 drivers/iommu/arm-smmu-v3.c Joerg Roedel 2020-04-29 2620 .release_device = arm_smmu_release_device, 08d4ca2a672bab drivers/iommu/arm-smmu-v3.c Robin Murphy 2016-09-12 2621 .device_group = arm_smmu_device_group, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2622 .domain_get_attr= arm_smmu_domain_get_attr, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2623 .domain_set_attr= arm_smmu_domain_set_attr, 8f78515425daea drivers/iommu/arm-smmu-v3.c Robin Murphy 2016-09-12 2624 .of_xlate = arm_smmu_of_xlate, 50019f09a4baa0 drivers/iommu/arm-smmu-v3.c Eric Auger 2017-01-19 2625 .get_resv_regions = arm_smmu_get_resv_regions, a66c5dc549d1e1 drivers/iommu/arm-smmu-v3.c Thierry Reding 2019-12-18 2626 .put_resv_regions = generic_iommu_put_resv_regions, f534d98b9d2705 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c Jean-Philippe Brucker 2020-09-18 2627 .dev_has_feat = arm_smmu_dev_has_feature, f534d98b9d2705 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c Jean-Philippe Brucker 2020-09-18 2628 .dev_fea
Re: [PATCH v3 2/2] iommu/sva: Remove mm parameter from SVA bind API
Hi Jacob, I love your patch! Yet something to improve: [auto build test ERROR on e49d033bddf5b565044e2abe4241353959bc9120] url: https://github.com/0day-ci/linux/commits/Jacob-Pan/Simplify-and-restrict-IOMMU-SVA-APIs/20210417-052451 base: e49d033bddf5b565044e2abe4241353959bc9120 config: arm64-randconfig-r022-20210416 (attached as .config) compiler: aarch64-linux-gcc (GCC) 9.3.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/0day-ci/linux/commit/6d85fee95bdcd7e53f10442ddc71d0c310d43367 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Jacob-Pan/Simplify-and-restrict-IOMMU-SVA-APIs/20210417-052451 git checkout 6d85fee95bdcd7e53f10442ddc71d0c310d43367 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross W=1 ARCH=arm64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All errors (new ones prefixed by >>): >> drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c:2631:15: error: initialization >> of 'struct iommu_sva * (*)(struct device *, unsigned int)' from incompatible >> pointer type 'struct iommu_sva * (*)(struct device *, struct mm_struct *, >> unsigned int)' [-Werror=incompatible-pointer-types] 2631 | .sva_bind = arm_smmu_sva_bind, | ^ drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c:2631:15: note: (near initialization for 'arm_smmu_ops.sva_bind') cc1: some warnings being treated as errors vim +2631 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c f534d98b9d2705 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c Jean-Philippe Brucker 2020-09-18 2608 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2609 static struct iommu_ops arm_smmu_ops = { 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2610 .capable= arm_smmu_capable, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2611 .domain_alloc = arm_smmu_domain_alloc, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2612 .domain_free= arm_smmu_domain_free, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2613 .attach_dev = arm_smmu_attach_dev, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2614 .map= arm_smmu_map, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2615 .unmap = arm_smmu_unmap, 07fdef34d2be68 drivers/iommu/arm-smmu-v3.c Zhen Lei 2018-09-20 2616 .flush_iotlb_all= arm_smmu_flush_iotlb_all, 32b124492bdf97 drivers/iommu/arm-smmu-v3.c Robin Murphy 2017-09-28 2617 .iotlb_sync = arm_smmu_iotlb_sync, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2618 .iova_to_phys = arm_smmu_iova_to_phys, cefa0d55da3753 drivers/iommu/arm-smmu-v3.c Joerg Roedel 2020-04-29 2619 .probe_device = arm_smmu_probe_device, cefa0d55da3753 drivers/iommu/arm-smmu-v3.c Joerg Roedel 2020-04-29 2620 .release_device = arm_smmu_release_device, 08d4ca2a672bab drivers/iommu/arm-smmu-v3.c Robin Murphy 2016-09-12 2621 .device_group = arm_smmu_device_group, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2622 .domain_get_attr= arm_smmu_domain_get_attr, 48ec83bcbcf509 drivers/iommu/arm-smmu-v3.c Will Deacon 2015-05-27 2623 .domain_set_attr= arm_smmu_domain_set_attr, 8f78515425daea drivers/iommu/arm-smmu-v3.c Robin Murphy 2016-09-12 2624 .of_xlate = arm_smmu_of_xlate, 50019f09a4baa0 drivers/iommu/arm-smmu-v3.c Eric Auger 2017-01-19 2625 .get_resv_regions = arm_smmu_get_resv_regions, a66c5dc549d1e1 drivers/iommu/arm-smmu-v3.c Thierry Reding 2019-12-18 2626 .put_resv_regions = generic_iommu_put_resv_regions, f534d98b9d2705 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c Jean-Philippe Brucker 2020-09-18 2627 .dev_has_feat = arm_smmu_dev_has_feature, f534d98b9d2705 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c Jean-Philippe Brucker 2020-09-18 2628 .dev_feat_enabled = arm_smmu_dev_feature_enabled, f534d98b9d2705 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.
[PATCH v3 2/2] iommu/sva: Remove mm parameter from SVA bind API
The mm parameter in iommu_sva_bind_device() is intended for privileged process perform bind() on behalf of other processes. This use case has yet to be materialized, let alone potential security implications of adding kernel hooks without explicit user consent. In addition, with the agreement that IOASID allocation shall be subject cgroup limit. It will be inline with misc cgroup proposal if IOASID allocation as part of the SVA bind is limited to the current task. Link: https://lore.kernel.org/linux-iommu/20210303160205.151d114e@jacob-builder/ Link: https://lore.kernel.org/linux-iommu/YFhiMLR35WWMW%2FHu@myrica/ Signed-off-by: Jacob Pan --- drivers/dma/idxd/cdev.c | 2 +- drivers/dma/idxd/init.c | 2 +- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 9 + drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 3 +-- drivers/iommu/intel/svm.c | 17 +++-- drivers/iommu/iommu-sva-lib.c | 11 ++- drivers/iommu/iommu-sva-lib.h | 2 +- drivers/iommu/iommu.c | 14 +- drivers/misc/uacce/uacce.c | 2 +- include/linux/intel-iommu.h | 3 +-- include/linux/iommu.h | 8 +++- 11 files changed, 36 insertions(+), 37 deletions(-) diff --git a/drivers/dma/idxd/cdev.c b/drivers/dma/idxd/cdev.c index 21ec82bc47b6..8c3347c8930c 100644 --- a/drivers/dma/idxd/cdev.c +++ b/drivers/dma/idxd/cdev.c @@ -103,7 +103,7 @@ static int idxd_cdev_open(struct inode *inode, struct file *filp) filp->private_data = ctx; if (device_pasid_enabled(idxd)) { - sva = iommu_sva_bind_device(dev, current->mm, 0); + sva = iommu_sva_bind_device(dev, 0); if (IS_ERR(sva)) { rc = PTR_ERR(sva); dev_err(dev, "pasid allocation failed: %d\n", rc); diff --git a/drivers/dma/idxd/init.c b/drivers/dma/idxd/init.c index 7b2290b19787..f64a19b5e513 100644 --- a/drivers/dma/idxd/init.c +++ b/drivers/dma/idxd/init.c @@ -302,7 +302,7 @@ static int idxd_enable_system_pasid(struct idxd_device *idxd) unsigned int pasid; struct iommu_sva *sva; - sva = iommu_sva_bind_device(&idxd->pdev->dev, NULL, + sva = iommu_sva_bind_device(&idxd->pdev->dev, IOMMU_SVA_BIND_SUPERVISOR); if (IS_ERR(sva)) { dev_warn(&idxd->pdev->dev, diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index 145ceb2fc5da..0c3014e64c77 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -305,10 +305,11 @@ static void arm_smmu_mmu_notifier_put(struct arm_smmu_mmu_notifier *smmu_mn) } static struct iommu_sva * -__arm_smmu_sva_bind(struct device *dev, struct mm_struct *mm) +__arm_smmu_sva_bind(struct device *dev) { int ret; struct arm_smmu_bond *bond; + struct mm_struct *mm = current->mm; struct arm_smmu_master *master = dev_iommu_priv_get(dev); struct iommu_domain *domain = iommu_get_domain_for_dev(dev); struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); @@ -329,7 +330,7 @@ __arm_smmu_sva_bind(struct device *dev, struct mm_struct *mm) return ERR_PTR(-ENOMEM); /* Allocate a PASID for this mm if necessary */ - ret = iommu_sva_alloc_pasid(mm, 1, (1U << master->ssid_bits) - 1); + ret = iommu_sva_alloc_pasid(1, (1U << master->ssid_bits) - 1); if (ret) goto err_free_bond; @@ -354,7 +355,7 @@ __arm_smmu_sva_bind(struct device *dev, struct mm_struct *mm) } struct iommu_sva * -arm_smmu_sva_bind(struct device *dev, struct mm_struct *mm, unsigned int flags) +arm_smmu_sva_bind(struct device *dev, unsigned int flags) { struct iommu_sva *handle; struct iommu_domain *domain = iommu_get_domain_for_dev(dev); @@ -367,7 +368,7 @@ arm_smmu_sva_bind(struct device *dev, struct mm_struct *mm, unsigned int flags) return ERR_PTR(-EINVAL); mutex_lock(&sva_lock); - handle = __arm_smmu_sva_bind(dev, mm); + handle = __arm_smmu_sva_bind(dev); mutex_unlock(&sva_lock); return handle; } diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index b971d4dcf090..306fa59a9db5 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -710,8 +710,7 @@ bool arm_smmu_master_sva_supported(struct arm_smmu_master *master); bool arm_smmu_master_sva_enabled(struct arm_smmu_master *master); int arm_smmu_master_enable_sva(struct arm_smmu_master *master); int arm_smmu_master_disable_sva(struct arm_smmu_master *master); -struct iommu_sva *arm_smmu_sva_bind(struct device *dev, struct mm_st