From patchwork Thu Apr 11 06:59:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vivek Kasireddy X-Patchwork-Id: 13625509 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 385BACD129C for ; Thu, 11 Apr 2024 07:26:28 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 93CD76B0087; Thu, 11 Apr 2024 03:26:25 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9141A6B0088; Thu, 11 Apr 2024 03:26:25 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 766056B008A; Thu, 11 Apr 2024 03:26:25 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 534E06B0087 for ; Thu, 11 Apr 2024 03:26:25 -0400 (EDT) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 20E7E140A9E for ; Thu, 11 Apr 2024 07:26:25 +0000 (UTC) X-FDA: 81996417930.23.B8C7C0D Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.18]) by imf14.hostedemail.com (Postfix) with ESMTP id 0BA1E100003 for ; Thu, 11 Apr 2024 07:26:22 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=ZW2kvnew; spf=pass (imf14.hostedemail.com: domain of vivek.kasireddy@intel.com designates 192.198.163.18 as permitted sender) smtp.mailfrom=vivek.kasireddy@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1712820383; a=rsa-sha256; cv=none; b=w1W4ExngIuh5RdsT4hbz7X0luiTrAHVmlGNfNm41qEXPOBvR2kryZ+3kFhyBvzNUMZlvpM ynYEkKIMGqpjwsFSsGnNFBpPsELVXCjWsRAtiLlGjGNajn9sghvKcM9CTHdZ+wpnDDXMD2 TLCg+Uh65notCU7CNy5uAsIUEimN6FY= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=ZW2kvnew; spf=pass (imf14.hostedemail.com: domain of vivek.kasireddy@intel.com designates 192.198.163.18 as permitted sender) smtp.mailfrom=vivek.kasireddy@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1712820383; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=FqinJm5E4FoubuFAIPxp3KAeU2kYZz+fjdR1LgnUvX0=; b=F2vHESOG7+FpWKURf61dSUVPkerdu5gu15J2W/JqEQKwQEaZMr3/u8ylcEB+nEWjg9hE6g ZdmHsPIdCVHyQrEWVUzjYgC+k13GJptQ8LOe5bbstPpow06xGp/ozWdfX5DA3yja+eJlXh MkNwY2wFcOF6PTtFxGr3hyYkLh74GzI= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1712820383; x=1744356383; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=bISZgHGBceajd5sS0GG6xpyZAR2HBITRWLbAKVvkKH4=; b=ZW2kvnewgFZCl6bofPIWd9THMac+1onwXq6KYJk1p6sLqg17wsK+QulU D+4p6OuNRFk5bGvbsjkVI8QoZD15c6kHmjW4UrP4VlQLVohPSr3BRAgPP qGcTmmZJksv8YgXAp/OVLPL1VjqbRT1OdrQg3OYjexGZQqwUmtN2/uns7 SdUH+jf0vZ/7Y8WB/qwj0d3TPWaPKYNknLUGg2Pn4PT2Lh1LSmg6hp6by sEdQUG8s+V92tM87DuuyPMgSV1wQpUe2mJUtNv84QeheHAqr+e1vV8NRh 0staBXD6e8XQBg1uDys4dyPCd9FaN2ojyK9hP9aH1iq1qbN5M24XDszE4 Q==; X-CSE-ConnectionGUID: pGpTLG16Tyaod7kpgQpQ4Q== X-CSE-MsgGUID: rdkF6hQ2ToyU8pWgvUARgg== X-IronPort-AV: E=McAfee;i="6600,9927,11039"; a="8074350" X-IronPort-AV: E=Sophos;i="6.07,192,1708416000"; d="scan'208";a="8074350" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by fmvoesa112.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Apr 2024 00:26:03 -0700 X-CSE-ConnectionGUID: 2RFC9XLqS6eYHtN2ypTweA== X-CSE-MsgGUID: xUymOPFkT16f2zWGvUfKbA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,192,1708416000"; d="scan'208";a="20848535" Received: from vkasired-desk2.fm.intel.com ([10.105.128.132]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Apr 2024 00:26:03 -0700 From: Vivek Kasireddy To: dri-devel@lists.freedesktop.org, linux-mm@kvack.org Cc: Vivek Kasireddy , David Hildenbrand , Matthew Wilcox , Christoph Hellwig , Jason Gunthorpe , Peter Xu Subject: [PATCH v14 1/8] mm/gup: Introduce unpin_folio/unpin_folios helpers Date: Wed, 10 Apr 2024 23:59:37 -0700 Message-ID: <20240411070157.3318425-2-vivek.kasireddy@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240411070157.3318425-1-vivek.kasireddy@intel.com> References: <20240411070157.3318425-1-vivek.kasireddy@intel.com> MIME-Version: 1.0 X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 0BA1E100003 X-Stat-Signature: ktdsag45p3wup3wjgkbxq3c8fcsahoys X-Rspam-User: X-HE-Tag: 1712820382-189143 X-HE-Meta: U2FsdGVkX18dDoZkWq5RzXSzKBHjLVSwuBYVeakeoNhtFzWZzYHSYEInqks2r+7wnmqQyo+1Pa+P1/XbGlHmmzjzgtjhUBGOo/E31UfVEmfnyZEcNsUFPr4VPGWFkeAthmN09nSPPHKLXNeH0XRn2Q81AsoZSWZHyfMv2VS8oqpuPI8YJOLsd6lXHxpHIKQAj5DO6lcKXv7j7+HXXld9MeNDZBpiLRoXdlTkW2bcJ/FFFvvuW6DHBMnFTVfOOzJaAHfucSndrh8JSP+ElgnzFEd4Hk7vudds8YcxDPVBrd/OZxPPJ3E+C9x+qh57PBOrf42OxzQeN2FNZfz4Hyh4CkidSM0yUuxwaEKn/oWv3BYuc8GE+bhr4c2v497N16PqvQizXDdhj1TOPFnAO+fKX+Wbig+c5eUJqPTpN+ka/ciXNpzdVRoMFnGzVE8cRohTcKCTmMp3qNob55ZGnP0XEpM0zP2v7/566rgXFhvli16/izGpChuaZfrcnDrMBVbVpT/Ur7F28S+EspMGCjibqYjCAsJScLlwwUVdKfEXH4NAkbHslGde5mLyWXZOVChRha1gpj6Ie84Odq7uNg+yCUNxlz+jMvfS3IPWGeuu040vB/AxiYf4jyIWvZRil/FmpRIbM7R8JBOt6lnSZzwbgdNqQ2EkoyBV/BSTokZQESqfcNfj3FdsUcjyd7dABlVEOfHCqb3NF1ZrsN2q3i/fiDw6YlFE6/gYLG7b9yozFpYkrpHcTcaPhHZvlToYIi6/0uKVlI0+5mnd1Z6UdrHzjjn59M8eJu4QC1CyQkirfHCuneskJVgSE8tOR32Ish5sYRS2iGC7v/uOIA4dF8BY5SK2vV2b5mJZ19BhobrcM32iqItgXD1ceX1uJJw+3qghYivkfCnrhJAEJ07dHQqjEc7Auk/XXAhvoYVvCpuOJtsQ1RpivPMJV6yT2npy2XVWCTOfXVanJFqQgiYOWOx G2RtAezS mk44VHl+faOSgotKoeMj3FTQn0P2VUp1Sy4xL4GrGo+mVq6kVCNikaxWZ/jBAFqKVtkOjuTgdZvqKNY3lbwhXNZtd1DMHIThhl7tXcPIDNC3jn0FKuOsfjavag7XRPIVmJeT8Dtlp82TMoknLd1rtyZsPk6nUBtTpakGdJN6hr8qMlDO1zDoIXTE1/sJ/vRf3vrUWyhKnwABLb1MyifP99l8zcsa3Fbn+GIoz5er9fjeEmPFv2EscsFy1+dvzeTDtPvRawgdP5UCDMaiAO0mQb904dRjFzmftvucPAraMa1a1fjhYkWt+yURWoQ== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: These helpers are the folio versions of unpin_user_page/unpin_user_pages. They are currently only useful for unpinning folios pinned by memfd_pin_folios() or other associated routines. However, they could find new uses in the future, when more and more folio-only helpers are added to GUP. We should probably sanity check the folio as part of unpin similar to how it is done in unpin_user_page/unpin_user_pages but we cannot cleanly do that at the moment without also checking the subpage. Therefore, sanity checking needs to be added to these routines once we have a way to determine if any given folio is anon-exclusive (via a per folio AnonExclusive flag). Cc: David Hildenbrand Cc: Matthew Wilcox Cc: Christoph Hellwig Cc: Jason Gunthorpe Cc: Peter Xu Suggested-by: David Hildenbrand Reviewed-by: David Hildenbrand Signed-off-by: Vivek Kasireddy --- include/linux/mm.h | 2 ++ mm/gup.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/include/linux/mm.h b/include/linux/mm.h index ef34cf54c14f..d1ebd7a25105 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1612,11 +1612,13 @@ static inline void put_page(struct page *page) #define GUP_PIN_COUNTING_BIAS (1U << 10) void unpin_user_page(struct page *page); +void unpin_folio(struct folio *folio); void unpin_user_pages_dirty_lock(struct page **pages, unsigned long npages, bool make_dirty); void unpin_user_page_range_dirty_lock(struct page *page, unsigned long npages, bool make_dirty); void unpin_user_pages(struct page **pages, unsigned long npages); +void unpin_folios(struct folio **folios, unsigned long nfolios); static inline bool is_cow_mapping(vm_flags_t flags) { diff --git a/mm/gup.c b/mm/gup.c index 8dcbeae714e2..14e94fdfa827 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -276,6 +276,19 @@ void unpin_user_page(struct page *page) } EXPORT_SYMBOL(unpin_user_page); +/** + * unpin_folio() - release a dma-pinned folio + * @folio: pointer to folio to be released + * + * Folios that were pinned via memfd_pin_folios() or other similar routines + * must be released either using unpin_folio() or unpin_folios(). + */ +void unpin_folio(struct folio *folio) +{ + gup_put_folio(folio, 1, FOLL_PIN); +} +EXPORT_SYMBOL_GPL(unpin_folio); + /** * folio_add_pin - Try to get an additional pin on a pinned folio * @folio: The folio to be pinned @@ -488,6 +501,40 @@ void unpin_user_pages(struct page **pages, unsigned long npages) } EXPORT_SYMBOL(unpin_user_pages); +/** + * unpin_folios() - release an array of gup-pinned folios. + * @folios: array of folios to be marked dirty and released. + * @nfolios: number of folios in the @folios array. + * + * For each folio in the @folios array, release the folio using gup_put_folio. + * + * Please see the unpin_folio() documentation for details. + */ +void unpin_folios(struct folio **folios, unsigned long nfolios) +{ + unsigned long i = 0, j; + + /* + * If this WARN_ON() fires, then the system *might* be leaking folios + * (by leaving them pinned), but probably not. More likely, gup/pup + * returned a hard -ERRNO error to the caller, who erroneously passed + * it here. + */ + if (WARN_ON(IS_ERR_VALUE(nfolios))) + return; + + while (i < nfolios) { + for (j = i + 1; j < nfolios; j++) + if (folios[i] != folios[j]) + break; + + if (folios[i]) + gup_put_folio(folios[i], j - i, FOLL_PIN); + i = j; + } +} +EXPORT_SYMBOL_GPL(unpin_folios); + /* * Set the MMF_HAS_PINNED if not set yet; after set it'll be there for the mm's * lifecycle. Avoid setting the bit unless necessary, or it might cause write