Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp3862261pxj; Tue, 15 Jun 2021 10:12:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwsQ1Iz2/YeiNYDwiMmdOfedW1FNR234E0WCntbknE+Qh2jeC02iNm/op8o9I0Vf7qMstS1 X-Received: by 2002:a17:906:ae85:: with SMTP id md5mr594888ejb.301.1623777133713; Tue, 15 Jun 2021 10:12:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623777133; cv=none; d=google.com; s=arc-20160816; b=wH0acJZjvI3zmXXSrjYzVR7zV7fdITjFVoPSPSFOifJTNgjqbA5hGj+dEDoJEYimBD XfNLlbDW5Ml3IiDW34/ETWToSbqiGZThIgoFoxc6VFd0Obpq6XZ8xcdX892ClGqYRO7Y NVsGv6vZZZbK9oMUHFH3RAtnDR6zQfvwQeXdoGCDPVfnVh5l+dKFPO+qPauf1qv3/pgn mkG4enuoF2yBdobzy8392ADtFmyRkXcGXUC0RPgS1AUTfRCS1xOq56OynZ+vqWxEL1cI Y2j/T5TbOSxo5KXd2F7OiY4/I243bMoUf2j0C5zXDqTCnJh6sjL5fp2SPeom83+I6eoQ aeOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=9GhyU47FIEp9F+G4wOraYSTkp1Y0S31iedZV9inYT0g=; b=cLUm5kC7gKyVUXQfXybgEgJAGqNyFdkQ5uI6soRqoFegy5sJ3gukb0yU32Ze8Rat9m oi3iAFaweEAa1Z7fnWHo9ioDojnxQJj3k+NIbCLeX/lfX5sSDalHibqgQDVtZ6gAGpwS xxSd71wqvMK8FoUDrQvkJvCn5bSG9IgBtM08WMmwjs7DCVcCT/ZR4JOAw7bF5qMmBjHB whZe5QwX7zkXP4r7Do5DsKUrn8RdqHCWgHKHittoflitCv+O6Yl1cLlvcvhf8g3RM2/b hYljGzV17tmFvyFJh23HXZc5PrqQYbdm4wmcTEOLzEKJv1+tgo3KWB4yr06A3uNnas9T GGCA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@quicinc.com header.s=qcdkim header.b=k6oUDzph; 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=quicinc.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i19si3626248edc.598.2021.06.15.10.11.50; Tue, 15 Jun 2021 10:12:13 -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=fail header.i=@quicinc.com header.s=qcdkim header.b=k6oUDzph; 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=quicinc.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230459AbhFORK4 (ORCPT + 99 others); Tue, 15 Jun 2021 13:10:56 -0400 Received: from alexa-out-sd-02.qualcomm.com ([199.106.114.39]:34909 "EHLO alexa-out-sd-02.qualcomm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229734AbhFORKy (ORCPT ); Tue, 15 Jun 2021 13:10:54 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=quicinc.com; i=@quicinc.com; q=dns/txt; s=qcdkim; t=1623776930; x=1655312930; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=H0Mpm8A6eWprEp4EbUOw1hCbxLfkWczylWeJo/FTZ74=; b=k6oUDzphsK6SP9hnKwJaQS9KwE6aU/ohRYY3Ih/j30Q72/6TMxeRQio1 usI/DQ+QyI5T16ya+o8JfeqpuGcJ8aWBxORRoup19SEk9mPpzbrqWgzBU mDnV/iCUYZ19fZYsYdMUIZum7jfLU3nrnnbxT1wCRRjQ6KNHdJM9bQJ0S w=; Received: from unknown (HELO ironmsg03-sd.qualcomm.com) ([10.53.140.143]) by alexa-out-sd-02.qualcomm.com with ESMTP; 15 Jun 2021 10:08:50 -0700 X-QCInternal: smtphost Received: from nasanexm03e.na.qualcomm.com ([10.85.0.48]) by ironmsg03-sd.qualcomm.com with ESMTP/TLS/AES256-SHA; 15 Jun 2021 10:08:50 -0700 Received: from th-lint-040.qualcomm.com (10.80.80.8) by nasanexm03e.na.qualcomm.com (10.85.0.48) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Tue, 15 Jun 2021 10:08:49 -0700 From: Georgi Djakov To: , CC: , , , , , , , Subject: [PATCH v6 01/15] iommu/io-pgtable: Introduce unmap_pages() as a page table op Date: Tue, 15 Jun 2021 10:08:19 -0700 Message-ID: <1623776913-390160-2-git-send-email-quic_c_gdjako@quicinc.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1623776913-390160-1-git-send-email-quic_c_gdjako@quicinc.com> References: <1623776913-390160-1-git-send-email-quic_c_gdjako@quicinc.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nasanexm03e.na.qualcomm.com (10.85.0.48) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: "Isaac J. Manjarres" The io-pgtable code expects to operate on a single block or granule of memory that is supported by the IOMMU hardware when unmapping memory. This means that when a large buffer that consists of multiple such blocks is unmapped, the io-pgtable code will walk the page tables to the correct level to unmap each block, even for blocks that are virtually contiguous and at the same level, which can incur an overhead in performance. Introduce the unmap_pages() page table op to express to the io-pgtable code that it should unmap a number of blocks of the same size, instead of a single block. Doing so allows multiple blocks to be unmapped in one call to the io-pgtable code, reducing the number of page table walks, and indirect calls. Signed-off-by: Isaac J. Manjarres Suggested-by: Will Deacon Signed-off-by: Will Deacon Signed-off-by: Georgi Djakov --- include/linux/io-pgtable.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/linux/io-pgtable.h b/include/linux/io-pgtable.h index 4d40dfa75b55..9391c5fa71e6 100644 --- a/include/linux/io-pgtable.h +++ b/include/linux/io-pgtable.h @@ -144,6 +144,7 @@ struct io_pgtable_cfg { * * @map: Map a physically contiguous memory region. * @unmap: Unmap a physically contiguous memory region. + * @unmap_pages: Unmap a range of virtually contiguous pages of the same size. * @iova_to_phys: Translate iova to physical address. * * These functions map directly onto the iommu_ops member functions with @@ -154,6 +155,9 @@ struct io_pgtable_ops { phys_addr_t paddr, size_t size, int prot, gfp_t gfp); size_t (*unmap)(struct io_pgtable_ops *ops, unsigned long iova, size_t size, struct iommu_iotlb_gather *gather); + size_t (*unmap_pages)(struct io_pgtable_ops *ops, unsigned long iova, + size_t pgsize, size_t pgcount, + struct iommu_iotlb_gather *gather); phys_addr_t (*iova_to_phys)(struct io_pgtable_ops *ops, unsigned long iova); };