diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids 2.4.23pre7/include/linux/mm.h race/include/linux/mm.h --- 2.4.23pre7/include/linux/mm.h 2003-10-10 08:08:27.000000000 +0200 +++ race/include/linux/mm.h 2003-10-11 17:32:02.000000000 +0200 @@ -322,11 +322,9 @@ typedef struct page { #define TryLockPage(page) test_and_set_bit(PG_locked, &(page)->flags) #define PageChecked(page) test_bit(PG_checked, &(page)->flags) #define SetPageChecked(page) set_bit(PG_checked, &(page)->flags) -#define ClearPageChecked(page) clear_bit(PG_checked, &(page)->flags) #define PageLaunder(page) test_bit(PG_launder, &(page)->flags) #define SetPageLaunder(page) set_bit(PG_launder, &(page)->flags) #define ClearPageLaunder(page) clear_bit(PG_launder, &(page)->flags) -#define ClearPageArch1(page) clear_bit(PG_arch_1, &(page)->flags) /* * The zone field is never updated after free_area_init_core() diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids 2.4.23pre7/mm/filemap.c race/mm/filemap.c --- 2.4.23pre7/mm/filemap.c 2003-10-10 08:08:32.000000000 +0200 +++ race/mm/filemap.c 2003-10-11 17:48:32.000000000 +0200 @@ -656,19 +656,10 @@ static inline void __add_to_page_cache(s struct address_space *mapping, unsigned long offset, struct page **hash) { - /* - * Yes this is inefficient, however it is needed. The problem - * is that we could be adding a page to the swap cache while - * another CPU is also modifying page->flags, so the updates - * really do need to be atomic. -- Rik - */ - ClearPageUptodate(page); - ClearPageError(page); - ClearPageDirty(page); - ClearPageReferenced(page); - ClearPageArch1(page); - ClearPageChecked(page); - LockPage(page); + unsigned long flags; + + flags = page->flags & ~(1 << PG_uptodate | 1 << PG_error | 1 << PG_dirty | 1 << PG_referenced | 1 << PG_arch_1 | 1 << PG_checked); + page->flags = flags | (1 << PG_locked); page_cache_get(page); page->index = offset; add_page_to_inode_queue(mapping, page); @@ -690,6 +681,7 @@ int add_to_page_cache_unique(struct page int err; struct page *alias; + spin_lock(&pagemap_lru_lock); spin_lock(&pagecache_lock); alias = __find_page_nolock(mapping, offset, *hash); @@ -700,6 +692,7 @@ int add_to_page_cache_unique(struct page } spin_unlock(&pagecache_lock); + spin_unlock(&pagemap_lru_lock); if (!err) lru_cache_add(page); return err; diff -urNp --exclude CVS --exclude BitKeeper --exclude {arch} --exclude .arch-ids 2.4.23pre7/mm/page_alloc.c race/mm/page_alloc.c --- 2.4.23pre7/mm/page_alloc.c 2003-10-10 08:08:32.000000000 +0200 +++ race/mm/page_alloc.c 2003-10-11 17:32:02.000000000 +0200 @@ -109,8 +109,7 @@ static void __free_pages_ok (struct page BUG(); if (PageActive(page)) BUG(); - ClearPageReferenced(page); - ClearPageDirty(page); + page->flags &= ~((1<flags & PF_FREE_PAGES) goto local_freelist;