Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp1034909pxf; Thu, 11 Mar 2021 23:39:17 -0800 (PST) X-Google-Smtp-Source: ABdhPJwH5ISmzzS1AyhBFYto1udTYz1xznLU/W+5x+diSuiO+jzXnszX8bGkr2k11Tj7h0GsFZ0d X-Received: by 2002:aa7:da97:: with SMTP id q23mr12401344eds.180.1615534757320; Thu, 11 Mar 2021 23:39:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1615534757; cv=none; d=google.com; s=arc-20160816; b=uGM0IifpD8bszCwRA5K/LkQqPGSJc9/3xSbZ+aqkDpLaTDqWCOP/oA+DRw51KbNJQP PYhyG+4msT93nreKeDQfZuAqqy0qoWmeLRUGRUQqvKRFWxwPH2dhGFgDXdLo88WRSRiL lK8DEtRRqiOsVCeWE7Buv1RULkrokYdpb8RFu/8jQnfwPpuxG5uiRWI/uHRaqfVSeH7m BXeW9yr+P9AZ6bUwhbH6DcJZIel39k0aUMRNjUnLhz0tI/Ncl4qqcThmZiJXD45FOT6y zaToM5ZeVEdiuNDk+/qJxpr479FxAeKkakjbdQAgS5Lct2aTD05KVbMaeje28JGPSXMJ SsWw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=z052sO/4NGB1LzTDqZ+gt7AUquJ7y9J7Drl1gXLThHU=; b=VlTbWW8/gv21ZydE21gCcjuQGwy+XQDJmMVXgK5WYVNNI3hXvzruemSZPnf8Azbo7D Rkmt002+K7WrBD1JE+7bxGII7wdOpJaWlnq5TUJiVRl7boBlRp46LBqu/4Rp2FZ+5GoF qpJCZKF9LwphDb9sePFrX19uOmffwTDMmjmIV3wFEB01UMB1/HO4C7nBKrV1qQvZEqgG SNeWUHTgIn/EAlD9mDou+U2uwSujKmmmxdSCjR5Rn8vQnryu8CSafwFQ4JnDXEZ8jgCg WscoS27WAokejISgCKREmjuG2j71WmKHocSATe1MJzs+gVrvwuZD1BP+hOSoKgKbgpmK pTrA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=NG77WAYg; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id h6si426846ejc.211.2021.03.11.23.38.46; Thu, 11 Mar 2021 23:39:17 -0800 (PST) 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=@gmail.com header.s=20161025 header.b=NG77WAYg; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231700AbhCLHcZ (ORCPT + 99 others); Fri, 12 Mar 2021 02:32:25 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53532 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231613AbhCLHby (ORCPT ); Fri, 12 Mar 2021 02:31:54 -0500 Received: from mail-qk1-x732.google.com (mail-qk1-x732.google.com [IPv6:2607:f8b0:4864:20::732]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6C5B1C061574 for ; Thu, 11 Mar 2021 23:31:54 -0800 (PST) Received: by mail-qk1-x732.google.com with SMTP id l132so23394469qke.7 for ; Thu, 11 Mar 2021 23:31:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=z052sO/4NGB1LzTDqZ+gt7AUquJ7y9J7Drl1gXLThHU=; b=NG77WAYgsJT+VsleEY/Rphw3eS5xA0aCgIwZs1LZXaL5bN0l9hl1v8uAnYZuiKiaUK U4XnUtnxPm1lWURbJgD+Ksy+EJDQpuKVzGvMjBO2aLU5/bxG6Lh7cp06N85MIH1o3Apg aSGmvLfztbMxSZ5OX43sfVN28p1wz/nJBVvsv9YSDgpEoY/R/tZ3pqdpuWGvJ5EAdX6R RgXluxL5ZBQ8m5Peq3zvP0b3UwF9fNAKM4EDEjosSlLIdaBeOJtL9VHeZ9GfhyNNZtuE YDNV/SKTr2/MvU2p8XdEumcjABrSzYlAMC9VDBa5tDIxAya57cogGAHQV/bpZtnaqdfK Ugqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=z052sO/4NGB1LzTDqZ+gt7AUquJ7y9J7Drl1gXLThHU=; b=dplo7YFju0vv9UXBNpTsgaVy67M+0aoQkcIMuVP6/Wdx1J1T0rEs4p25Et135I66dV uQ9yVs+BaSpP2CZNoVG02+e2Pa3JjvsywM81VqekIIpoR5FdxAJu1WjOoWtFZUJbepBF 3gp6sOlv5MAyEAtOJeJoLwpfMnmaHcpuHWO+84ulY8naNx8iUhVfT74JPK3nWPl2DGpO cQ0CUxa8jyGbZV0y/DBAFxVOkkYWH4E2hyC2DsovKs32cyr7vWBJnDWIIuNdC3a/B2vi gUW/KTJVSCrvYJI3H5La7V/vLYG782QioF53mcfwWBDsDL5dv8ZJ/Pc9QLrNl2S7LL2U r4fA== X-Gm-Message-State: AOAM5326UrrOsSfZMwPbDjQR1psWXMu+aFHZmfOYxEr3mMGD/+/SNnbr OaDc4NkfCcn9Cr8ltiHyIXU= X-Received: by 2002:a37:2756:: with SMTP id n83mr11259204qkn.70.1615534313731; Thu, 11 Mar 2021 23:31:53 -0800 (PST) Received: from li-908e0a4c-2250-11b2-a85c-f027e903211b.ibm.com.com (177-131-89-8.dynamic.desktop.com.br. [177.131.89.8]) by smtp.gmail.com with ESMTPSA id t6sm3434026qti.2.2021.03.11.23.31.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Mar 2021 23:31:53 -0800 (PST) From: Leonardo Bras To: Michael Ellerman , Benjamin Herrenschmidt , Paul Mackerras , Andrew Morton , Leonardo Bras , Sandipan Das , "Aneesh Kumar K.V" , Logan Gunthorpe , Mike Rapoport , Bharata B Rao , Dan Williams , Nicholas Piggin , Nathan Lynch , David Hildenbrand , Laurent Dufour , Scott Cheloha , David Gibson Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/3] powerpc/mm/hash: Avoid multiple HPT resize-ups on memory hotplug Date: Fri, 12 Mar 2021 04:29:40 -0300 Message-Id: <20210312072940.598696-3-leobras.c@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210312072940.598696-1-leobras.c@gmail.com> References: <20210312072940.598696-1-leobras.c@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Every time a memory hotplug happens, and the memory limit crosses a 2^n value, it may be necessary to perform HPT resizing-up, which can take some time (over 100ms in my tests). It usually is not an issue, but it can take some time if a lot of memory is added to a guest with little starting memory: Adding 256G to a 2GB guest, for example will require 8 HPT resizes. Perform an HPT resize before memory hotplug, updating HPT to its final size (considering a successful hotplug), taking the number of HPT resizes to at most one per memory hotplug action. Signed-off-by: Leonardo Bras --- arch/powerpc/include/asm/book3s/64/hash.h | 2 ++ arch/powerpc/include/asm/sparsemem.h | 2 ++ arch/powerpc/mm/book3s64/hash_utils.c | 14 ++++++++++++++ arch/powerpc/mm/book3s64/pgtable.c | 6 ++++++ arch/powerpc/platforms/pseries/hotplug-memory.c | 6 ++++++ 5 files changed, 30 insertions(+) diff --git a/arch/powerpc/include/asm/book3s/64/hash.h b/arch/powerpc/include/asm/book3s/64/hash.h index d959b0195ad9..843b0a178590 100644 --- a/arch/powerpc/include/asm/book3s/64/hash.h +++ b/arch/powerpc/include/asm/book3s/64/hash.h @@ -255,6 +255,8 @@ int hash__create_section_mapping(unsigned long start, unsigned long end, int nid, pgprot_t prot); int hash__remove_section_mapping(unsigned long start, unsigned long end); +void hash_memory_batch_expand_prepare(unsigned long newsize); + #endif /* !__ASSEMBLY__ */ #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_BOOK3S_64_HASH_H */ diff --git a/arch/powerpc/include/asm/sparsemem.h b/arch/powerpc/include/asm/sparsemem.h index d072866842e4..16b5f5300c84 100644 --- a/arch/powerpc/include/asm/sparsemem.h +++ b/arch/powerpc/include/asm/sparsemem.h @@ -17,6 +17,8 @@ extern int remove_section_mapping(unsigned long start, unsigned long end); extern int memory_add_physaddr_to_nid(u64 start); #define memory_add_physaddr_to_nid memory_add_physaddr_to_nid +void memory_batch_expand_prepare(unsigned long newsize); + #ifdef CONFIG_NUMA extern int hot_add_scn_to_nid(unsigned long scn_addr); #else diff --git a/arch/powerpc/mm/book3s64/hash_utils.c b/arch/powerpc/mm/book3s64/hash_utils.c index cfb3ec164f56..1f6aa0bf27e7 100644 --- a/arch/powerpc/mm/book3s64/hash_utils.c +++ b/arch/powerpc/mm/book3s64/hash_utils.c @@ -858,6 +858,20 @@ int hash__remove_section_mapping(unsigned long start, unsigned long end) return rc; } + +void hash_memory_batch_expand_prepare(unsigned long newsize) +{ + /* + * Resizing-up HPT should never fail, but there are some cases system starts with higher + * SHIFT than required, and we go through the funny case of resizing HPT down while + * adding memory + */ + + while (resize_hpt_for_hotplug(newsize, false) == -ENOSPC) { + newsize *= 2; + pr_warn("Hash collision while resizing HPT\n"); + } +} #endif /* CONFIG_MEMORY_HOTPLUG */ static void __init hash_init_partition_table(phys_addr_t hash_table, diff --git a/arch/powerpc/mm/book3s64/pgtable.c b/arch/powerpc/mm/book3s64/pgtable.c index 5b3a3bae21aa..f1cd8af0f67f 100644 --- a/arch/powerpc/mm/book3s64/pgtable.c +++ b/arch/powerpc/mm/book3s64/pgtable.c @@ -193,6 +193,12 @@ int __meminit remove_section_mapping(unsigned long start, unsigned long end) return hash__remove_section_mapping(start, end); } + +void memory_batch_expand_prepare(unsigned long newsize) +{ + if (!radix_enabled()) + hash_memory_batch_expand_prepare(newsize); +} #endif /* CONFIG_MEMORY_HOTPLUG */ void __init mmu_partition_table_init(void) diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c index 8377f1f7c78e..353c71249214 100644 --- a/arch/powerpc/platforms/pseries/hotplug-memory.c +++ b/arch/powerpc/platforms/pseries/hotplug-memory.c @@ -671,6 +671,8 @@ static int dlpar_memory_add_by_count(u32 lmbs_to_add) if (lmbs_available < lmbs_to_add) return -EINVAL; + memory_batch_expand_prepare(memblock_phys_mem_size() + lmbs_to_add * drmem_lmb_size()); + for_each_drmem_lmb(lmb) { if (lmb->flags & DRCONF_MEM_ASSIGNED) continue; @@ -734,6 +736,8 @@ static int dlpar_memory_add_by_index(u32 drc_index) pr_info("Attempting to hot-add LMB, drc index %x\n", drc_index); + memory_batch_expand_prepare(memblock_phys_mem_size() + + drmem_info->n_lmbs * drmem_lmb_size()); lmb_found = 0; for_each_drmem_lmb(lmb) { if (lmb->drc_index == drc_index) { @@ -788,6 +792,8 @@ static int dlpar_memory_add_by_ic(u32 lmbs_to_add, u32 drc_index) if (lmbs_available < lmbs_to_add) return -EINVAL; + memory_batch_expand_prepare(memblock_phys_mem_size() + lmbs_to_add * drmem_lmb_size()); + for_each_drmem_lmb_in_range(lmb, start_lmb, end_lmb) { if (lmb->flags & DRCONF_MEM_ASSIGNED) continue; -- 2.29.2