aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Piggin <npiggin@suse.de>2006-03-22 03:08:00 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-22 10:53:57 -0500
commit674539115cc88473f623581e1d53c0e2ecef2179 (patch)
tree7a32501091d7370ff4387df68804f918a089c631
parent4c84cacfa424264f7ad5287298d3ea4a3e935278 (diff)
[PATCH] mm: less atomic ops
In the page release paths, we can be sure that nobody will mess with our page->flags because the refcount has dropped to 0. So no need for atomic operations here. 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/mm_inline.h2
-rw-r--r--include/linux/page-flags.h2
-rw-r--r--mm/swap.c4
3 files changed, 5 insertions, 3 deletions
diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h
index 8ac854f7f190..3b6723dfaff3 100644
--- a/include/linux/mm_inline.h
+++ b/include/linux/mm_inline.h
@@ -32,7 +32,7 @@ del_page_from_lru(struct zone *zone, struct page *page)
32{ 32{
33 list_del(&page->lru); 33 list_del(&page->lru);
34 if (PageActive(page)) { 34 if (PageActive(page)) {
35 ClearPageActive(page); 35 __ClearPageActive(page);
36 zone->nr_active--; 36 zone->nr_active--;
37 } else { 37 } else {
38 zone->nr_inactive--; 38 zone->nr_inactive--;
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
index 5d1e7bd85107..da71d63df465 100644
--- a/include/linux/page-flags.h
+++ b/include/linux/page-flags.h
@@ -242,10 +242,12 @@ extern void __mod_page_state_offset(unsigned long offset, unsigned long delta);
242#define PageLRU(page) test_bit(PG_lru, &(page)->flags) 242#define PageLRU(page) test_bit(PG_lru, &(page)->flags)
243#define SetPageLRU(page) set_bit(PG_lru, &(page)->flags) 243#define SetPageLRU(page) set_bit(PG_lru, &(page)->flags)
244#define ClearPageLRU(page) clear_bit(PG_lru, &(page)->flags) 244#define ClearPageLRU(page) clear_bit(PG_lru, &(page)->flags)
245#define __ClearPageLRU(page) __clear_bit(PG_lru, &(page)->flags)
245 246
246#define PageActive(page) test_bit(PG_active, &(page)->flags) 247#define PageActive(page) test_bit(PG_active, &(page)->flags)
247#define SetPageActive(page) set_bit(PG_active, &(page)->flags) 248#define SetPageActive(page) set_bit(PG_active, &(page)->flags)
248#define ClearPageActive(page) clear_bit(PG_active, &(page)->flags) 249#define ClearPageActive(page) clear_bit(PG_active, &(page)->flags)
250#define __ClearPageActive(page) __clear_bit(PG_active, &(page)->flags)
249 251
250#define PageSlab(page) test_bit(PG_slab, &(page)->flags) 252#define PageSlab(page) test_bit(PG_slab, &(page)->flags)
251#define SetPageSlab(page) set_bit(PG_slab, &(page)->flags) 253#define SetPageSlab(page) set_bit(PG_slab, &(page)->flags)
diff --git a/mm/swap.c b/mm/swap.c
index cf88226cf96d..91b7e2026f69 100644
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -215,7 +215,7 @@ void fastcall __page_cache_release(struct page *page)
215 215
216 spin_lock_irqsave(&zone->lru_lock, flags); 216 spin_lock_irqsave(&zone->lru_lock, flags);
217 BUG_ON(!PageLRU(page)); 217 BUG_ON(!PageLRU(page));
218 ClearPageLRU(page); 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 }
@@ -266,7 +266,7 @@ void release_pages(struct page **pages, int nr, int cold)
266 spin_lock_irq(&zone->lru_lock); 266 spin_lock_irq(&zone->lru_lock);
267 } 267 }
268 BUG_ON(!PageLRU(page)); 268 BUG_ON(!PageLRU(page));
269 ClearPageLRU(page); 269 __ClearPageLRU(page);
270 del_page_from_lru(zone, page); 270 del_page_from_lru(zone, page);
271 } 271 }
272 272