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=-8.5 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING, 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 03B04C11D02 for ; Wed, 19 Feb 2020 21:02:00 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id AB8AD2467B for ; Wed, 19 Feb 2020 21:01:59 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="NH0OEeIj" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AB8AD2467B 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 846E06B0078; Wed, 19 Feb 2020 16:01:19 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 7D58B6B007D; Wed, 19 Feb 2020 16:01:19 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5D95F6B007B; Wed, 19 Feb 2020 16:01:19 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0197.hostedemail.com [216.40.44.197]) by kanga.kvack.org (Postfix) with ESMTP id 1692E6B007D for ; Wed, 19 Feb 2020 16:01:19 -0500 (EST) Received: from smtpin14.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id CCB8A8248047 for ; Wed, 19 Feb 2020 21:01:18 +0000 (UTC) X-FDA: 76508097036.14.force15_b645b294b149 X-HE-Tag: force15_b645b294b149 X-Filterd-Recvd-Size: 9006 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by imf31.hostedemail.com (Postfix) with ESMTP for ; Wed, 19 Feb 2020 21:01:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type: Content-ID:Content-Description:In-Reply-To:References; bh=mN1TXHIJ2YmFawAwPNgMtOVjH3Gos9ETpCez8ZRXliM=; b=NH0OEeIjWkomD7bNdSVYySBydU 5sGtN/ZWO7Y1qVJxbwas7NxGJlFkXbqTdcRcuwG4HUHZYKDXIXMWelr4nHtSjW2iefopvGZzfjodF TP9N4CWdk/UsJNSNsi8NC0szV2MIxC/rXTaawzSzJBw9VA+/xFrvg4UHk15NcZGLrwn8PCL2PhvSp TQMFPbVsmeh1fH28xT1LXMoIDMm2Y7iQ20fWRhPKQEDfS04yb13/ePniHc8pv/rjdwad6ui3RF3CC z6cVTIhB1ggQwuntb/ZdGL3fRKjew4D5NAFtxNXVdWv7UY3PfJWye0D5uyW9C5/ima5snW3PhnDZZ IiEtu+hg==; Received: from willy by bombadil.infradead.org with local (Exim 4.92.3 #3 (Red Hat Linux)) id 1j4WSu-0008TD-Nx; Wed, 19 Feb 2020 21:01:04 +0000 From: Matthew Wilcox To: linux-fsdevel@vger.kernel.org Cc: "Matthew Wilcox (Oracle)" , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-erofs@lists.ozlabs.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, cluster-devel@redhat.com, ocfs2-devel@oss.oracle.com, linux-xfs@vger.kernel.org Subject: [PATCH v7 00/23] Change readahead API Date: Wed, 19 Feb 2020 13:00:39 -0800 Message-Id: <20200219210103.32400-1-willy@infradead.org> X-Mailer: git-send-email 2.21.1 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: From: "Matthew Wilcox (Oracle)" This series adds a readahead address_space operation to eventually replace the readpages operation. The key difference is that pages are added to the page cache as they are allocated (and then looked up by the filesystem) instead of passing them on a list to the readpages operation and having the filesystem add them to the page cache. It's a net reduction in code for each implementation, more efficient than walking a list, and solves the direct-write vs buffered-read problem reported by yu kuai at https://lore.kernel.org/linux-fsdevel/20200116063601.39201-1-yukuai3@huaw= ei.com/ The only unconverted filesystems are those which use fscache. Their conversion is pending Dave Howells' rewrite which will make the conversion substantially easier. I want to thank the reviewers; Dave Chinner, John Hubbard and Christoph Hellwig have done a marvellous job of providing constructive criticism. Eric Biggers pointed out how I'd broken ext4 (which led to a substantial change). I've tried to take it all on board, but I may have missed something simply because you've done such a thorough job. This series can also be found at http://git.infradead.org/users/willy/linux-dax.git/shortlog/refs/tags/rea= dahead_v7 (I also pushed the readahead_v6 tag there in case anyone wants to diff, a= nd they're both based on 5.6-rc2 so they're easy to diff) v7: - Now passes an xfstests run on ext4! - Documentation improvements - Move the readahead prototypes out of mm.h (new patch) - readahead_for_each* iterators are gone; replaced with readahead_page() and readahead_page_batch() - page_cache_readahead_limit() renamed to page_cache_readahead_unbounded= () and arguments changed - iomap_readahead_actor() restructured differently - The readahead code no longer uses the word 'offset' to reduce ambiguit= y - read_pages() now maintains the rac so we can just call it and continue instead of mucking around with branches - More assertions - More readahead functions return void v6: - Name the private members of readahead_control with a leading underscor= e (suggested by Christoph Hellwig) - Fix whitespace in rst file - Remove misleading comment in btrfs patch - Add readahead_next() API and use it in iomap - Add iomap_readahead kerneldoc. - Fix the mpage_readahead kerneldoc - Make various readahead functions return void - Keep readahead_index() and readahead_offset() pointing to the start of this batch through the body. No current user requires this, but it's less surprising. - Add kerneldoc for page_cache_readahead_limit - Make page_idx an unsigned long, and rename it to just 'i' - Get rid of page_offset local variable - Add patch to call memalloc_nofs_save() before allocating pages (sugges= ted by Michal Hocko) - Resplit a lot of patches for more logical progression and easier revie= w (suggested by John Hubbard) - Added sign-offs where received, and I deemed still relevant v5 switched to passing a readahead_control struct (mirroring the writepages_control struct passed to writepages). This has a number of advantages: - It fixes a number of bugs in various implementations, eg forgetting to increment 'start', an off-by-one error in 'nr_pages' or treating 'star= t' as a byte offset instead of a page offset. - It allows us to change the arguments without changing all the implementations of ->readahead which just call mpage_readahead() or iomap_readahead() - Figuring out which pages haven't been attempted by the implementation is more natural this way. - There's less code in each implementation. Matthew Wilcox (Oracle) (24): mm: Move readahead prototypes from mm.h mm: Return void from various readahead functions mm: Ignore return value of ->readpages mm: Move readahead nr_pages check into read_pages mm: Use readahead_control to pass arguments mm: Rename various 'offset' parameters to 'index' mm: rename readahead loop variable to 'i' mm: Remove 'page_offset' from readahead loop mm: Put readahead pages in cache earlier mm: Add readahead address space operation mm: Move end_index check out of readahead loop mm: Add page_cache_readahead_unbounded fs: Convert mpage_readpages to mpage_readahead btrfs: Convert from readpages to readahead erofs: Convert uncompressed files from readpages to readahead erofs: Convert compressed files from readpages to readahead ext4: Convert from readpages to readahead ext4: Pass the inode to ext4_mpage_readpages f2fs: Convert from readpages to readahead fuse: Convert from readpages to readahead iomap: Restructure iomap_readpages_actor iomap: Convert from readpages to readahead mm: Document why we don't set PageReadahead mm: Use memalloc_nofs_save in readahead path Documentation/filesystems/locking.rst | 6 +- Documentation/filesystems/vfs.rst | 15 ++ block/blk-core.c | 1 + drivers/staging/exfat/exfat_super.c | 7 +- fs/block_dev.c | 7 +- fs/btrfs/extent_io.c | 46 ++--- fs/btrfs/extent_io.h | 3 +- fs/btrfs/inode.c | 16 +- fs/erofs/data.c | 39 ++-- fs/erofs/zdata.c | 29 +-- fs/ext2/inode.c | 10 +- fs/ext4/ext4.h | 5 +- fs/ext4/inode.c | 21 +- fs/ext4/readpage.c | 25 +-- fs/ext4/verity.c | 35 +--- fs/f2fs/data.c | 50 ++--- fs/f2fs/f2fs.h | 5 +- fs/f2fs/verity.c | 35 +--- fs/fat/inode.c | 7 +- fs/fuse/file.c | 46 ++--- fs/gfs2/aops.c | 23 +-- fs/hpfs/file.c | 7 +- fs/iomap/buffered-io.c | 124 +++++------- fs/iomap/trace.h | 2 +- fs/isofs/inode.c | 7 +- fs/jfs/inode.c | 7 +- fs/mpage.c | 38 +--- fs/nilfs2/inode.c | 15 +- fs/ocfs2/aops.c | 34 ++-- fs/omfs/file.c | 7 +- fs/qnx6/inode.c | 7 +- fs/reiserfs/inode.c | 8 +- fs/udf/inode.c | 7 +- fs/xfs/xfs_aops.c | 13 +- fs/zonefs/super.c | 7 +- include/linux/fs.h | 2 + include/linux/iomap.h | 3 +- include/linux/mm.h | 19 -- include/linux/mpage.h | 4 +- include/linux/pagemap.h | 103 ++++++++++ include/trace/events/erofs.h | 6 +- include/trace/events/f2fs.h | 6 +- mm/fadvise.c | 6 +- mm/internal.h | 12 +- mm/migrate.c | 2 +- mm/readahead.c | 277 ++++++++++++++++---------- 46 files changed, 551 insertions(+), 603 deletions(-) base-commit: 11a48a5a18c63fd7621bb050228cebf13566e4d8 --=20 2.25.0