Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp577944ybt; Fri, 19 Jun 2020 08:34:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxcAeBb8y1BkxD2moh6R54+yRvcaMj6FoBCkArg5ZAct9tCkq6F6aTRPMzNNouWSn6S2uGi X-Received: by 2002:a17:906:c53:: with SMTP id t19mr4456551ejf.143.1592580841956; Fri, 19 Jun 2020 08:34:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592580841; cv=none; d=google.com; s=arc-20160816; b=R5hr9Wr9q79LphaSroS48ViNNLyQ5P/xloSW2vUleaRZYvh4DpGQZk6+U6mJDGp0Hx 5KDlDo5gCYPaLzvizVOw7/6c5SOS0l1Tkwt6SUx7wl7Dm/jdRhb/zAMU2YAI/YnQj+Cl OvCBEi2wd7MW26ofONH6oiZ3UNfjyW/1gQ0AXrJj766w279HzCapzrXoZPJ8+CJ+awik gfu00y+XRLYI4kbI+xJFCX85s498PCnrk+9C5nFk5pFNM4p7FBNqrk4BzKczil7F9m1m De4wW/KH1vqeNsT/8GVQmBo2uW4zGUhIf+0v8kVUMGjULNJToovadM5SxbAj3gZ2KeKp N4Dw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ks5RJsc5OqO1VwOAuZwmMPZxkdjEp13PZnLgtfVDkwc=; b=fbeKR8IZOoDCHUkBsU4+Cax5toqxd6Os8/suE8v7TA0f1T82Tigs/K+kLN/gILZsbM /fbnr5PtSVBllyRMg7zmtYAxZmSa0PN246/YZ46CRYjZG5k9ZVv8DWQB997TDDUz900w y4fI8kJfGOH0H9b4H/Zl9VS1Zce1+6I0euioantrGOEkZcuiUR6PqbpVKqmf0C2ThWLO 1tdN4OWCYJOT166uXf5r2aNoqj395YoeatXWjiauYCgY9cKMkr2xnO3ncRSEt8tPoXBL vkTMkt6PypK328z9MORKr/xqFj5l6fxYqXuY734fu5pvtp9mArpQ0TsOa6X4skvroUNR VqAw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=XiZQ72YZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id jp23si4160795ejb.749.2020.06.19.08.33.39; Fri, 19 Jun 2020 08:34:01 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=XiZQ72YZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2393757AbgFSPa5 (ORCPT + 99 others); Fri, 19 Jun 2020 11:30:57 -0400 Received: from mail.kernel.org ([198.145.29.99]:34666 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2404800AbgFSPao (ORCPT ); Fri, 19 Jun 2020 11:30:44 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id BE02B20757; Fri, 19 Jun 2020 15:30:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592580643; bh=2HfZbLzoKHoujmOt1fTIJ6DdkGvS8uZOftDye/Emu7A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XiZQ72YZlOwHnqzzk3Ok9sB9hxvk6vULL/in69HOHtNYSjaOoovhmGBThVvtG+uT8 +u9HgtXAkxy10S3xnW2xWp8H5orbZd5+L06XPofIlLjGgvMLoB5SQ4GRSdgv8+aTaP H0UOHDvhxpVUbuQFZ94pxAnfR5934UndFGP1z454= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Hari Bathini , Mahesh Salgaonkar , Michael Ellerman Subject: [PATCH 5.7 328/376] powerpc/fadump: consider reserved ranges while reserving memory Date: Fri, 19 Jun 2020 16:34:06 +0200 Message-Id: <20200619141725.860214679@linuxfoundation.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200619141710.350494719@linuxfoundation.org> References: <20200619141710.350494719@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Hari Bathini commit 140777a3d8dfdb3d3f20ea7707c0f1c0ce1b0aa5 upstream. Commit 0962e8004e97 ("powerpc/prom: Scan reserved-ranges node for memory reservations") enabled support to parse reserved-ranges DT node and reserve kernel memory falling in these ranges for F/W purposes. Memory reserved for FADump should not overlap with these ranges as it could corrupt memory meant for F/W or crash'ed kernel memory to be exported as vmcore. But since commit 579ca1a27675 ("powerpc/fadump: make use of memblock's bottom up allocation mode"), memblock_find_in_range() is being used to find the appropriate area to reserve memory for FADump, which can't account for reserved-ranges as these ranges are reserved only after FADump memory reservation. With reserved-ranges now being populated during early boot, look out for these memory ranges while reserving memory for FADump. Without this change, MPIPL on PowerNV systems aborts with hostboot failure, when memory reserved for FADump is less than 4096MB. Fixes: 579ca1a27675 ("powerpc/fadump: make use of memblock's bottom up allocation mode") Cc: stable@vger.kernel.org Signed-off-by: Hari Bathini Reviewed-by: Mahesh Salgaonkar Signed-off-by: Michael Ellerman Link: https://lore.kernel.org/r/158737297693.26700.16193820746269425424.stgit@hbathini.in.ibm.com Signed-off-by: Greg Kroah-Hartman --- arch/powerpc/kernel/fadump.c | 76 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 67 insertions(+), 9 deletions(-) --- a/arch/powerpc/kernel/fadump.c +++ b/arch/powerpc/kernel/fadump.c @@ -445,10 +445,72 @@ static int __init fadump_get_boot_mem_re return ret; } +/* + * Returns true, if the given range overlaps with reserved memory ranges + * starting at idx. Also, updates idx to index of overlapping memory range + * with the given memory range. + * False, otherwise. + */ +static bool overlaps_reserved_ranges(u64 base, u64 end, int *idx) +{ + bool ret = false; + int i; + + for (i = *idx; i < reserved_mrange_info.mem_range_cnt; i++) { + u64 rbase = reserved_mrange_info.mem_ranges[i].base; + u64 rend = rbase + reserved_mrange_info.mem_ranges[i].size; + + if (end <= rbase) + break; + + if ((end > rbase) && (base < rend)) { + *idx = i; + ret = true; + break; + } + } + + return ret; +} + +/* + * Locate a suitable memory area to reserve memory for FADump. While at it, + * lookup reserved-ranges & avoid overlap with them, as they are used by F/W. + */ +static u64 __init fadump_locate_reserve_mem(u64 base, u64 size) +{ + struct fadump_memory_range *mrngs; + phys_addr_t mstart, mend; + int idx = 0; + u64 i, ret = 0; + + mrngs = reserved_mrange_info.mem_ranges; + for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE, + &mstart, &mend, NULL) { + pr_debug("%llu) mstart: %llx, mend: %llx, base: %llx\n", + i, mstart, mend, base); + + if (mstart > base) + base = PAGE_ALIGN(mstart); + + while ((mend > base) && ((mend - base) >= size)) { + if (!overlaps_reserved_ranges(base, base+size, &idx)) { + ret = base; + goto out; + } + + base = mrngs[idx].base + mrngs[idx].size; + base = PAGE_ALIGN(base); + } + } + +out: + return ret; +} + int __init fadump_reserve_mem(void) { - u64 base, size, mem_boundary, bootmem_min, align = PAGE_SIZE; - bool is_memblock_bottom_up = memblock_bottom_up(); + u64 base, size, mem_boundary, bootmem_min; int ret = 1; if (!fw_dump.fadump_enabled) @@ -469,9 +531,9 @@ int __init fadump_reserve_mem(void) PAGE_ALIGN(fadump_calculate_reserve_size()); #ifdef CONFIG_CMA if (!fw_dump.nocma) { - align = FADUMP_CMA_ALIGNMENT; fw_dump.boot_memory_size = - ALIGN(fw_dump.boot_memory_size, align); + ALIGN(fw_dump.boot_memory_size, + FADUMP_CMA_ALIGNMENT); } #endif @@ -539,11 +601,7 @@ int __init fadump_reserve_mem(void) * Reserve memory at an offset closer to bottom of the RAM to * minimize the impact of memory hot-remove operation. */ - memblock_set_bottom_up(true); - base = memblock_find_in_range(base, mem_boundary, size, align); - - /* Restore the previous allocation mode */ - memblock_set_bottom_up(is_memblock_bottom_up); + base = fadump_locate_reserve_mem(base, size); if (!base) { pr_err("Failed to find memory chunk for reservation!\n");