Received: by 10.223.185.116 with SMTP id b49csp8279016wrg; Thu, 1 Mar 2018 21:52:50 -0800 (PST) X-Google-Smtp-Source: AG47ELs5k6vCC8T+BiDthrWZKCd+aOJ+RX+n/aslXrnvk3/tS2gWuXvDghKOjqpo/+a8nhKtsub0 X-Received: by 10.101.81.132 with SMTP id h4mr3701175pgq.332.1519969970431; Thu, 01 Mar 2018 21:52:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519969970; cv=none; d=google.com; s=arc-20160816; b=LgapL+6PDw0ALnAkPP61qt9QvbUCj98ttT0eBqg8cDwFc9vPJ5+vGb1K+/SDGWjOWs NPoNf8oDhj8cxoOs6ih8eLYJw7mez+G0+w6vykpFnrb58Nku26NBDJOnu0CyDbOkaFDk +oZkcfdPQiR2TQJq5C395yzwqXyx8xWbw8R3v0fh//KjVR/aeBy9NJTmTElQwFVoZMwb zVIloGNdX9/8Jz5PZ+9oJQKGbtoJ6guHgLdsKiFW4rT2YTozTxHHc7D2hDG1pE0rBGpx nEm1ItErkg+PlitTqnMmUfn7/xZLHIcAUck/PmUkf8bwQ62XjBvemUoMaJx8ZH9gPb36 sXnQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:arc-authentication-results; bh=Fv4ROu/TH8i59kzEl82evhut/mx4TUD+GfOgAxmF3rg=; b=WuXk9YZU5sPLx+nbYQ2uvO+0oZTUSALEtF5uTLoUVitVMaQt90PFWSyF+XYsXheJ9s gUFGplCB9EtKmoXI0AD11M70tjFel9hx11Z40QeIaDTBqV/++GXquG3t/sMLbVKKWbMq ddH6tU9NVM3u6YUqoj5DSEGKbFIwvLeXh+l+xhoSFdoEnHNgrCqvP+ev0QsSI1Fj/E7X JF3tPudKqUs8dJVZRPmbCwtPY4XnVRyWaOwxRcuHbDvbiSmoKUewqm+i3vzc7G18CSEz ztk92B0WNeNTNSiH1nx1w+0iVWziGTtfE83Z1ULU+ZNg/aAf3ld2588Iu4JxGtNC6ky+ 8tSA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ba12-v6si740312plb.470.2018.03.01.21.52.35; Thu, 01 Mar 2018 21:52:50 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935717AbeCBFcG (ORCPT + 99 others); Fri, 2 Mar 2018 00:32:06 -0500 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:55426 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932845AbeCBFcD (ORCPT ); Fri, 2 Mar 2018 00:32:03 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5BD6B40744C6; Fri, 2 Mar 2018 05:32:02 +0000 (UTC) Received: from dhcp-128-65.nay.redhat.com (ovpn-12-90.pek2.redhat.com [10.72.12.90]) by smtp.corp.redhat.com (Postfix) with ESMTPS id EA663946D5; Fri, 2 Mar 2018 05:31:57 +0000 (UTC) Date: Fri, 2 Mar 2018 13:31:53 +0800 From: Dave Young To: AKASHI Takahiro Cc: vgoyal@redhat.com, bhe@redhat.com, mpe@ellerman.id.au, bauerman@linux.vnet.ibm.com, prudo@linux.vnet.ibm.com, kexec@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Subject: Re: [PATCH 5/7] x86: kexec_file: lift CRASH_MAX_RANGES limit on crash_mem buffer Message-ID: <20180302053153.GC2952@dhcp-128-65.nay.redhat.com> References: <20180227044814.24808-1-takahiro.akashi@linaro.org> <20180227044814.24808-6-takahiro.akashi@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180227044814.24808-6-takahiro.akashi@linaro.org> User-Agent: Mutt/1.9.1 (2017-09-22) X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Fri, 02 Mar 2018 05:32:02 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Fri, 02 Mar 2018 05:32:02 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'dyoung@redhat.com' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 02/27/18 at 01:48pm, AKASHI Takahiro wrote: > While CRASH_MAX_RANGES (== 16) seems to be good enough, fixed-number > array is not a good idea in general. > > In this patch, size of crash_mem buffer is calculated as before and > the buffer is now dynamically allocated. This change also allows removing > crash_elf_data structure. > > Signed-off-by: AKASHI Takahiro > Cc: Dave Young > Cc: Vivek Goyal > Cc: Baoquan He > --- > arch/x86/kernel/crash.c | 80 ++++++++++++++++++------------------------------- > 1 file changed, 29 insertions(+), 51 deletions(-) > > diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c > index 913fd8021f8a..bfc37ad20d4a 100644 > --- a/arch/x86/kernel/crash.c > +++ b/arch/x86/kernel/crash.c > @@ -41,32 +41,14 @@ > /* Alignment required for elf header segment */ > #define ELF_CORE_HEADER_ALIGN 4096 > > -/* This primarily represents number of split ranges due to exclusion */ > -#define CRASH_MAX_RANGES 16 > - > struct crash_mem_range { > u64 start, end; > }; > > struct crash_mem { > - unsigned int nr_ranges; > - struct crash_mem_range ranges[CRASH_MAX_RANGES]; > -}; > - > -/* Misc data about ram ranges needed to prepare elf headers */ > -struct crash_elf_data { > - struct kimage *image; > - /* > - * Total number of ram ranges we have after various adjustments for > - * crash reserved region, etc. > - */ > unsigned int max_nr_ranges; > - > - /* Pointer to elf header */ > - void *ehdr; > - /* Pointer to next phdr */ > - void *bufp; > - struct crash_mem mem; > + unsigned int nr_ranges; > + struct crash_mem_range ranges[0]; > }; > > /* Used while preparing memory map entries for second kernel */ > @@ -217,26 +199,29 @@ static int get_nr_ram_ranges_callback(struct resource *res, void *arg) > return 0; > } > > - > /* Gather all the required information to prepare elf headers for ram regions */ > -static void fill_up_crash_elf_data(struct crash_elf_data *ced, > - struct kimage *image) > +static struct crash_mem *fill_up_crash_elf_data(void) > { > unsigned int nr_ranges = 0; > - > - ced->image = image; > + struct crash_mem *cmem; > > walk_system_ram_res(0, -1, &nr_ranges, > get_nr_ram_ranges_callback); I know it is probably not possible fail here, but for safe we can check if nr_ranges == 0 > > - ced->max_nr_ranges = nr_ranges; > + /* > + * Exclusion of crash region and/or crashk_low_res may cause > + * another range split. So add extra two slots here. > + */ > + nr_ranges += 2; > + cmem = vmalloc(sizeof(struct crash_mem) + > + sizeof(struct crash_mem_range) * nr_ranges); > + if (!cmem) > + return NULL; vzalloc will be better. > > - /* Exclusion of crash region could split memory ranges */ > - ced->max_nr_ranges++; > + cmem->max_nr_ranges = nr_ranges; > + cmem->nr_ranges = 0; > > - /* If crashk_low_res is not 0, another range split possible */ > - if (crashk_low_res.end) > - ced->max_nr_ranges++; > + return cmem; > } > > static int exclude_mem_range(struct crash_mem *mem, > @@ -293,10 +278,8 @@ static int exclude_mem_range(struct crash_mem *mem, > return 0; > > /* Split happened */ > - if (i == CRASH_MAX_RANGES - 1) { > - pr_err("Too many crash ranges after split\n"); > + if (i == mem->max_nr_ranges - 1) > return -ENOMEM; > - } > > /* Location where new range should go */ > j = i + 1; > @@ -314,11 +297,10 @@ static int exclude_mem_range(struct crash_mem *mem, > > /* > * Look for any unwanted ranges between mstart, mend and remove them. This > - * might lead to split and split ranges are put in ced->mem.ranges[] array > + * might lead to split and split ranges are put in cmem->ranges[] array > */ > -static int elf_header_exclude_ranges(struct crash_elf_data *ced) > +static int elf_header_exclude_ranges(struct crash_mem *cmem) > { > - struct crash_mem *cmem = &ced->mem; > int ret = 0; > > /* Exclude crashkernel region */ > @@ -337,8 +319,7 @@ static int elf_header_exclude_ranges(struct crash_elf_data *ced) > > static int prepare_elf64_ram_headers_callback(struct resource *res, void *arg) > { > - struct crash_elf_data *ced = arg; > - struct crash_mem *cmem = &ced->mem; > + struct crash_mem *cmem = arg; > > cmem->ranges[cmem->nr_ranges].start = res->start; > cmem->ranges[cmem->nr_ranges].end = res->end; > @@ -347,7 +328,7 @@ static int prepare_elf64_ram_headers_callback(struct resource *res, void *arg) > return 0; > } > > -static int prepare_elf64_headers(struct crash_elf_data *ced, int kernel_map, > +static int prepare_elf64_headers(struct crash_mem *cmem, int kernel_map, > void **addr, unsigned long *sz) > { > Elf64_Ehdr *ehdr; > @@ -356,12 +337,11 @@ static int prepare_elf64_headers(struct crash_elf_data *ced, int kernel_map, > unsigned char *buf, *bufp; > unsigned int cpu, i; > unsigned long long notes_addr; > - struct crash_mem *cmem = &ced->mem; > unsigned long mstart, mend; > > /* extra phdr for vmcoreinfo elf note */ > nr_phdr = nr_cpus + 1; > - nr_phdr += ced->max_nr_ranges; > + nr_phdr += cmem->nr_ranges; > > /* > * kexec-tools creates an extra PT_LOAD phdr for kernel text mapping > @@ -455,29 +435,27 @@ static int prepare_elf64_headers(struct crash_elf_data *ced, int kernel_map, > static int prepare_elf_headers(struct kimage *image, void **addr, > unsigned long *sz) > { > - struct crash_elf_data *ced; > + struct crash_mem *cmem; > Elf64_Ehdr *ehdr; > Elf64_Phdr *phdr; > int ret, i; > > - ced = kzalloc(sizeof(*ced), GFP_KERNEL); > - if (!ced) > + cmem = fill_up_crash_elf_data(); > + if (!cmem) > return -ENOMEM; > > - fill_up_crash_elf_data(ced, image); > - > - ret = walk_system_ram_res(0, -1, ced, > + ret = walk_system_ram_res(0, -1, cmem, > prepare_elf64_ram_headers_callback); > if (ret) > goto out; > > /* Exclude unwanted mem ranges */ > - ret = elf_header_exclude_ranges(ced); > + ret = elf_header_exclude_ranges(cmem); > if (ret) > goto out; > > /* By default prepare 64bit headers */ > - ret = prepare_elf64_headers(ced, > + ret = prepare_elf64_headers(cmem, > (int)IS_ENABLED(CONFIG_X86_64), addr, sz); > if (ret) > goto out; > @@ -496,7 +474,7 @@ static int prepare_elf_headers(struct kimage *image, void **addr, > break; > } > out: > - kfree(ced); > + vfree(cmem); > return ret; > } > > -- > 2.16.2 > Thanks Dave