Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751215AbbG3FLQ (ORCPT ); Thu, 30 Jul 2015 01:11:16 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33506 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750882AbbG3FLP (ORCPT ); Thu, 30 Jul 2015 01:11:15 -0400 Date: Thu, 30 Jul 2015 13:15:53 +0800 From: Minfei Huang To: Baoquan He Cc: linux-kernel@vger.kernel.org, kexec@lists.infradead.org, tatsu@ab.jp.nec.com, lisa.mitchell@hp.com, seiji.aguchi.tr@hitachi.com, dyoung@redhat.com, vgoyal@redhat.com, ebiederm@xmission.com Subject: Re: [PATCH] align crash_notes allocation to make it be inside one physical page Message-ID: <20150730051553.GB27915@dhcp-128-25.nay.redhat.com> References: <1438225679-13052-1-git-send-email-bhe@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1438225679-13052-1-git-send-email-bhe@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2198 Lines: 52 On 07/30/15 at 11:07am, Baoquan He wrote: > People reported that crash_notes in /proc/vmcore were corrupted and > this cause crash kdump failure. With code debugging and log we got > the root cause. This is because percpu variable crash_notes are > allocated in 2 vmalloc pages. As you know percpu is based on vmalloc > by default. Then vmalloc can't guarantee 2 continuous vmalloc pages > are also on 2 continuous physical pages. Then 1st kernel export the > starting addr and size, kdump kernel use the starting addr and size > to get the content of crash_notes, then 2nd part may not be in the > next neighbouring physical page as we think. That's why nhdr_ptr->n_namesz > or nhdr_ptr->n_descsz could be very huge in update_note_header_size_elf64() > and cause note header merging failure or some warnings. > > In this patch change to call __alloc_percpu() to passed in the align > value which is nearest the the 2^log(sizeof(note_buf_t)). This align > value can make sure the crash_notes is allocated inside one physical > page since sizeof(note_buf_t) in all ARCHS is smaller PAGE_SIZE. But > add a WARN_ON in case it grow to be bigger than PAGE_SIZE in the future. > > Signed-off-by: Baoquan He > --- > kernel/kexec.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/kernel/kexec.c b/kernel/kexec.c > index a785c10..1740c42 100644 > --- a/kernel/kexec.c > +++ b/kernel/kexec.c > @@ -1620,7 +1620,16 @@ 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); > + size_t size, align; > + int order; > + > + size = sizeof(note_buf_t); > + order = get_count_order(size); > + align = 1<< order; > + > + WARN_ON(size > PAGE_SIZE); It is fine without this warning, since percpu will fail to allocate the memory larger than PAGE_SIZE. Thanks Minfei -- 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/