]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - mm/swap.c
mm: close race between do_fault_around() and fault_around_bytes_set()
[karo-tx-linux.git] / mm / swap.c
index 30b6a37c74af538538a1893d9e45469fa171f56c..c789d01c9ec31db05803566bc23baee090908366 100644 (file)
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -501,7 +501,7 @@ static void __activate_page(struct page *page, struct lruvec *lruvec,
                SetPageActive(page);
                lru += LRU_ACTIVE;
                add_page_to_lru_list(page, lruvec, lru);
-               trace_mm_lru_activate(page, page_to_pfn(page));
+               trace_mm_lru_activate(page);
 
                __count_vm_event(PGACTIVATE);
                update_page_reclaim_stat(lruvec, file, 1);
@@ -589,6 +589,9 @@ static void __lru_cache_activate_page(struct page *page)
  * inactive,unreferenced       ->      inactive,referenced
  * inactive,referenced         ->      active,unreferenced
  * active,unreferenced         ->      active,referenced
+ *
+ * When a newly allocated page is not yet visible, so safe for non-atomic ops,
+ * __SetPageReferenced(page) may be substituted for mark_page_accessed(page).
  */
 void mark_page_accessed(struct page *page)
 {
@@ -631,13 +634,15 @@ static void __lru_cache_add(struct page *page)
  */
 void lru_cache_add_anon(struct page *page)
 {
-       ClearPageActive(page);
+       if (PageActive(page))
+               ClearPageActive(page);
        __lru_cache_add(page);
 }
 
 void lru_cache_add_file(struct page *page)
 {
-       ClearPageActive(page);
+       if (PageActive(page))
+               ClearPageActive(page);
        __lru_cache_add(page);
 }
 EXPORT_SYMBOL(lru_cache_add_file);
@@ -983,7 +988,7 @@ static void __pagevec_lru_add_fn(struct page *page, struct lruvec *lruvec,
        SetPageLRU(page);
        add_page_to_lru_list(page, lruvec, lru);
        update_page_reclaim_stat(lruvec, file, active);
-       trace_mm_lru_insertion(page, page_to_pfn(page), lru, trace_pagemap_flags(page));
+       trace_mm_lru_insertion(page, lru);
 }
 
 /*