Merge tag 'net-6.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux-block.git] / mm / readahead.c
index b10f0cf81d804ea62aba61ce46b1b1ff60d95a9c..47afbca1d122e44617bad4afec283ec7b780ec49 100644 (file)
@@ -801,21 +801,25 @@ void readahead_expand(struct readahead_control *ractl,
        /* Expand the leading edge downwards */
        while (ractl->_index > new_index) {
                unsigned long index = ractl->_index - 1;
-               struct page *page = xa_load(&mapping->i_pages, index);
+               struct folio *folio = xa_load(&mapping->i_pages, index);
 
-               if (page && !xa_is_value(page))
-                       return; /* Page apparently present */
+               if (folio && !xa_is_value(folio))
+                       return; /* Folio apparently present */
 
-               page = __page_cache_alloc(gfp_mask);
-               if (!page)
+               folio = filemap_alloc_folio(gfp_mask, 0);
+               if (!folio)
                        return;
-               if (add_to_page_cache_lru(page, mapping, index, gfp_mask) < 0) {
-                       put_page(page);
+               if (filemap_add_folio(mapping, folio, index, gfp_mask) < 0) {
+                       folio_put(folio);
                        return;
                }
-
+               if (unlikely(folio_test_workingset(folio)) &&
+                               !ractl->_workingset) {
+                       ractl->_workingset = true;
+                       psi_memstall_enter(&ractl->_pflags);
+               }
                ractl->_nr_pages++;
-               ractl->_index = page->index;
+               ractl->_index = folio->index;
        }
 
        new_len += new_start - readahead_pos(ractl);
@@ -824,19 +828,20 @@ void readahead_expand(struct readahead_control *ractl,
        /* Expand the trailing edge upwards */
        while (ractl->_nr_pages < new_nr_pages) {
                unsigned long index = ractl->_index + ractl->_nr_pages;
-               struct page *page = xa_load(&mapping->i_pages, index);
+               struct folio *folio = xa_load(&mapping->i_pages, index);
 
-               if (page && !xa_is_value(page))
-                       return; /* Page apparently present */
+               if (folio && !xa_is_value(folio))
+                       return; /* Folio apparently present */
 
-               page = __page_cache_alloc(gfp_mask);
-               if (!page)
+               folio = filemap_alloc_folio(gfp_mask, 0);
+               if (!folio)
                        return;
-               if (add_to_page_cache_lru(page, mapping, index, gfp_mask) < 0) {
-                       put_page(page);
+               if (filemap_add_folio(mapping, folio, index, gfp_mask) < 0) {
+                       folio_put(folio);
                        return;
                }
-               if (unlikely(PageWorkingset(page)) && !ractl->_workingset) {
+               if (unlikely(folio_test_workingset(folio)) &&
+                               !ractl->_workingset) {
                        ractl->_workingset = true;
                        psi_memstall_enter(&ractl->_pflags);
                }