Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1157411pxk; Mon, 31 Aug 2020 11:20:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxTg1lJ1QuvF6/X5R6yX9Kl1Czwi8VCf8ONETFu+Zy2sflZqmXnCoQmtwh8FLynd5ZqQa3f X-Received: by 2002:a17:906:48d6:: with SMTP id d22mr2237197ejt.462.1598898021151; Mon, 31 Aug 2020 11:20:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598898021; cv=none; d=google.com; s=arc-20160816; b=c3c5EXvmS092FQMDrj2D24kHsG1locRJKTNrha3WqJ+2lbtIXfaoKceijQdNN7LxAB 50FAQ4uSv7FkmHo49JW4qU135qCrzKqsBoLcRhmPHxRqm2p+NJzDs1mBRz4d67UMXdaw ukHsd3lsmqIQR+lXNtVxlnf8kkUtcLVI78x9Mb0QX+NCOfcw59J1P8ItTWoZ473P3g5f jglVOni5z3+LM4wJfWEeEyEXT5ErlgF/SdmsbNwKMjbxr4g6Ru682+MI9BlKrPmCourW TW/Bv4XzeipSB4bxztkPhvPlH2td+gPySUb3iigDGw/DLMu2Ngu9hvV3pw53hKGqh02W Urvw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=zhfWRuMAC0h3yTxzMXK1MISpXcAtHaGkV3wqBPhKFow=; b=du9y+JMBm821v1LMQeZl5bHuyldRHybIcDEkpPrEndm4awf26DwdQLxx8ofEDRa/qf +uUIcxACm5jd8gFr8NiH9OJnHPhIicfHJPcLJT61e/zpcY0g2j9Uurk0zE+teY+a2Gr8 aykRy5eI9Jn71lLcqbURgNx46QeUEnUFivMKxJ9b8YfQALqlUxKWmg+nEJ5WYhqVtV5l punCF41OCPwSXqUQFdHn7faLaFH/XSLQxyG5xvxYY2dKKaIG75CLrjn7h2QdISeHtj9N Sc8QNCBwab1gEdhOq+7bfQIqzKfVqU8MP1mL35Uejmb5oLFm6XKt5A8EhS5UWDy9D7Bc 0KUw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=T2QVwZKL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n6si5860792ejg.175.2020.08.31.11.19.58; Mon, 31 Aug 2020 11:20:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=T2QVwZKL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729682AbgHaSSv (ORCPT + 99 others); Mon, 31 Aug 2020 14:18:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53404 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729372AbgHaSSP (ORCPT ); Mon, 31 Aug 2020 14:18:15 -0400 Received: from mail-pg1-x544.google.com (mail-pg1-x544.google.com [IPv6:2607:f8b0:4864:20::544]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2DAE9C061236 for ; Mon, 31 Aug 2020 11:18:15 -0700 (PDT) Received: by mail-pg1-x544.google.com with SMTP id 7so1045344pgm.11 for ; Mon, 31 Aug 2020 11:18:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=zhfWRuMAC0h3yTxzMXK1MISpXcAtHaGkV3wqBPhKFow=; b=T2QVwZKLA97etHb33FpJHEn6QSQxD3HpzujRLfGVewfLlcTmSxoUa5jaafruS/a/il UBLpV1Sn+et8B/3xeFIJ+3pqwWeTLocv9rQGophHUKqQZjda00dUqtiS5Kck54a1cnkf hhIcTMRudy50LwtKiuskjgQNGwo5Fwhd+/qZERrosbQOBU9g/O3KE/FWoF9sgLuV7dg1 LwXbypaifzYZzF0hf106XZ9KPRe5bkbk6Pde/NQgzPLyoA1BWd/UXqQP+YrEitW2Sj9D Jj68hS/lh1kZ6EWzVHAvKcbE2s9h9HemN01VTCmnbCiEXBFIxKzkT8FTubaZeHkL3GcN 4+Og== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=zhfWRuMAC0h3yTxzMXK1MISpXcAtHaGkV3wqBPhKFow=; b=GvumR8zbt9oHx3nappOL/QCcHMFU19xN4KB8IxbvNw6X7STuw4I3KFPN7AqoIiWN4N EozqF3JktKKS2WyKPQQe766n2dd/xLAy32mVfEWJGlx+5a4OHq3uhQJz5HvY6DQiYDIo jGVOaZU9yEaO4h+1Qgk5eRVBBatimUuPsb7uXs9MCtgirRWb751S0ls4Ap3m6bz7FelF aN18tD9Bd3hqynzNFudiqb1wpvKvjQukSeL9KTT+gnCzxYzYRB6ipyh6sAKo9fo3XHWb +Vj12wehdg/Egpm7HpUC/eZu00Rsea2UpGBzr17hY7fC6HxdBZEgfEHkrn6xxEmf1I7j 9h4w== X-Gm-Message-State: AOAM531QTADVCYKSUrGO03afwx/94j+NJsuvfsJBmYFt237QmNkw0Yf4 SgoVn71NkdHT91+kKhVR2nM= X-Received: by 2002:a62:8c4b:: with SMTP id m72mr2203116pfd.306.1598897894724; Mon, 31 Aug 2020 11:18:14 -0700 (PDT) Received: from jacob-builder.jf.intel.com (jfdmzpr04-ext.jf.intel.com. [134.134.137.73]) by smtp.gmail.com with ESMTPSA id y128sm8672547pfy.74.2020.08.31.11.18.13 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 31 Aug 2020 11:18:14 -0700 (PDT) From: Jacob Pan X-Google-Original-From: Jacob Pan To: iommu@lists.linux-foundation.org, LKML , Joerg Roedel , Alex Williamson Cc: "Lu Baolu" , David Woodhouse , Yi Liu , "Tian, Kevin" , Raj Ashok , "Christoph Hellwig" , Jean-Philippe Brucker , Eric Auger , Jonathan Corbet , Jacob Pan Subject: [PATCH v8 4/7] iommu/uapi: Use named union for user data Date: Mon, 31 Aug 2020 11:24:57 -0700 Message-Id: <1598898300-65475-5-git-send-email-jacob.jun.pan@linux.intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1598898300-65475-1-git-send-email-jacob.jun.pan@linux.intel.com> References: <1598898300-65475-1-git-send-email-jacob.jun.pan@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org IOMMU UAPI data size is filled by the user space which must be validated by the kernel. To ensure backward compatibility, user data can only be extended by either re-purpose padding bytes or extend the variable sized union at the end. No size change is allowed before the union. Therefore, the minimum size is the offset of the union. To use offsetof() on the union, we must make it named. Link: https://lore.kernel.org/linux-iommu/20200611145518.0c2817d6@x1.home/ Signed-off-by: Jacob Pan Reviewed-by: Lu Baolu Reviewed-by: Eric Auger --- drivers/iommu/intel/iommu.c | 22 +++++++++++----------- drivers/iommu/intel/svm.c | 2 +- include/uapi/linux/iommu.h | 4 ++-- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index e9864e52b0e9..43f16f0cebde 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -5425,8 +5425,8 @@ intel_iommu_sva_invalidate(struct iommu_domain *domain, struct device *dev, /* Size is only valid in address selective invalidation */ if (inv_info->granularity == IOMMU_INV_GRANU_ADDR) - size = to_vtd_size(inv_info->addr_info.granule_size, - inv_info->addr_info.nb_granules); + size = to_vtd_size(inv_info->granu.addr_info.granule_size, + inv_info->granu.addr_info.nb_granules); for_each_set_bit(cache_type, (unsigned long *)&inv_info->cache, @@ -5447,20 +5447,20 @@ intel_iommu_sva_invalidate(struct iommu_domain *domain, struct device *dev, * granularity. */ if (inv_info->granularity == IOMMU_INV_GRANU_PASID && - (inv_info->pasid_info.flags & IOMMU_INV_PASID_FLAGS_PASID)) - pasid = inv_info->pasid_info.pasid; + (inv_info->granu.pasid_info.flags & IOMMU_INV_PASID_FLAGS_PASID)) + pasid = inv_info->granu.pasid_info.pasid; else if (inv_info->granularity == IOMMU_INV_GRANU_ADDR && - (inv_info->addr_info.flags & IOMMU_INV_ADDR_FLAGS_PASID)) - pasid = inv_info->addr_info.pasid; + (inv_info->granu.addr_info.flags & IOMMU_INV_ADDR_FLAGS_PASID)) + pasid = inv_info->granu.addr_info.pasid; switch (BIT(cache_type)) { case IOMMU_CACHE_INV_TYPE_IOTLB: /* HW will ignore LSB bits based on address mask */ if (inv_info->granularity == IOMMU_INV_GRANU_ADDR && size && - (inv_info->addr_info.addr & ((BIT(VTD_PAGE_SHIFT + size)) - 1))) { + (inv_info->granu.addr_info.addr & ((BIT(VTD_PAGE_SHIFT + size)) - 1))) { pr_err_ratelimited("User address not aligned, 0x%llx, size order %llu\n", - inv_info->addr_info.addr, size); + inv_info->granu.addr_info.addr, size); } /* @@ -5468,9 +5468,9 @@ intel_iommu_sva_invalidate(struct iommu_domain *domain, struct device *dev, * We use npages = -1 to indicate that. */ qi_flush_piotlb(iommu, did, pasid, - mm_to_dma_pfn(inv_info->addr_info.addr), + mm_to_dma_pfn(inv_info->granu.addr_info.addr), (granu == QI_GRAN_NONG_PASID) ? -1 : 1 << size, - inv_info->addr_info.flags & IOMMU_INV_ADDR_FLAGS_LEAF); + inv_info->granu.addr_info.flags & IOMMU_INV_ADDR_FLAGS_LEAF); if (!info->ats_enabled) break; @@ -5493,7 +5493,7 @@ intel_iommu_sva_invalidate(struct iommu_domain *domain, struct device *dev, size = 64 - VTD_PAGE_SHIFT; addr = 0; } else if (inv_info->granularity == IOMMU_INV_GRANU_ADDR) { - addr = inv_info->addr_info.addr; + addr = inv_info->granu.addr_info.addr; } if (info->ats_enabled) diff --git a/drivers/iommu/intel/svm.c b/drivers/iommu/intel/svm.c index 95c3164a2302..99353d6468fa 100644 --- a/drivers/iommu/intel/svm.c +++ b/drivers/iommu/intel/svm.c @@ -370,7 +370,7 @@ int intel_svm_bind_gpasid(struct iommu_domain *domain, struct device *dev, spin_lock(&iommu->lock); ret = intel_pasid_setup_nested(iommu, dev, (pgd_t *)(uintptr_t)data->gpgd, - data->hpasid, &data->vtd, dmar_domain, + data->hpasid, &data->vendor.vtd, dmar_domain, data->addr_width); spin_unlock(&iommu->lock); if (ret) { diff --git a/include/uapi/linux/iommu.h b/include/uapi/linux/iommu.h index 7cc6ee6c41f7..c64bca5af419 100644 --- a/include/uapi/linux/iommu.h +++ b/include/uapi/linux/iommu.h @@ -267,7 +267,7 @@ struct iommu_cache_invalidate_info { union { struct iommu_inv_pasid_info pasid_info; struct iommu_inv_addr_info addr_info; - }; + } granu; }; /** @@ -337,7 +337,7 @@ struct iommu_gpasid_bind_data { /* Vendor specific data */ union { struct iommu_gpasid_bind_data_vtd vtd; - }; + } vendor; }; #endif /* _UAPI_IOMMU_H */ -- 2.7.4