From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 88D16C433E0 for ; Fri, 12 Mar 2021 07:32:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 67C9864F6D for ; Fri, 12 Mar 2021 07:32:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231725AbhCLHc0 (ORCPT ); Fri, 12 Mar 2021 02:32:26 -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-Google-Smtp-Source: ABdhPJyfSXCBtJL+8rrzAmK7RWJPFCVC4RYg2LBf6U8/N6ZSe055Myz7T7HEnkfqwjwo7XNHWtkL/g== 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