static int filemap_read_folio(struct file *file, filler_t filler,
                struct folio *folio)
 {
+       bool workingset = folio_test_workingset(folio);
+       unsigned long pflags;
        int error;
 
        /*
         * fails.
         */
        folio_clear_error(folio);
+
        /* Start the actual read. The read will unlock the page. */
+       if (unlikely(workingset))
+               psi_memstall_enter(&pflags);
        error = filler(file, folio);
+       if (unlikely(workingset))
+               psi_memstall_leave(&pflags);
        if (error)
                return error;
 
 
 #include <linux/task_io_accounting_ops.h>
 #include <linux/pagevec.h>
 #include <linux/pagemap.h>
+#include <linux/psi.h>
 #include <linux/syscalls.h>
 #include <linux/file.h>
 #include <linux/mm_inline.h>
        if (!readahead_count(rac))
                return;
 
+       if (unlikely(rac->_workingset))
+               psi_memstall_enter(&rac->_pflags);
        blk_start_plug(&plug);
 
        if (aops->readahead) {
        }
 
        blk_finish_plug(&plug);
+       if (unlikely(rac->_workingset))
+               psi_memstall_leave(&rac->_pflags);
+       rac->_workingset = false;
 
        BUG_ON(readahead_count(rac));
 }
                }
                if (i == nr_to_read - lookahead_size)
                        folio_set_readahead(folio);
+               ractl->_workingset |= folio_test_workingset(folio);
                ractl->_nr_pages++;
        }
 
        if (index == mark)
                folio_set_readahead(folio);
        err = filemap_add_folio(ractl->mapping, folio, index, gfp);
-       if (err)
+       if (err) {
                folio_put(folio);
-       else
-               ractl->_nr_pages += 1UL << order;
-       return err;
+               return err;
+       }
+
+       ractl->_nr_pages += 1UL << order;
+       ractl->_workingset |= folio_test_workingset(folio);
+       return 0;
 }
 
 void page_cache_ra_order(struct readahead_control *ractl,
                        put_page(page);
                        return;
                }
+               if (unlikely(PageWorkingset(page)) && !ractl->_workingset) {
+                       ractl->_workingset = true;
+                       psi_memstall_enter(&ractl->_pflags);
+               }
                ractl->_nr_pages++;
                if (ra) {
                        ra->size++;