From patchwork Wed Dec 8 04:22:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wilcox X-Patchwork-Id: 12663707 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 3E963C433F5 for ; Wed, 8 Dec 2021 06:23:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8D8FC6B0074; Wed, 8 Dec 2021 01:19:18 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 861BA6B0083; Wed, 8 Dec 2021 01:19:18 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 729146B0085; Wed, 8 Dec 2021 01:19:18 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (relay033.a.hostedemail.com [64.99.140.33]) by kanga.kvack.org (Postfix) with ESMTP id 63D2D6B0074 for ; Wed, 8 Dec 2021 01:19:18 -0500 (EST) Received: by unirelay08.hostedemail.com (Postfix, from userid 108) id 8CD7320454; Wed, 8 Dec 2021 06:17:34 +0000 (UTC) Received: by unirelay08.hostedemail.com (Postfix, from userid 108) id 535FC20657; Wed, 8 Dec 2021 05:33:41 +0000 (UTC) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 94FE92099C for ; Wed, 8 Dec 2021 04:29:12 +0000 (UTC) X-FDA: 78893347302.15.69B0FCB Received: from relay.hostedemail.com (relay025.a.hostedemail.com [64.99.140.25]) by imf31.hostedemail.com (Postfix) with ESMTP id 36DDD1046300 for ; Wed, 8 Dec 2021 04:29:12 +0000 (UTC) Received: from smtpin18.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 12F9F21399 for ; Wed, 8 Dec 2021 04:23:14 +0000 (UTC) X-FDA: 78893332308.18.767FDD7 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf10.hostedemail.com (Postfix) with ESMTP id BB48F600198A for ; Wed, 8 Dec 2021 04:23:11 +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=XdgFvvcU0VY2BBoR+sckcbNFdIGXaT2EcoM1SoJJkrY=; b=XUM0qSdXd+arG+Gbf5tXz5RcLI uTsXxfSG0ZXk3kWT0GKNdL6llEhBpsiirmxwqZYaB9NjH0yzaLxegDy0DjjBKL9nbDGKV7muJ4fMq VD735KMHN+1bNXdxntF+LkWEBtCxI/lnVX78sp+1b4/8ZF20ajf66yMrjsokMgIThxgL8ZkXdm6RV BYKDBDGraSbUO2YVz0f3nCatfiRMj4T1h0mJ0ttsw/inYwtpHNhmw2HMCapihtuqRQHfPOqai0CCo tMKljSFTdQ0TjngQrc39JrlrNtaQ8x5zTh2hLrWZj6DLpBd4bnSmpfS96cl1+tmcT8yVrEvSkA23N Sh8voY+A==; Received: from willy by casper.infradead.org with local (Exim 4.94.2 #2 (Red Hat Linux)) id 1muoU1-0084Wt-UN; Wed, 08 Dec 2021 04:23:09 +0000 From: "Matthew Wilcox (Oracle)" To: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org Cc: "Matthew Wilcox (Oracle)" Subject: [PATCH 05/48] pagevec: Add folio_batch Date: Wed, 8 Dec 2021 04:22:13 +0000 Message-Id: <20211208042256.1923824-6-willy@infradead.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211208042256.1923824-1-willy@infradead.org> References: <20211208042256.1923824-1-willy@infradead.org> MIME-Version: 1.0 X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 36DDD1046300 X-Stat-Signature: fnrgbkozrttzzebk395mswtzeecrk6ki X-HE-Tag-Orig: 1638937391-250391 Authentication-Results: imf31.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=XUM0qSdX; dmarc=none; spf=none (imf31.hostedemail.com: domain of FILTER%willy@infradead.org has no SPF policy when checking 64.99.140.25) smtp.mailfrom=FILTER%willy@infradead.org X-HE-Tag: 1638937752-371728 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: The folio_batch is the same as the pagevec, except that it is typed to contain folios and not pages. Signed-off-by: Matthew Wilcox (Oracle) --- include/linux/pagevec.h | 63 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/include/linux/pagevec.h b/include/linux/pagevec.h index 7f3f19065a9f..4483e6ad7607 100644 --- a/include/linux/pagevec.h +++ b/include/linux/pagevec.h @@ -15,6 +15,7 @@ #define PAGEVEC_SIZE 15 struct page; +struct folio; struct address_space; struct pagevec { @@ -81,4 +82,66 @@ static inline void pagevec_release(struct pagevec *pvec) __pagevec_release(pvec); } +/** + * struct folio_batch - A collection of folios. + * + * The folio_batch is used to amortise the cost of retrieving and + * operating on a set of folios. The order of folios in the batch is + * not considered important. Some users of the folio_batch store + * "exceptional" entries in it which can be removed by calling + * folio_batch_remove_exceptionals(). + */ +struct folio_batch { + unsigned char nr; + unsigned char aux[3]; + struct folio *folios[PAGEVEC_SIZE]; +}; + +/** + * folio_batch_init() - Initialise a batch of folios + * @fbatch: The folio batch. + * + * A freshly initialised folio_batch contains zero folios. + */ +static inline void folio_batch_init(struct folio_batch *fbatch) +{ + fbatch->nr = 0; +} + +static inline unsigned int folio_batch_count(struct folio_batch *fbatch) +{ + return fbatch->nr; +} + +static inline unsigned int fbatch_space(struct folio_batch *fbatch) +{ + return PAGEVEC_SIZE - fbatch->nr; +} + +/** + * folio_batch_add() - Add a folio to a batch. + * @fbatch: The folio batch. + * @folio: The folio to add. + * + * The folio is added to the end of the batch. + * The batch must have previously been initialised using folio_batch_init(). + * + * Return: The number of slots still available. + */ +static inline unsigned folio_batch_add(struct folio_batch *fbatch, + struct folio *folio) +{ + fbatch->folios[fbatch->nr++] = folio; + return fbatch_space(fbatch); +} + +static inline void folio_batch_release(struct folio_batch *fbatch) +{ + pagevec_release((struct pagevec *)fbatch); +} + +static inline void folio_batch_remove_exceptionals(struct folio_batch *fbatch) +{ + pagevec_remove_exceptionals((struct pagevec *)fbatch); +} #endif /* _LINUX_PAGEVEC_H */