From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> To: "Theodore Ts'o" <tytso@mit.edu>, Andreas Dilger <adilger.kernel@dilger.ca>, Jan Kara <jack@suse.com>, Andrew Morton <akpm@linux-foundation.org> Cc: Alexander Viro <viro@zeniv.linux.org.uk>, Hugh Dickins <hughd@google.com>, Andrea Arcangeli <aarcange@redhat.com>, Dave Hansen <dave.hansen@intel.com>, Vlastimil Babka <vbabka@suse.cz>, Matthew Wilcox <willy@infradead.org>, Ross Zwisler <ross.zwisler@linux.intel.com>, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> Subject: [PATCHv4 32/43] ext4: make ext4_writepage() work on huge pages Date: Tue, 25 Oct 2016 03:13:31 +0300 [thread overview] Message-ID: <20161025001342.76126-33-kirill.shutemov@linux.intel.com> (raw) In-Reply-To: <20161025001342.76126-1-kirill.shutemov@linux.intel.com> Change ext4_writepage() and underlying ext4_bio_write_page(). It basically removes assumption on page size, infer it from struct page instead. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> --- fs/ext4/inode.c | 10 +++++----- fs/ext4/page-io.c | 11 +++++++++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 9c064727ed62..c36296fbaa23 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -2030,10 +2030,10 @@ static int ext4_writepage(struct page *page, trace_ext4_writepage(page); size = i_size_read(inode); - if (page->index == size >> PAGE_SHIFT) - len = size & ~PAGE_MASK; - else - len = PAGE_SIZE; + + len = hpage_size(page); + if (page->index + hpage_nr_pages(page) - 1 == size >> PAGE_SHIFT) + len = size & ~hpage_mask(page); page_bufs = page_buffers(page); /* @@ -2057,7 +2057,7 @@ static int ext4_writepage(struct page *page, ext4_bh_delay_or_unwritten)) { redirty_page_for_writepage(wbc, page); if ((current->flags & PF_MEMALLOC) || - (inode->i_sb->s_blocksize == PAGE_SIZE)) { + (inode->i_sb->s_blocksize == hpage_size(page))) { /* * For memory cleaning there's no point in writing only * some buffers. So just bail out. Warn if we came here diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index 0094923e5ebf..20c9635a782e 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -413,6 +413,7 @@ int ext4_bio_write_page(struct ext4_io_submit *io, BUG_ON(!PageLocked(page)); BUG_ON(PageWriteback(page)); + BUG_ON(PageTail(page)); if (keep_towrite) set_page_writeback_keepwrite(page); @@ -429,8 +430,14 @@ int ext4_bio_write_page(struct ext4_io_submit *io, * the page size, the remaining memory is zeroed when mapped, and * writes to that region are not written out to the file." */ - if (len < PAGE_SIZE) - zero_user_segment(page, len, PAGE_SIZE); + if (len < hpage_size(page)) { + page += len / PAGE_SIZE; + if (len % PAGE_SIZE) + zero_user_segment(page, len % PAGE_SIZE, PAGE_SIZE); + while (page + 1 == compound_head(page)) + clear_highpage(++page); + page = compound_head(page); + } /* * In the first loop we prepare and mark buffers to submit. We have to * mark all buffers in the page before submitting so that -- 2.9.3
WARNING: multiple messages have this Message-ID (diff)
From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> To: "Theodore Ts'o" <tytso@mit.edu>, Andreas Dilger <adilger.kernel@dilger.ca>, Jan Kara <jack@suse.com>, Andrew Morton <akpm@linux-foundation.org> Cc: Alexander Viro <viro@zeniv.linux.org.uk>, Hugh Dickins <hughd@google.com>, Andrea Arcangeli <aarcange@redhat.com>, Dave Hansen <dave.hansen@intel.com>, Vlastimil Babka <vbabka@suse.cz>, Matthew Wilcox <willy@infradead.org>, Ross Zwisler <ross.zwisler@linux.intel.com>, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> Subject: [PATCHv4 32/43] ext4: make ext4_writepage() work on huge pages Date: Tue, 25 Oct 2016 03:13:31 +0300 [thread overview] Message-ID: <20161025001342.76126-33-kirill.shutemov@linux.intel.com> (raw) In-Reply-To: <20161025001342.76126-1-kirill.shutemov@linux.intel.com> Change ext4_writepage() and underlying ext4_bio_write_page(). It basically removes assumption on page size, infer it from struct page instead. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> --- fs/ext4/inode.c | 10 +++++----- fs/ext4/page-io.c | 11 +++++++++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 9c064727ed62..c36296fbaa23 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -2030,10 +2030,10 @@ static int ext4_writepage(struct page *page, trace_ext4_writepage(page); size = i_size_read(inode); - if (page->index == size >> PAGE_SHIFT) - len = size & ~PAGE_MASK; - else - len = PAGE_SIZE; + + len = hpage_size(page); + if (page->index + hpage_nr_pages(page) - 1 == size >> PAGE_SHIFT) + len = size & ~hpage_mask(page); page_bufs = page_buffers(page); /* @@ -2057,7 +2057,7 @@ static int ext4_writepage(struct page *page, ext4_bh_delay_or_unwritten)) { redirty_page_for_writepage(wbc, page); if ((current->flags & PF_MEMALLOC) || - (inode->i_sb->s_blocksize == PAGE_SIZE)) { + (inode->i_sb->s_blocksize == hpage_size(page))) { /* * For memory cleaning there's no point in writing only * some buffers. So just bail out. Warn if we came here diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index 0094923e5ebf..20c9635a782e 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -413,6 +413,7 @@ int ext4_bio_write_page(struct ext4_io_submit *io, BUG_ON(!PageLocked(page)); BUG_ON(PageWriteback(page)); + BUG_ON(PageTail(page)); if (keep_towrite) set_page_writeback_keepwrite(page); @@ -429,8 +430,14 @@ int ext4_bio_write_page(struct ext4_io_submit *io, * the page size, the remaining memory is zeroed when mapped, and * writes to that region are not written out to the file." */ - if (len < PAGE_SIZE) - zero_user_segment(page, len, PAGE_SIZE); + if (len < hpage_size(page)) { + page += len / PAGE_SIZE; + if (len % PAGE_SIZE) + zero_user_segment(page, len % PAGE_SIZE, PAGE_SIZE); + while (page + 1 == compound_head(page)) + clear_highpage(++page); + page = compound_head(page); + } /* * In the first loop we prepare and mark buffers to submit. We have to * mark all buffers in the page before submitting so that -- 2.9.3 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2016-10-25 0:13 UTC|newest] Thread overview: 104+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-10-25 0:12 [PATCHv4 00/43] ext4: support of huge pages Kirill A. Shutemov 2016-10-25 0:12 ` Kirill A. Shutemov 2016-10-25 0:12 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 01/43] tools: Add WARN_ON_ONCE Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 02/43] radix tree test suite: Allow GFP_ATOMIC allocations to fail Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 03/43] radix-tree: Add radix_tree_join Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 04/43] radix-tree: Add radix_tree_split Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 05/43] radix-tree: Add radix_tree_split_preload() Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 06/43] mm, shmem: swich huge tmpfs to multi-order radix-tree entries Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 07/43] Revert "radix-tree: implement radix_tree_maybe_preload_order()" Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 08/43] page-flags: relax page flag policy for few flags Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 09/43] mm, rmap: account file thp pages Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 10/43] thp: try to free page's buffers before attempt split Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 11/43] thp: handle write-protection faults for file THP Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 12/43] truncate: make sure invalidate_mapping_pages() can discard huge pages Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 13/43] filemap: allocate huge page in page_cache_read(), if allowed Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 14/43] filemap: handle huge pages in do_generic_file_read() Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 15/43] filemap: allocate huge page in pagecache_get_page(), if allowed Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 16/43] filemap: handle huge pages in filemap_fdatawait_range() Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 17/43] HACK: readahead: alloc huge pages, if allowed Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 18/43] block: define BIO_MAX_PAGES to HPAGE_PMD_NR if huge page cache enabled Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 7:21 ` Christoph Hellwig 2016-10-25 7:21 ` Christoph Hellwig 2016-10-25 12:54 ` Kirill A. Shutemov 2016-10-25 12:54 ` Kirill A. Shutemov 2016-10-26 4:13 ` Andreas Dilger 2016-10-26 7:30 ` Ming Lei 2016-10-26 7:30 ` Ming Lei 2016-10-26 7:30 ` Ming Lei 2016-10-26 7:36 ` Christoph Hellwig 2016-10-26 7:36 ` Christoph Hellwig 2016-10-26 7:36 ` Christoph Hellwig 2016-10-26 7:36 ` Christoph Hellwig 2016-10-26 7:36 ` Christoph Hellwig 2016-10-26 7:35 ` Christoph Hellwig 2016-10-26 7:35 ` Christoph Hellwig 2016-10-25 0:13 ` [PATCHv4 19/43] brd: make it handle huge pages Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 20/43] mm: make write_cache_pages() work on " Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 21/43] thp: introduce hpage_size() and hpage_mask() Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 22/43] thp: do not threat slab pages as huge in hpage_{nr_pages,size,mask} Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 23/43] thp: make thp_get_unmapped_area() respect S_HUGE_MODE Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 24/43] fs: make block_read_full_page() be able to read huge page Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 25/43] fs: make block_write_{begin,end}() be able to handle huge pages Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 26/43] fs: make block_page_mkwrite() aware about " Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 27/43] truncate: make truncate_inode_pages_range() " Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 28/43] truncate: make invalidate_inode_pages2_range() " Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 29/43] mm, hugetlb: switch hugetlbfs to multi-order radix-tree entries Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 30/43] mm: account huge pages to dirty, writaback, reclaimable, etc Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 31/43] ext4: make ext4_mpage_readpages() hugepage-aware Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov [this message] 2016-10-25 0:13 ` [PATCHv4 32/43] ext4: make ext4_writepage() work on huge pages Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 33/43] ext4: handle huge pages in ext4_page_mkwrite() Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 34/43] ext4: handle huge pages in __ext4_block_zero_page_range() Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 35/43] ext4: make ext4_block_write_begin() aware about huge pages Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 36/43] ext4: handle huge pages in ext4_da_write_end() Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 37/43] ext4: make ext4_da_page_release_reservation() aware about huge pages Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 38/43] ext4: handle writeback with " Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 39/43] ext4: make EXT4_IOC_MOVE_EXT work " Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 40/43] ext4: fix SEEK_DATA/SEEK_HOLE for " Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 41/43] ext4: make fallocate() operations work with " Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 42/43] mm, fs, ext4: expand use of page_mapping() and page_to_pgoff() Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov 2016-10-25 0:13 ` [PATCHv4 43/43] ext4, vfs: add huge= mount option Kirill A. Shutemov 2016-10-25 0:13 ` Kirill A. Shutemov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20161025001342.76126-33-kirill.shutemov@linux.intel.com \ --to=kirill.shutemov@linux.intel.com \ --cc=aarcange@redhat.com \ --cc=adilger.kernel@dilger.ca \ --cc=akpm@linux-foundation.org \ --cc=dave.hansen@intel.com \ --cc=hughd@google.com \ --cc=jack@suse.com \ --cc=linux-block@vger.kernel.org \ --cc=linux-ext4@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=ross.zwisler@linux.intel.com \ --cc=tytso@mit.edu \ --cc=vbabka@suse.cz \ --cc=viro@zeniv.linux.org.uk \ --cc=willy@infradead.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.