From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.3 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3BE10C56202 for ; Thu, 26 Nov 2020 15:20:54 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CEAE121D40 for ; Thu, 26 Nov 2020 15:20:53 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="wmGb34ze" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CEAE121D40 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=5tQ/6SC7FrrlSurQ/en7ObNeseLwRqhm+1KR/Zjvue4=; b=wmGb34zeq5FcLOcn4Z/g4CalZ Jdk91iWrbkVomt2JrfxL3opkiK7pr0BGtyMRSKsgeU4zI6dE5aRvsG6RVFSfFDdd/rLjDQhjaaEV1 +Kl7ImmXihQ/Ex+7Hi1UNTVCOiDNOP7/hNKp+8TCu4aBAQ27cx63YOn7abEFB91M/vjFR0SgHZzmS 4W38QG+nxDI6z4W/raLKQlNMXoKHYrEd/Qjy5+Cq/wJHceAkPAgksyRhe+de0WUt0liIfF/Fc0h3f fCaaA5uGfYLfu4M1kUBnLh8gkMyysoDKD+JhF8IW67rBOYDl99tyo96xOycXi5I4t+2qjuIIbyCTd ASC6V1pZw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kiJ3d-0002v4-HU; Thu, 26 Nov 2020 15:19:41 +0000 Received: from foss.arm.com ([217.140.110.172]) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kiJ3a-0002uS-R4; Thu, 26 Nov 2020 15:19:39 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id DFC2631B; Thu, 26 Nov 2020 07:19:32 -0800 (PST) Received: from [10.57.59.159] (unknown [10.57.59.159]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 47AEB3F71F; Thu, 26 Nov 2020 07:19:30 -0800 (PST) Subject: Re: [PATCH] iommu: Improve the performance for direct_mapping To: Yong Wu , Joerg Roedel , Will Deacon References: <20201120090628.6566-1-yong.wu@mediatek.com> From: Robin Murphy Message-ID: Date: Thu, 26 Nov 2020 15:19:28 +0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Thunderbird/78.5.0 MIME-Version: 1.0 In-Reply-To: <20201120090628.6566-1-yong.wu@mediatek.com> Content-Language: en-GB X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201126_101938_999736_E2BBACD2 X-CRM114-Status: GOOD ( 25.63 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: youlin.pei@mediatek.com, anan.sun@mediatek.com, Nicolas Boichat , srv_heupstream@mediatek.com, chao.hao@mediatek.com, linux-kernel@vger.kernel.org, Krzysztof Kozlowski , Tomasz Figa , iommu@lists.linux-foundation.org, linux-mediatek@lists.infradead.org, Matthias Brugger , linux-arm-kernel@lists.infradead.org Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On 2020-11-20 09:06, Yong Wu wrote: > Currently direct_mapping always use the smallest pgsize which is SZ_4K > normally to mapping. This is unnecessary. we could gather the size, and > call iommu_map then, iommu_map could decide how to map better with the > just right pgsize. > > From the original comment, we should take care overlap, otherwise, > iommu_map may return -EEXIST. In this overlap case, we should map the > previous region before overlap firstly. then map the left part. > > Each a iommu device will call this direct_mapping when its iommu > initialize, This patch is effective to improve the boot/initialization > time especially while it only needs level 1 mapping. > > Signed-off-by: Anan Sun > Signed-off-by: Yong Wu > --- > drivers/iommu/iommu.c | 20 ++++++++++++++++++-- > 1 file changed, 18 insertions(+), 2 deletions(-) > > diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c > index df87c8e825f7..854a8fcb928d 100644 > --- a/drivers/iommu/iommu.c > +++ b/drivers/iommu/iommu.c > @@ -737,6 +737,7 @@ static int iommu_create_device_direct_mappings(struct iommu_group *group, > /* We need to consider overlapping regions for different devices */ > list_for_each_entry(entry, &mappings, list) { > dma_addr_t start, end, addr; > + size_t unmapped_sz = 0; > > if (domain->ops->apply_resv_region) > domain->ops->apply_resv_region(dev, domain, entry); > @@ -752,10 +753,25 @@ static int iommu_create_device_direct_mappings(struct iommu_group *group, > phys_addr_t phys_addr; > > phys_addr = iommu_iova_to_phys(domain, addr); > - if (phys_addr) > + if (phys_addr == 0) { > + unmapped_sz += pg_size; /* Gather the size. */ > continue; > + } I guess the reason we need to validate every page is because they may already have been legitimately mapped if someone else's reserved region overlaps - is it worth explicitly validating that, i.e. bail out if something's gone wrong enough that phys_addr != addr? Other than the naming issue (I agree that map_size is a far, far better choice), I don't have any strong opinions about the rest of the implementation - I've written enough variations of this pattern to know that there's just no "nice" way to do it in C; all you can do is shuffle the clunkiness around :) Robin. > > - ret = iommu_map(domain, addr, addr, pg_size, entry->prot); > + if (unmapped_sz) { > + /* Map the region before the overlap. */ > + ret = iommu_map(domain, start, start, > + unmapped_sz, entry->prot); > + if (ret) > + goto out; > + start += unmapped_sz; > + unmapped_sz = 0; > + } > + start += pg_size; > + } > + if (unmapped_sz) { > + ret = iommu_map(domain, start, start, unmapped_sz, > + entry->prot); > if (ret) > goto out; > } > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel