On Tue, Aug 16, 2022 at 10:52:43AM -0700, Vishal Moola (Oracle) wrote: > Converted function to use folios throughout. This is in preparation for > the removal of find_get_pages_contig(). Now also supports large folios. > > Since we may receive more than nr_pages pages, nr_pages may underflow. > Since nr_pages > 0 is equivalent to index <= end_index, we replaced it > with this check instead. > > Also minor comment renaming for consistency in subpage. > > Signed-off-by: Vishal Moola (Oracle) <vishal.moola@xxxxxxxxx> Acked-by: David Sterba <dsterba@xxxxxxxx> > --- a/fs/btrfs/tests/extent-io-tests.c > +++ b/fs/btrfs/tests/extent-io-tests.c > @@ -4,6 +4,7 @@ > */ > > #include <linux/pagemap.h> > +#include <linux/pagevec.h> > #include <linux/sched.h> > #include <linux/slab.h> > #include <linux/sizes.h> > @@ -20,39 +21,39 @@ static noinline int process_page_range(struct inode *inode, u64 start, u64 end, > unsigned long flags) > { > int ret; > - struct page *pages[16]; > + struct folio_batch fbatch; > unsigned long index = start >> PAGE_SHIFT; > unsigned long end_index = end >> PAGE_SHIFT; > - unsigned long nr_pages = end_index - index + 1; > int i; > int count = 0; > int loops = 0; > > - while (nr_pages > 0) { > - ret = find_get_pages_contig(inode->i_mapping, index, > - min_t(unsigned long, nr_pages, > - ARRAY_SIZE(pages)), pages); > + folio_batch_init(&fbatch); > + > + while (index <= end_index) { > + ret = filemap_get_folios_contig(inode->i_mapping, &index, > + end_index, &fbatch); > for (i = 0; i < ret; i++) { > + struct folio *folio = fbatch.folios[i]; Add a newline please > if (flags & PROCESS_TEST_LOCKED && > - !PageLocked(pages[i])) > + !folio_test_locked(folio)) > count++; > - if (flags & PROCESS_UNLOCK && PageLocked(pages[i])) > - unlock_page(pages[i]); > - put_page(pages[i]); > + if (flags & PROCESS_UNLOCK && folio_test_locked(folio)) > + folio_unlock(folio); > if (flags & PROCESS_RELEASE) > - put_page(pages[i]); > + folio_put(folio); > } > - nr_pages -= ret; > - index += ret; > + folio_batch_release(&fbatch); > cond_resched(); > loops++; > if (loops > 100000) { > printk(KERN_ERR > - "stuck in a loop, start %llu, end %llu, nr_pages %lu, ret %d\n", > - start, end, nr_pages, ret); > + "stuck in a loop, start %llu, end %llu, ret %d\n", > + start, end, ret); > break; > } > } > + > return count; > } > > -- > 2.36.1