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=-16.5 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham 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 4C4BFC433E0 for ; Thu, 28 Jan 2021 07:05:06 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id CD1FF64D9D for ; Thu, 28 Jan 2021 07:05:05 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CD1FF64D9D Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=infradead.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 009476B008C; Thu, 28 Jan 2021 02:04:54 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id ED29F6B0092; Thu, 28 Jan 2021 02:04:53 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D76748D0001; Thu, 28 Jan 2021 02:04:53 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0072.hostedemail.com [216.40.44.72]) by kanga.kvack.org (Postfix) with ESMTP id B154A6B008C for ; Thu, 28 Jan 2021 02:04:53 -0500 (EST) Received: from smtpin20.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 85F2F181AEF1F for ; Thu, 28 Jan 2021 07:04:53 +0000 (UTC) X-FDA: 77754296466.20.dime86_1216d552759d Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin20.hostedemail.com (Postfix) with ESMTP id 5B761180C07AB for ; Thu, 28 Jan 2021 07:04:53 +0000 (UTC) X-HE-Tag: dime86_1216d552759d X-Filterd-Recvd-Size: 7971 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf44.hostedemail.com (Postfix) with ESMTP for ; Thu, 28 Jan 2021 07:04:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=Ue2QW2nBJf6tYQn0h/PS1hZXxK2wKXKI+fDwtIvsfek=; b=mYdZAmf//sBINvfpVCtlDwbAgX iG+GiFBF7ozgMmZWOjLlsgKv7/Gj1Roegaok+Hr6qHkzZ5JeqRCNJYdBm6CLZSgvSsMX6qX0iWhhv No8oqzXj5Vi443RXaWztSlxZEb8r2cNuSLew8+/gIqqdamgc37DxMy7d75gx+zjs3ij7RbX1ekCmb g8xcZxu0Jj/H13rm0OwSCmQyXMDJy/HQyii5aA3XK33xk3g8HpaEE1+ndTSxABelVjlmGFSFcwRrP IXYSIyqW38vF5HyccJt2+G2y0uLHoPnS93x+7lcfuYLy5XJmXIRw0Xs+bBQWPy8gIjb4Dd/Fm4LXF IU/EREeQ==; Received: from willy by casper.infradead.org with local (Exim 4.94 #2 (Red Hat Linux)) id 1l51MI-00848b-4M; Thu, 28 Jan 2021 07:04:50 +0000 From: "Matthew Wilcox (Oracle)" To: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org Cc: "Matthew Wilcox (Oracle)" , linux-kernel@vger.kernel.org Subject: [PATCH v3 21/25] mm: Convert lock_page_or_retry to lock_folio_or_retry Date: Thu, 28 Jan 2021 07:04:00 +0000 Message-Id: <20210128070404.1922318-22-willy@infradead.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210128070404.1922318-1-willy@infradead.org> References: <20210128070404.1922318-1-willy@infradead.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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: There's already a hidden compound_head() call in trylock_page(), so just make it explicit in the caller, which may later have a folio for its own reasons. This saves a call to compound_head() inside __lock_page_or_retry(). Signed-off-by: Matthew Wilcox (Oracle) --- include/linux/pagemap.h | 10 +++++----- mm/filemap.c | 16 +++++++--------- mm/memory.c | 10 +++++----- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 546565a7907c..f59af1547e7b 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -621,7 +621,7 @@ static inline bool wake_page_match(struct wait_page_q= ueue *wait_page, void __lock_folio(struct folio *folio); int __lock_folio_killable(struct folio *folio); int __lock_folio_async(struct folio *folio, struct wait_page_queue *wait= ); -extern int __lock_page_or_retry(struct page *page, struct mm_struct *mm, +int __lock_folio_or_retry(struct folio *folio, struct mm_struct *mm, unsigned int flags); void unlock_folio(struct folio *folio); extern void unlock_page_fscache(struct page *page); @@ -703,17 +703,17 @@ static inline int lock_folio_async(struct folio *fo= lio, } =20 /* - * lock_page_or_retry - Lock the page, unless this would block and the + * lock_folio_or_retry - Lock the folio, unless this would block and the * caller indicated that it can handle a retry. * * Return value and mmap_lock implications depend on flags; see - * __lock_page_or_retry(). + * __lock_folio_or_retry(). */ -static inline int lock_page_or_retry(struct page *page, struct mm_struct= *mm, +static inline int lock_folio_or_retry(struct folio *folio, struct mm_str= uct *mm, unsigned int flags) { might_sleep(); - return trylock_page(page) || __lock_page_or_retry(page, mm, flags); + return trylock_folio(folio) || __lock_folio_or_retry(folio, mm, flags); } =20 /* diff --git a/mm/filemap.c b/mm/filemap.c index f68bf0129458..f0a76258de97 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1546,20 +1546,18 @@ int __lock_folio_async(struct folio *folio, struc= t wait_page_queue *wait) =20 /* * Return values: - * 1 - page is locked; mmap_lock is still held. - * 0 - page is not locked. + * 1 - folio is locked; mmap_lock is still held. + * 0 - folio is not locked. * mmap_lock has been released (mmap_read_unlock(), unless flags had= both * FAULT_FLAG_ALLOW_RETRY and FAULT_FLAG_RETRY_NOWAIT set, in * which case mmap_lock is still held. * * If neither ALLOW_RETRY nor KILLABLE are set, will always return 1 - * with the page locked and the mmap_lock unperturbed. + * with the folio locked and the mmap_lock unperturbed. */ -int __lock_page_or_retry(struct page *page, struct mm_struct *mm, +int __lock_folio_or_retry(struct folio *folio, struct mm_struct *mm, unsigned int flags) { - struct folio *folio =3D page_folio(page); - if (fault_flag_allow_retry_first(flags)) { /* * CAUTION! In this case, mmap_lock is not released @@ -1570,9 +1568,9 @@ int __lock_page_or_retry(struct page *page, struct = mm_struct *mm, =20 mmap_read_unlock(mm); if (flags & FAULT_FLAG_KILLABLE) - wait_on_page_locked_killable(page); + wait_on_folio_locked_killable(folio); else - wait_on_page_locked(page); + wait_on_folio_locked(folio); return 0; } if (flags & FAULT_FLAG_KILLABLE) { @@ -2724,7 +2722,7 @@ loff_t mapping_seek_hole_data(struct address_space = *mapping, loff_t start, * @page - the page to lock. * @fpin - the pointer to the file we may pin (or is already pinned). * - * This works similar to lock_page_or_retry in that it can drop the mmap= _lock. + * This works similar to lock_folio_or_retry in that it can drop the mma= p_lock. * It differs in that it actually returns the page locked if it returns = 1 and 0 * if it couldn't lock the page. If we did have to drop the mmap_lock t= hen fpin * will point to the pinned file and needs to be fput()'ed at a later po= int. diff --git a/mm/memory.c b/mm/memory.c index 06992770f23e..bb15abef559b 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3352,7 +3352,7 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) goto out_release; } =20 - locked =3D lock_page_or_retry(page, vma->vm_mm, vmf->flags); + locked =3D lock_folio_or_retry(page_folio(page), vma->vm_mm, vmf->flags= ); =20 delayacct_clear_flag(DELAYACCT_PF_SWAPIN); if (!locked) { @@ -4104,7 +4104,7 @@ static vm_fault_t do_shared_fault(struct vm_fault *= vmf) * We enter with non-exclusive mmap_lock (to exclude vma changes, * but allow concurrent faults). * The mmap_lock may have been released depending on flags and our - * return value. See filemap_fault() and __lock_page_or_retry(). + * return value. See filemap_fault() and __lock_folio_or_retry(). * If mmap_lock is released, vma may become invalid (for example * by other thread calling munmap()). */ @@ -4338,7 +4338,7 @@ static vm_fault_t wp_huge_pud(struct vm_fault *vmf,= pud_t orig_pud) * concurrent faults). * * The mmap_lock may have been released depending on flags and our retur= n value. - * See filemap_fault() and __lock_page_or_retry(). + * See filemap_fault() and __lock_folio_or_retry(). */ static vm_fault_t handle_pte_fault(struct vm_fault *vmf) { @@ -4431,7 +4431,7 @@ static vm_fault_t handle_pte_fault(struct vm_fault = *vmf) * By the time we get here, we already hold the mm semaphore * * The mmap_lock may have been released depending on flags and our - * return value. See filemap_fault() and __lock_page_or_retry(). + * return value. See filemap_fault() and __lock_folio_or_retry(). */ static vm_fault_t __handle_mm_fault(struct vm_area_struct *vma, unsigned long address, unsigned int flags) @@ -4587,7 +4587,7 @@ static inline void mm_account_fault(struct pt_regs = *regs, * By the time we get here, we already hold the mm semaphore * * The mmap_lock may have been released depending on flags and our - * return value. See filemap_fault() and __lock_page_or_retry(). + * return value. See filemap_fault() and __lock_folio_or_retry(). */ vm_fault_t handle_mm_fault(struct vm_area_struct *vma, unsigned long add= ress, unsigned int flags, struct pt_regs *regs) --=20 2.29.2