[PATCH] mm: less atomic ops
Nick Piggin [Wed, 22 Mar 2006 08:08:00 +0000 (00:08 -0800)]
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>

include/linux/mm_inline.h
include/linux/page-flags.h
mm/swap.c

index 8ac854f..3b6723d 100644 (file)
@@ -32,7 +32,7 @@ del_page_from_lru(struct zone *zone, struct page *page)
 {
        list_del(&page->lru);
        if (PageActive(page)) {
-               ClearPageActive(page);
+               __ClearPageActive(page);
                zone->nr_active--;
        } else {
                zone->nr_inactive--;
index 5d1e7bd..da71d63 100644 (file)
@@ -242,10 +242,12 @@ extern void __mod_page_state_offset(unsigned long offset, unsigned long delta);
 #define PageLRU(page)          test_bit(PG_lru, &(page)->flags)
 #define SetPageLRU(page)       set_bit(PG_lru, &(page)->flags)
 #define ClearPageLRU(page)     clear_bit(PG_lru, &(page)->flags)
+#define __ClearPageLRU(page)   __clear_bit(PG_lru, &(page)->flags)
 
 #define PageActive(page)       test_bit(PG_active, &(page)->flags)
 #define SetPageActive(page)    set_bit(PG_active, &(page)->flags)
 #define ClearPageActive(page)  clear_bit(PG_active, &(page)->flags)
+#define __ClearPageActive(page)        __clear_bit(PG_active, &(page)->flags)
 
 #define PageSlab(page)         test_bit(PG_slab, &(page)->flags)
 #define SetPageSlab(page)      set_bit(PG_slab, &(page)->flags)
index cf88226..91b7e20 100644 (file)
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -215,7 +215,7 @@ void fastcall __page_cache_release(struct page *page)
 
                spin_lock_irqsave(&zone->lru_lock, flags);
                BUG_ON(!PageLRU(page));
-               ClearPageLRU(page);
+               __ClearPageLRU(page);
                del_page_from_lru(zone, page);
                spin_unlock_irqrestore(&zone->lru_lock, flags);
        }
@@ -266,7 +266,7 @@ void release_pages(struct page **pages, int nr, int cold)
                                spin_lock_irq(&zone->lru_lock);
                        }
                        BUG_ON(!PageLRU(page));
-                       ClearPageLRU(page);
+                       __ClearPageLRU(page);
                        del_page_from_lru(zone, page);
                }