From: David S. Miller Date: Mon, 18 Apr 2005 01:03:09 +0000 (-0700) Subject: [PATCH] sparc64: Do not flush dcache for ZERO_PAGE. X-Git-Tag: v2.6.12-rc3~27^2~13 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=a9546f59e90d6ec1b65952c547302e0678e3a5ac;p=linux-2.6-omap-h63xx.git [PATCH] sparc64: Do not flush dcache for ZERO_PAGE. This case actually can get exercised a lot during an ELF coredump of a process which contains a lot of non-COW'd anonymous pages. GDB has this test case which in partiaular creates near terabyte process full of ZERO_PAGEes. It takes forever to just walk through the page tables because of all of these spurious cache flushes on sparc64. With this change it takes only a second or so. Signed-off-by: David S. Miller Signed-off-by: Linus Torvalds --- diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index 89022ccaa75..db6fa77b4da 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c @@ -201,13 +201,24 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t p void flush_dcache_page(struct page *page) { - struct address_space *mapping = page_mapping(page); - int dirty = test_bit(PG_dcache_dirty, &page->flags); - int dirty_cpu = dcache_dirty_cpu(page); - int this_cpu = get_cpu(); + struct address_space *mapping; + int this_cpu; + /* Do not bother with the expensive D-cache flush if it + * is merely the zero page. The 'bigcore' testcase in GDB + * causes this case to run millions of times. + */ + if (page == ZERO_PAGE(0)) + return; + + this_cpu = get_cpu(); + + mapping = page_mapping(page); if (mapping && !mapping_mapped(mapping)) { + int dirty = test_bit(PG_dcache_dirty, &page->flags); if (dirty) { + int dirty_cpu = dcache_dirty_cpu(page); + if (dirty_cpu == this_cpu) goto out; smp_flush_dcache_page_impl(page, dirty_cpu);