[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 <davem@davemloft.net> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
a4e884a311
commit
a9546f59e9
|
@ -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)
|
void flush_dcache_page(struct page *page)
|
||||||
{
|
{
|
||||||
struct address_space *mapping = page_mapping(page);
|
struct address_space *mapping;
|
||||||
int dirty = test_bit(PG_dcache_dirty, &page->flags);
|
int this_cpu;
|
||||||
int dirty_cpu = dcache_dirty_cpu(page);
|
|
||||||
int this_cpu = get_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)) {
|
if (mapping && !mapping_mapped(mapping)) {
|
||||||
|
int dirty = test_bit(PG_dcache_dirty, &page->flags);
|
||||||
if (dirty) {
|
if (dirty) {
|
||||||
|
int dirty_cpu = dcache_dirty_cpu(page);
|
||||||
|
|
||||||
if (dirty_cpu == this_cpu)
|
if (dirty_cpu == this_cpu)
|
||||||
goto out;
|
goto out;
|
||||||
smp_flush_dcache_page_impl(page, dirty_cpu);
|
smp_flush_dcache_page_impl(page, dirty_cpu);
|
||||||
|
|
Loading…
Reference in New Issue