remove libdss from Makefile
[GitHub/moto-9609/android_kernel_motorola_exynos9610.git] / mm / filemap.c
index e2e738cc08b1d1fa88f74c8897253893e93fff4a..6a7bbb09d1b523bb7493bbcf9c9acbfdaed358ef 100644 (file)
@@ -36,6 +36,8 @@
 #include <linux/memcontrol.h>
 #include <linux/cleancache.h>
 #include <linux/rmap.h>
+#include <linux/delayacct.h>
+#include <linux/psi.h>
 #include "internal.h"
 
 #define CREATE_TRACE_POINTS
@@ -817,12 +819,9 @@ int add_to_page_cache_lru(struct page *page, struct address_space *mapping,
                 * data from the working set, only to cache data that will
                 * get overwritten with something else, is a waste of memory.
                 */
-               if (!(gfp_mask & __GFP_WRITE) &&
-                   shadow && workingset_refault(shadow)) {
-                       SetPageActive(page);
-                       workingset_activation(page);
-               } else
-                       ClearPageActive(page);
+               WARN_ON_ONCE(PageActive(page));
+               if (!(gfp_mask & __GFP_WRITE) && shadow)
+                       workingset_refault(page, shadow);
                lru_cache_add(page);
        }
        return ret;
@@ -978,8 +977,18 @@ static inline int wait_on_page_bit_common(wait_queue_head_t *q,
 {
        struct wait_page_queue wait_page;
        wait_queue_entry_t *wait = &wait_page.wait;
+       bool thrashing = false;
+       unsigned long pflags;
        int ret = 0;
 
+       if (bit_nr == PG_locked &&
+           !PageUptodate(page) && PageWorkingset(page)) {
+               if (!PageSwapBacked(page))
+                       delayacct_thrashing_start();
+               psi_memstall_enter(&pflags);
+               thrashing = true;
+       }
+
        init_wait(wait);
        wait->flags = lock ? WQ_FLAG_EXCLUSIVE : 0;
        wait->func = wake_page_function;
@@ -1018,6 +1027,12 @@ static inline int wait_on_page_bit_common(wait_queue_head_t *q,
 
        finish_wait(q, wait);
 
+       if (thrashing) {
+               if (!PageSwapBacked(page))
+                       delayacct_thrashing_end();
+               psi_memstall_leave(&pflags);
+       }
+
        /*
         * A signal could leave PageWaiters set. Clearing it here if
         * !waitqueue_active would be possible (by open-coding finish_wait),
@@ -1965,7 +1980,9 @@ static ssize_t generic_file_buffered_read(struct kiocb *iocb,
                pgoff_t end_index;
                loff_t isize;
                unsigned long nr, ret;
+               ktime_t event_ts;
 
+               event_ts = 0;
                cond_resched();
 find_page:
                if (fatal_signal_pending(current)) {
@@ -1977,6 +1994,7 @@ find_page:
                if (!page) {
                        if (iocb->ki_flags & IOCB_NOWAIT)
                                goto would_block;
+                       mm_event_start(&event_ts);
                        page_cache_sync_readahead(mapping,
                                        ra, filp,
                                        index, last_index - index);
@@ -2023,6 +2041,8 @@ find_page:
                        unlock_page(page);
                }
 page_ok:
+               if (event_ts != 0)
+                       mm_event_end(MM_READ_IO, event_ts);
                /*
                 * i_size must be checked after we know the page is Uptodate.
                 *
@@ -2665,7 +2685,7 @@ static struct page *wait_on_page_read(struct page *page)
 
 static struct page *do_read_cache_page(struct address_space *mapping,
                                pgoff_t index,
-                               int (*filler)(void *, struct page *),
+                               int (*filler)(struct file *, struct page *),
                                void *data,
                                gfp_t gfp)
 {
@@ -2772,7 +2792,7 @@ out:
  */
 struct page *read_cache_page(struct address_space *mapping,
                                pgoff_t index,
-                               int (*filler)(void *, struct page *),
+                               int (*filler)(struct file *, struct page *),
                                void *data)
 {
        return do_read_cache_page(mapping, index, filler, data, mapping_gfp_mask(mapping));
@@ -2794,7 +2814,7 @@ struct page *read_cache_page_gfp(struct address_space *mapping,
                                pgoff_t index,
                                gfp_t gfp)
 {
-       filler_t *filler = (filler_t *)mapping->a_ops->readpage;
+       filler_t *filler = mapping->a_ops->readpage;
 
        return do_read_cache_page(mapping, index, filler, NULL, gfp);
 }