]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] shrink_list(): check PageSwapCache() after add_to_swap()
authorAndrew Morton <akpm@osdl.org>
Wed, 4 Feb 2004 02:49:23 +0000 (18:49 -0800)
committerLinus Torvalds <torvalds@home.osdl.org>
Wed, 4 Feb 2004 02:49:23 +0000 (18:49 -0800)
From: Nikita Danilov <Nikita@Namesys.COM>

shrink_list() checks PageSwapCache() before calling add_to_swap(), this
means that anonymous page that is going to be added to the swap right
now these checks return false and:

 (*) it will be unaccounted for in nr_mapped, and

 (*) it won't be written to the swap if gfp_flags include __GFP_IO but
     not __GFP_FS.

(Both will happen only on the next round of scanning.)

Patch below just moves may_enter_fs initialization down. I am not sure
about (*nr_mapped) increase though.

mm/vmscan.c

index dcb7dc0f176d16bd8116260da82127898c71092b..7580d2812a97fcf171c3767d5b9c4fb01ace143b 100644 (file)
@@ -271,8 +271,6 @@ shrink_list(struct list_head *page_list, unsigned int gfp_mask,
                        (*nr_mapped)++;
 
                BUG_ON(PageActive(page));
-               may_enter_fs = (gfp_mask & __GFP_FS) ||
-                               (PageSwapCache(page) && (gfp_mask & __GFP_IO));
 
                if (PageWriteback(page))
                        goto keep_locked;
@@ -303,6 +301,9 @@ shrink_list(struct list_head *page_list, unsigned int gfp_mask,
                }
 #endif /* CONFIG_SWAP */
 
+               may_enter_fs = (gfp_mask & __GFP_FS) ||
+                               (PageSwapCache(page) && (gfp_mask & __GFP_IO));
+
                /*
                 * The page is mapped into the page tables of one or more
                 * processes. Try to unmap it here.