Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp721716ybt; Wed, 1 Jul 2020 08:30:34 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwzuboouVVnKeleyHrqFAd7KZk5lqxqP5cLM9gfOP6hjcHoxh/LE8SBjNu1tygBsRSpRQ+0 X-Received: by 2002:a17:906:c0d9:: with SMTP id bn25mr14262744ejb.176.1593617434803; Wed, 01 Jul 2020 08:30:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593617434; cv=none; d=google.com; s=arc-20160816; b=LiUZ+5UIeqbjSGfr91tILugfx6ae6Z+nmWCQXu80b6iE5a2pRgrYhl0LuJw3nnQ6XQ ASD2FLZjwVPZZYCozmaghsaIUI3unt2kdeoAYF0yj0FltVgmsgg3MARuBWstE9w0oslZ +HCNAJ+/Nub4HAA5vcEMfQY373cdCRQiod2JJnr+XArYQ2ywUNnwpN5btIwVBWwkkmrP n+rPnYQPdUJBMpAb41RBagiUPVvvsJsBeIwOx3/xfF/SvAbNjG6UbBv6u4l7XfgHSwsF dxzSCAqcfO6KwtvhSLq2LiPWiFxRdFwgPUimeQK8cwzquQQ2L6UlbZz2mnRef0rDWtLF b/Nw== 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:ironport-sdr:ironport-sdr; bh=5WYAfDy1XaafYU+Lz8ZVSlI5DKafUmIPD7vFWXoH9fM=; b=D8r/+OWrX75jfpduExe9w2eWZDJUYrHPOBKSZv2TGX0wuF7qfO3fxdcVWKOPp4KWlA U915R4MSHKqWnqSxOKU+uN56/USHnsdW/FDqv8viNpWByDXIPEQUBwc35gNdSa72TUmy 9ZvP1sCRE+OV49B5L8JBN7b80iaVo4KRYNi4uAXnjPFBztDiKpsOar7F0csknOJ6P/l1 vmNyxLxfamqxQ4Y2DqHai5fvaTRiUxMc/XQcI6W0LFJfOL61ioPdKa5l7Qm6g/Jm8mpX vWjkoUqigPuMD6767C87v8cdaMriViaIO8rHdlWsOlCbUVSo+F9bpftbxODO9uQICqaY Qe3Q== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id cb9si4039241ejb.176.2020.07.01.08.30.11; Wed, 01 Jul 2020 08:30:34 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732044AbgGAP1d (ORCPT + 99 others); Wed, 1 Jul 2020 11:27:33 -0400 Received: from mga17.intel.com ([192.55.52.151]:54837 "EHLO mga17.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732023AbgGAP12 (ORCPT ); Wed, 1 Jul 2020 11:27:28 -0400 IronPort-SDR: pdBmNSSbLtSDMkvzEY8BdgQnsCWNmmOeGu2Ww9xs0UzhdCDqToxhQ1ZomGAt+4mKHTx7u6eeM+ r9O02J3trGcw== X-IronPort-AV: E=McAfee;i="6000,8403,9668"; a="126699723" X-IronPort-AV: E=Sophos;i="5.75,300,1589266800"; d="scan'208";a="126699723" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Jul 2020 08:27:23 -0700 IronPort-SDR: btFBBtRUEX+vHGqsy/EMYLn4PZ9C6iB7F/OQDO2ETyrDoFqHxBFwPaib5XKujzPdHVDuYGPHhD +J2hJBUNDAgA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,300,1589266800"; d="scan'208";a="295591653" Received: from jacob-builder.jf.intel.com ([10.7.199.155]) by orsmga002.jf.intel.com with ESMTP; 01 Jul 2020 08:27:22 -0700 From: Jacob Pan To: iommu@lists.linux-foundation.org, LKML , "Lu Baolu" , Joerg Roedel , David Woodhouse Cc: Yi Liu , "Tian, Kevin" , Raj Ashok , Eric Auger , Jacob Pan Subject: [PATCH v3 5/7] iommu/vt-d: Fix devTLB flush for vSVA Date: Wed, 1 Jul 2020 08:33:54 -0700 Message-Id: <1593617636-79385-6-git-send-email-jacob.jun.pan@linux.intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1593617636-79385-1-git-send-email-jacob.jun.pan@linux.intel.com> References: <1593617636-79385-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 From: Liu Yi L For guest SVA usage, in order to optimize for less VMEXIT, guest request of IOTLB flush also includes device TLB. On the host side, IOMMU driver performs IOTLB and implicit devTLB invalidation. When PASID-selective granularity is requested by the guest we need to derive the equivalent address range for devTLB instead of using the address information in the UAPI data. The reason for that is, unlike IOTLB flush, devTLB flush does not support PASID-selective granularity. This is to say, we need to set the following in the PASID based devTLB invalidation descriptor: - entire 64 bit range in address ~(0x1 << 63) - S bit = 1 (VT-d CH 6.5.2.6). Without this fix, device TLB flush range is not set properly for PASID selective granularity. This patch also merged devTLB flush code for both implicit and explicit cases. Fixes: 6ee1b77ba3ac ("iommu/vt-d: Add svm/sva invalidate function") Acked-by: Lu Baolu Signed-off-by: Liu Yi L Signed-off-by: Jacob Pan --- drivers/iommu/intel/iommu.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index 96340da57075..6a0c62c7395c 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -5408,7 +5408,7 @@ intel_iommu_sva_invalidate(struct iommu_domain *domain, struct device *dev, sid = PCI_DEVID(bus, devfn); /* Size is only valid in address selective invalidation */ - if (inv_info->granularity != IOMMU_INV_GRANU_PASID) + if (inv_info->granularity == IOMMU_INV_GRANU_ADDR) size = to_vtd_size(inv_info->addr_info.granule_size, inv_info->addr_info.nb_granules); @@ -5417,6 +5417,7 @@ intel_iommu_sva_invalidate(struct iommu_domain *domain, struct device *dev, IOMMU_CACHE_INV_TYPE_NR) { int granu = 0; u64 pasid = 0; + u64 addr = 0; granu = to_vtd_granularity(cache_type, inv_info->granularity); if (granu == -EINVAL) { @@ -5456,24 +5457,31 @@ intel_iommu_sva_invalidate(struct iommu_domain *domain, struct device *dev, (granu == QI_GRAN_NONG_PASID) ? -1 : 1 << size, inv_info->addr_info.flags & IOMMU_INV_ADDR_FLAGS_LEAF); + if (!info->ats_enabled) + break; /* * Always flush device IOTLB if ATS is enabled. vIOMMU * in the guest may assume IOTLB flush is inclusive, * which is more efficient. */ - if (info->ats_enabled) - qi_flush_dev_iotlb_pasid(iommu, sid, - info->pfsid, pasid, - info->ats_qdep, - inv_info->addr_info.addr, - size); - break; + fallthrough; case IOMMU_CACHE_INV_TYPE_DEV_IOTLB: + /* + * There is no PASID selective flush for device TLB, so + * the equivalent of that is we set the size to be the + * entire range of 64 bit. User only provides PASID info + * without address info. So we set addr to 0. + */ + if (inv_info->granularity == IOMMU_INV_GRANU_PASID) { + size = 64 - VTD_PAGE_SHIFT; + addr = 0; + } else if (inv_info->granularity == IOMMU_INV_GRANU_ADDR) + addr = inv_info->addr_info.addr; + if (info->ats_enabled) qi_flush_dev_iotlb_pasid(iommu, sid, info->pfsid, pasid, - info->ats_qdep, - inv_info->addr_info.addr, + info->ats_qdep, addr, size); else pr_warn_ratelimited("Passdown device IOTLB flush w/o ATS!\n"); -- 2.7.4