aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Piggin <npiggin@suse.de>2006-03-22 03:07:59 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-22 10:53:56 -0500
commit8d438f96d2b8eade6cbcd8adfc22dae6f5cbd6c0 (patch)
tree5248caf52ed9ba1dbb172d9e3bd3216c97ab3b84
parent46453a6e194a8c55fe6cf3dc8e1c4f24e2abc013 (diff)
[PATCH] mm: PageLRU no testset
PG_lru is protected by zone->lru_lock. It does not need TestSet/TestClear operations. Signed-off-by: Nick Piggin <npiggin@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--include/linux/page-flags.h5
-rw-r--r--mm/swap.c16
-rw-r--r--mm/vmscan.c20
3 files changed, 21 insertions, 20 deletions
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
index d52999c43336..58856c823f8b 100644
--- a/include/linux/page-flags.h
+++ b/include/linux/page-flags.h
@@ -239,10 +239,9 @@ extern void __mod_page_state_offset(unsigned long offset, unsigned long delta);
239#define __ClearPageDirty(page) __clear_bit(PG_dirty, &(page)->flags) 239#define __ClearPageDirty(page) __clear_bit(PG_dirty, &(page)->flags)
240#define TestClearPageDirty(page) test_and_clear_bit(PG_dirty, &(page)->flags) 240#define TestClearPageDirty(page) test_and_clear_bit(PG_dirty, &(page)->flags)
241 241
242#define SetPageLRU(page) set_bit(PG_lru, &(page)->flags)
243#define PageLRU(page) test_bit(PG_lru, &(page)->flags) 242#define PageLRU(page) test_bit(PG_lru, &(page)->flags)
244#define TestSetPageLRU(page) test_and_set_bit(PG_lru, &(page)->flags) 243#define SetPageLRU(page) set_bit(PG_lru, &(page)->flags)
245#define TestClearPageLRU(page) test_and_clear_bit(PG_lru, &(page)->flags) 244#define ClearPageLRU(page) clear_bit(PG_lru, &(page)->flags)
246 245
247#define PageActive(page) test_bit(PG_active, &(page)->flags) 246#define PageActive(page) test_bit(PG_active, &(page)->flags)
248#define SetPageActive(page) set_bit(PG_active, &(page)->flags) 247#define SetPageActive(page) set_bit(PG_active, &(page)->flags)
diff --git a/mm/swap.c b/mm/swap.c
index 3045a0f4c451..985324ee9368 100644
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -214,8 +214,8 @@ void fastcall __page_cache_release(struct page *page)
214 struct zone *zone = page_zone(page); 214 struct zone *zone = page_zone(page);
215 215
216 spin_lock_irqsave(&zone->lru_lock, flags); 216 spin_lock_irqsave(&zone->lru_lock, flags);
217 if (!TestClearPageLRU(page)) 217 BUG_ON(!PageLRU(page));
218 BUG(); 218 ClearPageLRU(page);
219 del_page_from_lru(zone, page); 219 del_page_from_lru(zone, page);
220 spin_unlock_irqrestore(&zone->lru_lock, flags); 220 spin_unlock_irqrestore(&zone->lru_lock, flags);
221 } 221 }
@@ -265,8 +265,8 @@ void release_pages(struct page **pages, int nr, int cold)
265 zone = pagezone; 265 zone = pagezone;
266 spin_lock_irq(&zone->lru_lock); 266 spin_lock_irq(&zone->lru_lock);
267 } 267 }
268 if (!TestClearPageLRU(page)) 268 BUG_ON(!PageLRU(page));
269 BUG(); 269 ClearPageLRU(page);
270 del_page_from_lru(zone, page); 270 del_page_from_lru(zone, page);
271 } 271 }
272 272
@@ -345,8 +345,8 @@ void __pagevec_lru_add(struct pagevec *pvec)
345 zone = pagezone; 345 zone = pagezone;
346 spin_lock_irq(&zone->lru_lock); 346 spin_lock_irq(&zone->lru_lock);
347 } 347 }
348 if (TestSetPageLRU(page)) 348 BUG_ON(PageLRU(page));
349 BUG(); 349 SetPageLRU(page);
350 add_page_to_inactive_list(zone, page); 350 add_page_to_inactive_list(zone, page);
351 } 351 }
352 if (zone) 352 if (zone)
@@ -372,8 +372,8 @@ void __pagevec_lru_add_active(struct pagevec *pvec)
372 zone = pagezone; 372 zone = pagezone;
373 spin_lock_irq(&zone->lru_lock); 373 spin_lock_irq(&zone->lru_lock);
374 } 374 }
375 if (TestSetPageLRU(page)) 375 BUG_ON(PageLRU(page));
376 BUG(); 376 SetPageLRU(page);
377 if (TestSetPageActive(page)) 377 if (TestSetPageActive(page))
378 BUG(); 378 BUG();
379 add_page_to_active_list(zone, page); 379 add_page_to_active_list(zone, page);
diff --git a/mm/vmscan.c b/mm/vmscan.c
index acb7611cd525..40fb37828e8c 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1042,9 +1042,10 @@ int isolate_lru_page(struct page *page)
1042 if (PageLRU(page)) { 1042 if (PageLRU(page)) {
1043 struct zone *zone = page_zone(page); 1043 struct zone *zone = page_zone(page);
1044 spin_lock_irq(&zone->lru_lock); 1044 spin_lock_irq(&zone->lru_lock);
1045 if (TestClearPageLRU(page)) { 1045 if (PageLRU(page)) {
1046 ret = 1; 1046 ret = 1;
1047 get_page(page); 1047 get_page(page);
1048 ClearPageLRU(page);
1048 if (PageActive(page)) 1049 if (PageActive(page))
1049 del_page_from_active_list(zone, page); 1050 del_page_from_active_list(zone, page);
1050 else 1051 else
@@ -1085,6 +1086,8 @@ static int isolate_lru_pages(int nr_to_scan, struct list_head *src,
1085 page = lru_to_page(src); 1086 page = lru_to_page(src);
1086 prefetchw_prev_lru_page(page, src, flags); 1087 prefetchw_prev_lru_page(page, src, flags);
1087 1088
1089 BUG_ON(!PageLRU(page));
1090
1088 list_del(&page->lru); 1091 list_del(&page->lru);
1089 if (unlikely(get_page_testone(page))) { 1092 if (unlikely(get_page_testone(page))) {
1090 /* 1093 /*
@@ -1100,8 +1103,7 @@ static int isolate_lru_pages(int nr_to_scan, struct list_head *src,
1100 * the page is not being freed elsewhere -- the page release 1103 * the page is not being freed elsewhere -- the page release
1101 * code relies on it. 1104 * code relies on it.
1102 */ 1105 */
1103 if (!TestClearPageLRU(page)) 1106 ClearPageLRU(page);
1104 BUG();
1105 list_add(&page->lru, dst); 1107 list_add(&page->lru, dst);
1106 nr_taken++; 1108 nr_taken++;
1107 } 1109 }
@@ -1156,8 +1158,8 @@ static void shrink_cache(struct zone *zone, struct scan_control *sc)
1156 */ 1158 */
1157 while (!list_empty(&page_list)) { 1159 while (!list_empty(&page_list)) {
1158 page = lru_to_page(&page_list); 1160 page = lru_to_page(&page_list);
1159 if (TestSetPageLRU(page)) 1161 BUG_ON(PageLRU(page));
1160 BUG(); 1162 SetPageLRU(page);
1161 list_del(&page->lru); 1163 list_del(&page->lru);
1162 if (PageActive(page)) 1164 if (PageActive(page))
1163 add_page_to_active_list(zone, page); 1165 add_page_to_active_list(zone, page);
@@ -1276,8 +1278,8 @@ refill_inactive_zone(struct zone *zone, struct scan_control *sc)
1276 while (!list_empty(&l_inactive)) { 1278 while (!list_empty(&l_inactive)) {
1277 page = lru_to_page(&l_inactive); 1279 page = lru_to_page(&l_inactive);
1278 prefetchw_prev_lru_page(page, &l_inactive, flags); 1280 prefetchw_prev_lru_page(page, &l_inactive, flags);
1279 if (TestSetPageLRU(page)) 1281 BUG_ON(PageLRU(page));
1280 BUG(); 1282 SetPageLRU(page);
1281 if (!TestClearPageActive(page)) 1283 if (!TestClearPageActive(page))
1282 BUG(); 1284 BUG();
1283 list_move(&page->lru, &zone->inactive_list); 1285 list_move(&page->lru, &zone->inactive_list);
@@ -1305,8 +1307,8 @@ refill_inactive_zone(struct zone *zone, struct scan_control *sc)
1305 while (!list_empty(&l_active)) { 1307 while (!list_empty(&l_active)) {
1306 page = lru_to_page(&l_active); 1308 page = lru_to_page(&l_active);
1307 prefetchw_prev_lru_page(page, &l_active, flags); 1309 prefetchw_prev_lru_page(page, &l_active, flags);
1308 if (TestSetPageLRU(page)) 1310 BUG_ON(PageLRU(page));
1309 BUG(); 1311 SetPageLRU(page);
1310 BUG_ON(!PageActive(page)); 1312 BUG_ON(!PageActive(page));
1311 list_move(&page->lru, &zone->active_list); 1313 list_move(&page->lru, &zone->active_list);
1312 pgmoved++; 1314 pgmoved++;