Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964856AbVL3Wnk (ORCPT ); Fri, 30 Dec 2005 17:43:40 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S964900AbVL3Wn0 (ORCPT ); Fri, 30 Dec 2005 17:43:26 -0500 Received: from amsfep16-int.chello.nl ([213.46.243.25]:37207 "EHLO amsfep16-int.chello.nl") by vger.kernel.org with ESMTP id S964879AbVL3WnQ (ORCPT ); Fri, 30 Dec 2005 17:43:16 -0500 From: Peter Zijlstra To: linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Andrew Morton , Peter Zijlstra , Christoph Lameter , Wu Fengguang , Nick Piggin , Marijn Meijles , Rik van Riel , Marcelo Tosatti Message-Id: <20051230224252.765.39786.sendpatchset@twins.localnet> In-Reply-To: <20051230223952.765.21096.sendpatchset@twins.localnet> References: <20051230223952.765.21096.sendpatchset@twins.localnet> Subject: [PATCH 4/9] clockpro-use-once.patch Date: Fri, 30 Dec 2005 23:43:14 +0100 Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6541 Lines: 217 From: Rik van Riel Simplify the use-once code. I have not benchmarked this change yet, but I expect it to have little impact on most workloads. It gets rid of some magic code though, which is nice. Modified to work with this CLOCK-Pro implementation. Signed-off-by: Peter Zijlstra include/linux/mm_page_replace.h | 14 -------------- mm/filemap.c | 11 ++--------- mm/shmem.c | 6 +----- mm/swap.c | 27 +-------------------------- mm/swapfile.c | 4 ++-- mm/vmscan.c | 25 ++----------------------- 6 files changed, 8 insertions(+), 79 deletions(-) Index: linux-2.6-git/mm/filemap.c =================================================================== --- linux-2.6-git.orig/mm/filemap.c +++ linux-2.6-git/mm/filemap.c @@ -387,6 +387,7 @@ int add_to_page_cache(struct page *page, if (!error) { page_cache_get(page); SetPageLocked(page); + SetPageTest(page); page->mapping = mapping; page->index = offset; mapping->nrpages++; @@ -726,7 +727,6 @@ void do_generic_mapping_read(struct addr unsigned long offset; unsigned long last_index; unsigned long next_index; - unsigned long prev_index; loff_t isize; struct page *cached_page; int error; @@ -735,7 +735,6 @@ void do_generic_mapping_read(struct addr cached_page = NULL; index = *ppos >> PAGE_CACHE_SHIFT; next_index = index; - prev_index = ra.prev_page; last_index = (*ppos + desc->count + PAGE_CACHE_SIZE-1) >> PAGE_CACHE_SHIFT; offset = *ppos & ~PAGE_CACHE_MASK; @@ -782,13 +781,7 @@ page_ok: if (mapping_writably_mapped(mapping)) flush_dcache_page(page); - /* - * When (part of) the same page is read multiple times - * in succession, only mark it as accessed the first time. - */ - if (prev_index != index) - mark_page_accessed(page); - prev_index = index; + mark_page_accessed(page); /* * Ok, we have the page, and it's up-to-date, so Index: linux-2.6-git/mm/swap.c =================================================================== --- linux-2.6-git.orig/mm/swap.c +++ linux-2.6-git/mm/swap.c @@ -90,37 +90,12 @@ int rotate_reclaimable_page(struct page } /* - * FIXME: speed this up? - */ -void fastcall activate_page(struct page *page) -{ - struct zone *zone = page_zone(page); - - spin_lock_irq(&zone->lru_lock); - if (PageLRU(page) && !PageActive(page)) { - del_page_from_inactive_list(zone, page); - SetPageActive(page); - add_page_to_active_list(zone, page); - inc_page_state(pgactivate); - } - spin_unlock_irq(&zone->lru_lock); -} - -/* * Mark a page as having seen activity. - * - * inactive,unreferenced -> inactive,referenced - * inactive,referenced -> active,unreferenced - * active,unreferenced -> active,referenced */ void fastcall mark_page_accessed(struct page *page) { - if (!PageActive(page) && PageReferenced(page) && PageLRU(page)) { - activate_page(page); - ClearPageReferenced(page); - } else if (!PageReferenced(page)) { + if (!PageReferenced(page)) SetPageReferenced(page); - } } EXPORT_SYMBOL(mark_page_accessed); Index: linux-2.6-git/mm/swapfile.c =================================================================== --- linux-2.6-git.orig/mm/swapfile.c +++ linux-2.6-git/mm/swapfile.c @@ -421,7 +421,7 @@ static void unuse_pte(struct vm_area_str * Move the page to the active list so it is not * immediately swapped out again after swapon. */ - activate_page(page); + mark_page_accessed(page); } static int unuse_pte_range(struct vm_area_struct *vma, pmd_t *pmd, @@ -523,7 +523,7 @@ static int unuse_mm(struct mm_struct *mm * Activate page so shrink_cache is unlikely to unmap its * ptes while lock is dropped, so swapoff can make progress. */ - activate_page(page); + mark_page_accessed(page); unlock_page(page); down_read(&mm->mmap_sem); lock_page(page); Index: linux-2.6-git/mm/vmscan.c =================================================================== --- linux-2.6-git.orig/mm/vmscan.c +++ linux-2.6-git/mm/vmscan.c @@ -219,27 +219,6 @@ static int shrink_slab(unsigned long sca return ret; } -/* Called without lock on whether page is mapped, so answer is unstable */ -static inline int page_mapping_inuse(struct page *page) -{ - struct address_space *mapping; - - /* Page is in somebody's page tables. */ - if (page_mapped(page)) - return 1; - - /* Be more reluctant to reclaim swapcache than pagecache */ - if (PageSwapCache(page)) - return 1; - - mapping = page_mapping(page); - if (!mapping) - return 0; - - /* File is mmap'd by somebody? */ - return mapping_mapped(mapping); -} - static inline int is_page_cache_freeable(struct page *page) { return page_count(page) - !!PagePrivate(page) == 2; @@ -374,8 +353,8 @@ static try_pageout_t try_pageout(struct goto keep_locked; referenced = page_referenced(page, 1); - /* In active use or really unfreeable? Activate it. */ - if (referenced && page_mapping_inuse(page)) + + if (referenced) goto activate_locked; #ifdef CONFIG_SWAP Index: linux-2.6-git/mm/shmem.c =================================================================== --- linux-2.6-git.orig/mm/shmem.c +++ linux-2.6-git/mm/shmem.c @@ -1499,11 +1499,7 @@ static void do_shmem_file_read(struct fi */ if (mapping_writably_mapped(mapping)) flush_dcache_page(page); - /* - * Mark the page accessed if we read the beginning. - */ - if (!offset) - mark_page_accessed(page); + mark_page_accessed(page); } else { page = ZERO_PAGE(0); page_cache_get(page); Index: linux-2.6-git/include/linux/mm_page_replace.h =================================================================== --- linux-2.6-git.orig/include/linux/mm_page_replace.h +++ linux-2.6-git/include/linux/mm_page_replace.h @@ -67,20 +67,6 @@ add_page_to_active_list(struct zone *zon } static inline void -del_page_from_active_list(struct zone *zone, struct page *page) -{ - list_del(&page->lru); - zone->nr_active--; -} - -static inline void -del_page_from_inactive_list(struct zone *zone, struct page *page) -{ - list_del(&page->lru); - zone->nr_inactive--; -} - -static inline void del_page_from_lru(struct zone *zone, struct page *page) { list_del(&page->lru); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/