lkml.org 
[lkml]   [2023]   [Dec]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 07/11] writeback: Factor writeback_iter_init() out of write_cache_pages()
    Date
    From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

    Make it return the first folio in the batch so that we can use it
    in a typical for() pattern.

    Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    ---
    mm/page-writeback.c | 47 +++++++++++++++++++++++++--------------------
    1 file changed, 26 insertions(+), 21 deletions(-)

    diff --git a/mm/page-writeback.c b/mm/page-writeback.c
    index 2243a0d1b2d3c7..8c220c6a7f824d 100644
    --- a/mm/page-writeback.c
    +++ b/mm/page-writeback.c
    @@ -2429,6 +2429,28 @@ static bool should_writeback_folio(struct address_space *mapping,
    return true;
    }

    +static struct folio *writeback_iter_init(struct address_space *mapping,
    + struct writeback_control *wbc)
    +{
    + if (wbc->range_cyclic) {
    + wbc->index = mapping->writeback_index; /* prev offset */
    + wbc->end = -1;
    + } else {
    + wbc->index = wbc->range_start >> PAGE_SHIFT;
    + wbc->end = wbc->range_end >> PAGE_SHIFT;
    + if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
    + wbc->range_whole = 1;
    + }
    + if (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages)
    + tag_pages_for_writeback(mapping, wbc->index, wbc->end);
    +
    + wbc->done_index = wbc->index;
    + folio_batch_init(&wbc->fbatch);
    + wbc->err = 0;
    +
    + return writeback_get_next(mapping, wbc);
    +}
    +
    /**
    * write_cache_pages - walk the list of dirty pages of the given address space and write all of them.
    * @mapping: address space structure to write
    @@ -2464,31 +2486,14 @@ int write_cache_pages(struct address_space *mapping,
    struct writeback_control *wbc, writepage_t writepage,
    void *data)
    {
    + struct folio *folio;
    int error;

    - if (wbc->range_cyclic) {
    - wbc->index = mapping->writeback_index; /* prev offset */
    - wbc->end = -1;
    - } else {
    - wbc->index = wbc->range_start >> PAGE_SHIFT;
    - wbc->end = wbc->range_end >> PAGE_SHIFT;
    - if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
    - wbc->range_whole = 1;
    - }
    - if (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages)
    - tag_pages_for_writeback(mapping, wbc->index, wbc->end);
    -
    - wbc->done_index = wbc->index;
    - folio_batch_init(&wbc->fbatch);
    - wbc->err = 0;
    -
    - for (;;) {
    - struct folio *folio = writeback_get_next(mapping, wbc);
    + for (folio = writeback_iter_init(mapping, wbc);
    + folio;
    + folio = writeback_get_next(mapping, wbc)) {
    unsigned long nr;

    - if (!folio)
    - break;
    -
    wbc->done_index = folio->index;

    folio_lock(folio);
    --
    2.39.2
    \
     
     \ /
      Last update: 2023-12-14 14:26    [W:4.042 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site