On Mon, Jun 26, 2023 at 06:35:13PM +0100, Matthew Wilcox (Oracle) wrote: > Collapse the two nested loops into one. This is needed as a step > towards turning this into an iterator. > --- > mm/page-writeback.c | 94 ++++++++++++++++++++++----------------------- > 1 file changed, 47 insertions(+), 47 deletions(-) > > diff --git a/mm/page-writeback.c b/mm/page-writeback.c > index 54f2972dab45..68f28eeb15ed 100644 > --- a/mm/page-writeback.c > +++ b/mm/page-writeback.c > @@ -2461,6 +2461,7 @@ int write_cache_pages(struct address_space *mapping, > void *data) > { > int error; > + int i = 0; > > if (wbc->range_cyclic) { > wbc->index = mapping->writeback_index; /* prev offset */ > @@ -2478,65 +2479,64 @@ int write_cache_pages(struct address_space *mapping, > folio_batch_init(&wbc->fbatch); > wbc->err = 0; > > + for (;;) { > + struct folio *folio; > > + if (i == wbc->fbatch.nr) { > + writeback_get_batch(mapping, wbc); > + i = 0; > + } > if (wbc->fbatch.nr == 0) > break; > + folio = wbc->fbatch.folios[i++]; Did you consider moving what is currently the "i" local variable into strut writeback_control as well? Then writeback_get_batch could return the current folio, and we could hae a much nicer loop here by moving all of the above into writeback_get_batch: while ((folio = writeback_get_batch(mapping, wbc))) { (and yes, writeback_get_batch probably needs a better name with that)