On Wed, Feb 29, 2012 at 09:21:23AM -0800, Eugene Surovegin wrote: > Per-CPU allocations are not guaranteed to be physically contiguous. > However, kdump kernel and user-space code assumes that per-CPU > memory, used for saving CPU registers on crash, is. > This can cause corrupted /proc/vmcore in some cases - the main > symptom being huge ELF note section. > > Force page alignment for note_buf_t to ensure that this assumption holds. Ouch. I'm surprised there is an allocation on crash, perhaps it could at least be done earlier? And am I right in thinking that this change increases the likely hood that the allocation could fail? > > Signed-off-by: Eugene Surovegin <surovegin at google.com> > CC: Eric Biederman <ebiederm at xmission.com> > CC: Vivek Goyal <vgoyal at redhat.com> > CC: kexec-list <kexec at lists.infradead.org> > --- > kernel/kexec.c | 9 +++++++-- > 1 files changed, 7 insertions(+), 2 deletions(-) > > diff --git a/kernel/kexec.c b/kernel/kexec.c > index 7b08867..e641b5c 100644 > --- a/kernel/kexec.c > +++ b/kernel/kexec.c > @@ -1232,8 +1232,13 @@ void crash_save_cpu(struct pt_regs *regs, int cpu) > > static int __init crash_notes_memory_init(void) > { > - /* Allocate memory for saving cpu registers. */ > - crash_notes = alloc_percpu(note_buf_t); > + /* Allocate memory for saving cpu registers. > + * Force page alignment to avoid crossing physical page boundary - > + * kexec-tools and kernel /proc/vmcore handler assume these per-CPU > + * chunks are physically contiguous. > + */ > + crash_notes = (note_buf_t __percpu *)__alloc_percpu(sizeof(note_buf_t), > + PAGE_SIZE); > if (!crash_notes) { > printk("Kexec: Memory allocation for saving cpu register" > " states failed\n"); > -- > 1.7.9.1 > > > _______________________________________________ > kexec mailing list > kexec at lists.infradead.org > http://lists.infradead.org/mailman/listinfo/kexec >