From patchwork Wed Jun 26 15:12:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shameerali Kolothum Thodi X-Patchwork-Id: 167833 Delivered-To: patch@linaro.org Received: by 2002:a92:4782:0:0:0:0:0 with SMTP id e2csp1073081ilk; Wed, 26 Jun 2019 08:13:54 -0700 (PDT) X-Google-Smtp-Source: APXvYqz2TYpUvKlwCKe+5vRm/D4f1Ld+B+gLpV61jZJ9hLcAelvVPp9l4SHnVuowT6QcG2zNKz3X X-Received: by 2002:a63:3d02:: with SMTP id k2mr3434008pga.36.1561562033834; Wed, 26 Jun 2019 08:13:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561562033; cv=none; d=google.com; s=arc-20160816; b=b5z2WWcJxdpaF9wxuchSEkV8foMf5MaMs2xNPm1ofNENgrv+/OIPkxAM6Ei4GEBUph NIKUYxN+AnwchLUKm0utrCd3Or7eu7tfsg8I3yVV/FvEj7JWA11ORrfi5QnnyrpNjbVZ aQLEnYECNhOafk+KMxLVwtt7srxZhmkc2aOpUAZYxi7JjlMq85CF0yVwPIOMheN8EzCj zMCfgBn1CObPkJWc0YZtcTBDotsCP6XJDRx5fpDXIF7uOprZjbOQIcYzWCEqo9RPDRDG 5EeT1kLcqUqFyN8Go115hsehO1x1aeeoC/m8CnnqoV2UIS4WIwA6S2U8++7PJ5lwyZF9 pSaA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=Au1vsrDNrCEm3oixuEjIbPhSOBCh2NpYBgmx1kp4oS4=; b=MVAGdG0q51ZU0fVxKqjrOfirjQJhkGJja6fNKYf4oHyaLqsmUrLMP2TY/VewhMbYwx /SNGc/RYMrvjPqW3GTKAY/7j6TeLpv4JNxXnCxCXRffhmn8MEHE5cqegtcOjr7h46O/s IIHsxpnoi6KANEjMpC/GQoVzLhLmmtEhm++7C3DPME0Mi1h51/hrxKbg6t1NQMMNs6g7 ItZiUZmkvTKR+39rz1m2PMNdjH/yFHjaVCOf2F7/swjGyZwII8IFJJL6ecsQORDn3udE 6/1HX+PKi5JjEu3Q4Sfo6ct2GbfwOCPVSDjnsHzpMn8a3pit6mRBz7yJuNMEx0wtj823 jRog== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w7si15618857pgs.168.2019.06.26.08.13.53; Wed, 26 Jun 2019 08:13:53 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728349AbfFZPNw (ORCPT + 30 others); Wed, 26 Jun 2019 11:13:52 -0400 Received: from szxga07-in.huawei.com ([45.249.212.35]:40824 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726157AbfFZPNu (ORCPT ); Wed, 26 Jun 2019 11:13:50 -0400 Received: from DGGEMS406-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 5A61315EC890CCFBC107; Wed, 26 Jun 2019 23:13:47 +0800 (CST) Received: from S00345302A-PC.china.huawei.com (10.202.227.237) by DGGEMS406-HUB.china.huawei.com (10.3.19.206) with Microsoft SMTP Server id 14.3.439.0; Wed, 26 Jun 2019 23:13:36 +0800 From: Shameer Kolothum To: , , CC: , , , , , , , Shameer Kolothum Subject: [PATCH v7 2/6] vfio/type1: Check reserve region conflict and update iova list Date: Wed, 26 Jun 2019 16:12:44 +0100 Message-ID: <20190626151248.11776-3-shameerali.kolothum.thodi@huawei.com> X-Mailer: git-send-email 2.12.0.windows.1 In-Reply-To: <20190626151248.11776-1-shameerali.kolothum.thodi@huawei.com> References: <20190626151248.11776-1-shameerali.kolothum.thodi@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.202.227.237] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This retrieves the reserved regions associated with dev group and checks for conflicts with any existing dma mappings. Also update the iova list excluding the reserved regions. Reserved regions with type IOMMU_RESV_DIRECT_RELAXABLE are excluded from above checks as they are considered as directly mapped regions which are known to be relaxable. Signed-off-by: Shameer Kolothum --- drivers/vfio/vfio_iommu_type1.c | 96 +++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) -- 2.17.1 diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c index 970d1ec06aed..b6bfdfa16c33 100644 --- a/drivers/vfio/vfio_iommu_type1.c +++ b/drivers/vfio/vfio_iommu_type1.c @@ -1508,6 +1508,88 @@ static int vfio_iommu_aper_resize(struct list_head *iova, return 0; } +/* + * Check reserved region conflicts with existing dma mappings + */ +static bool vfio_iommu_resv_conflict(struct vfio_iommu *iommu, + struct list_head *resv_regions) +{ + struct iommu_resv_region *region; + + /* Check for conflict with existing dma mappings */ + list_for_each_entry(region, resv_regions, list) { + if (region->type == IOMMU_RESV_DIRECT_RELAXABLE) + continue; + + if (vfio_find_dma(iommu, region->start, region->length)) + return true; + } + + return false; +} + +/* + * Check iova region overlap with reserved regions and + * exclude them from the iommu iova range + */ +static int vfio_iommu_resv_exclude(struct list_head *iova, + struct list_head *resv_regions) +{ + struct iommu_resv_region *resv; + struct vfio_iova *n, *next; + + list_for_each_entry(resv, resv_regions, list) { + phys_addr_t start, end; + + if (resv->type == IOMMU_RESV_DIRECT_RELAXABLE) + continue; + + start = resv->start; + end = resv->start + resv->length - 1; + + list_for_each_entry_safe(n, next, iova, list) { + int ret = 0; + + /* No overlap */ + if (start > n->end || end < n->start) + continue; + /* + * Insert a new node if current node overlaps with the + * reserve region to exlude that from valid iova range. + * Note that, new node is inserted before the current + * node and finally the current node is deleted keeping + * the list updated and sorted. + */ + if (start > n->start) + ret = vfio_iommu_iova_insert(&n->list, n->start, + start - 1); + if (!ret && end < n->end) + ret = vfio_iommu_iova_insert(&n->list, end + 1, + n->end); + if (ret) + return ret; + + list_del(&n->list); + kfree(n); + } + } + + if (list_empty(iova)) + return -EINVAL; + + return 0; +} + +static void vfio_iommu_resv_free(struct list_head *resv_regions) +{ + struct iommu_resv_region *n, *next; + + list_for_each_entry_safe(n, next, resv_regions, list) { + list_del(&n->list); + kfree(n); + } +} + static void vfio_iommu_iova_free(struct list_head *iova) { struct vfio_iova *n, *next; @@ -1559,6 +1641,7 @@ static int vfio_iommu_type1_attach_group(void *iommu_data, phys_addr_t resv_msi_base; struct iommu_domain_geometry geo; LIST_HEAD(iova_copy); + LIST_HEAD(group_resv_regions); mutex_lock(&iommu->lock); @@ -1644,6 +1727,13 @@ static int vfio_iommu_type1_attach_group(void *iommu_data, goto out_detach; } + iommu_get_group_resv_regions(iommu_group, &group_resv_regions); + + if (vfio_iommu_resv_conflict(iommu, &group_resv_regions)) { + ret = -EINVAL; + goto out_detach; + } + /* Get a copy of the current iova list and work on it */ ret = vfio_iommu_iova_get_copy(iommu, &iova_copy); if (ret) @@ -1654,6 +1744,10 @@ static int vfio_iommu_type1_attach_group(void *iommu_data, if (ret) goto out_detach; + ret = vfio_iommu_resv_exclude(&iova_copy, &group_resv_regions); + if (ret) + goto out_detach; + resv_msi = vfio_iommu_has_sw_msi(iommu_group, &resv_msi_base); INIT_LIST_HEAD(&domain->group_list); @@ -1714,6 +1808,7 @@ static int vfio_iommu_type1_attach_group(void *iommu_data, /* Delete the old one and insert new iova list */ vfio_iommu_iova_insert_copy(iommu, &iova_copy); mutex_unlock(&iommu->lock); + vfio_iommu_resv_free(&group_resv_regions); return 0; @@ -1722,6 +1817,7 @@ static int vfio_iommu_type1_attach_group(void *iommu_data, out_domain: iommu_domain_free(domain->domain); vfio_iommu_iova_free(&iova_copy); + vfio_iommu_resv_free(&group_resv_regions); out_free: kfree(domain); kfree(group);