All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86: saving vmcore with non-lazy freeing of vmas
@ 2010-09-16 16:44 ` Cliff Wickman
  0 siblings, 0 replies; 3+ messages in thread
From: Cliff Wickman @ 2010-09-16 16:44 UTC (permalink / raw)
  To: kexec, mingo; +Cc: linux-kernel

From: Cliff Wickman <cpw@sgi.com>

During the reading of /proc/vmcore the kernel is doing ioremap()/iounmap()
repeatedly. And the buildup of un-flushed vm_area_struct's is causing
a great deal of overhead. (rb_next() is chewing up most of that time).

This solution is to provide function set_iounmap_nonlazy(). It causes a
subsequent call to iounmap() to immediately purge the vma area (with
try_purge_vmap_area_lazy()).

With this patch we have seen the time for writing a 250MB compressed dump
drop from 71 seconds to 44 seconds.

Diffed against 2.6.36-rc3

Signed-off-by: Cliff Wickman <cpw@sgi.com>

---
 arch/x86/include/asm/io.h       |    1 +
 arch/x86/kernel/crash_dump_64.c |    1 +
 mm/vmalloc.c                    |    9 +++++++++
 3 files changed, 11 insertions(+)

Index: linus.current/arch/x86/kernel/crash_dump_64.c
===================================================================
--- linus.current.orig/arch/x86/kernel/crash_dump_64.c
+++ linus.current/arch/x86/kernel/crash_dump_64.c
@@ -46,6 +46,7 @@ ssize_t copy_oldmem_page(unsigned long p
 	} else
 		memcpy(buf, vaddr + offset, csize);
 
+	set_iounmap_nonlazy();
 	iounmap(vaddr);
 	return csize;
 }
Index: linus.current/mm/vmalloc.c
===================================================================
--- linus.current.orig/mm/vmalloc.c
+++ linus.current/mm/vmalloc.c
@@ -517,6 +517,15 @@ static atomic_t vmap_lazy_nr = ATOMIC_IN
 static void purge_fragmented_blocks_allcpus(void);
 
 /*
+ * called before a call to iounmap() if the caller wants vm_area_struct's
+ * immediately freed.
+ */
+void set_iounmap_nonlazy(void)
+{
+	atomic_set(&vmap_lazy_nr, lazy_max_pages()+1);
+}
+
+/*
  * Purges all lazily-freed vmap areas.
  *
  * If sync is 0 then don't purge if there is already a purge in progress.
Index: linus.current/arch/x86/include/asm/io.h
===================================================================
--- linus.current.orig/arch/x86/include/asm/io.h
+++ linus.current/arch/x86/include/asm/io.h
@@ -206,6 +206,7 @@ static inline void __iomem *ioremap(reso
 
 extern void iounmap(volatile void __iomem *addr);
 
+extern void set_iounmap_nonlazy(void);
 
 #ifdef __KERNEL__
 

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2010-09-17  8:29 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-09-16 16:44 [PATCH] x86: saving vmcore with non-lazy freeing of vmas Cliff Wickman
2010-09-16 16:44 ` Cliff Wickman
2010-09-17  8:29 ` [tip:x86/mm] mm, x86: Saving " tip-bot for Cliff Wickman

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.