From: David Gibson <david@gibson.dropbear.id.au>
To: paulus@samba.org, aik@ozlabs.ru, benh@kernel.crashing.org
Cc: bharata@linux.vnet.ibm.com, linuxppc-dev@lists.ozlabs.org,
David Gibson <david@gibson.dropbear.id.au>
Subject: [RFC 08/18] pseries: Automatically resize HPT for memory hot add/remove
Date: Thu, 3 Mar 2016 12:59:39 +1100 [thread overview]
Message-ID: <1456970389-28802-9-git-send-email-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <1456970389-28802-1-git-send-email-david@gibson.dropbear.id.au>
We've now implemented code in the pseries platform to use the new PAPR
interface to allow resizing the hash page table (HPT) at runtime.
This patch uses that interface to automatically attempt to resize the HPT
when memory is hot added or removed. This tries to always keep the HPT at
a reasonable size for our current memory size.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Paul Mackerras <paulus@samba.org>
---
arch/powerpc/include/asm/sparsemem.h | 1 +
arch/powerpc/mm/hash_utils_64.c | 29 +++++++++++++++++++++++++++++
arch/powerpc/mm/mem.c | 4 ++++
3 files changed, 34 insertions(+)
diff --git a/arch/powerpc/include/asm/sparsemem.h b/arch/powerpc/include/asm/sparsemem.h
index f6fc0ee..737335c 100644
--- a/arch/powerpc/include/asm/sparsemem.h
+++ b/arch/powerpc/include/asm/sparsemem.h
@@ -16,6 +16,7 @@
#endif /* CONFIG_SPARSEMEM */
#ifdef CONFIG_MEMORY_HOTPLUG
+extern void resize_hpt_for_hotplug(unsigned long new_mem_size);
extern int create_section_mapping(unsigned long start, unsigned long end);
extern int remove_section_mapping(unsigned long start, unsigned long end);
#ifdef CONFIG_NUMA
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
index 0809bea..6fbc27a 100644
--- a/arch/powerpc/mm/hash_utils_64.c
+++ b/arch/powerpc/mm/hash_utils_64.c
@@ -645,6 +645,35 @@ static unsigned long __init htab_get_table_size(void)
}
#ifdef CONFIG_MEMORY_HOTPLUG
+void resize_hpt_for_hotplug(unsigned long new_mem_size)
+{
+ unsigned target_hpt_shift;
+
+ if (!ppc_md.resize_hpt)
+ return;
+
+ target_hpt_shift = htab_shift_for_mem_size(new_mem_size);
+
+ /*
+ * To avoid lots of HPT resizes if memory size is fluctuating
+ * across a boundary, we deliberately have some hysterisis
+ * here: we immediately increase the HPT size if the target
+ * shift exceeds the current shift, but we won't attempt to
+ * reduce unless the target shift is at least 2 below the
+ * current shift
+ */
+ if ((target_hpt_shift > ppc64_pft_size)
+ || (target_hpt_shift < (ppc64_pft_size - 1))) {
+ int rc;
+
+ rc = ppc_md.resize_hpt(target_hpt_shift);
+ if (rc)
+ printk(KERN_WARNING
+ "Unable to resize hash page table to target order %d: %d\n",
+ target_hpt_shift, rc);
+ }
+}
+
int create_section_mapping(unsigned long start, unsigned long end)
{
int rc = htab_bolt_mapping(start, end, __pa(start),
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index f980da6..4938ee7 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -121,6 +121,8 @@ int arch_add_memory(int nid, u64 start, u64 size, bool for_device)
unsigned long nr_pages = size >> PAGE_SHIFT;
int rc;
+ resize_hpt_for_hotplug(memblock_phys_mem_size());
+
pgdata = NODE_DATA(nid);
start = (unsigned long)__va(start);
@@ -161,6 +163,8 @@ int arch_remove_memory(u64 start, u64 size)
*/
vm_unmap_aliases();
+ resize_hpt_for_hotplug(memblock_phys_mem_size());
+
return ret;
}
#endif
--
2.5.0
next prev parent reply other threads:[~2016-03-03 1:59 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-03 1:59 [RFC 00/18] PAPR HPT resizing, guest side & host side preliminaries David Gibson
2016-03-03 1:59 ` [RFC 01/18] powerpc/mm: Clean up error handling for htab_remove_mapping David Gibson
2016-03-03 1:59 ` [RFC 02/18] powerpc/mm: Handle removing maybe-present bolted HPTEs David Gibson
2016-03-03 1:59 ` [RFC 03/18] powerpc/mm: Clean up memory hotplug failure paths David Gibson
2016-03-03 1:59 ` [RFC 04/18] powerpc/mm: Split hash page table sizing heuristic into a helper David Gibson
2016-03-03 1:59 ` [RFC 05/18] pseries: Add hypercall wrappers for hash page table resizing David Gibson
2016-03-03 1:59 ` [RFC 06/18] pseries: Add support for hash " David Gibson
2016-03-03 1:59 ` [RFC 07/18] pseries: Advertise HPT resizing support via CAS David Gibson
2016-03-03 1:59 ` David Gibson [this message]
2016-03-03 1:59 ` [RFC 09/18] powerpc/kvm: Corectly report KVM_CAP_PPC_ALLOC_HTAB David Gibson
2016-03-03 1:59 ` [RFC 10/18] powerpc/kvm: Add capability flag for hashed page table resizing David Gibson
2016-03-03 1:59 ` [RFC 11/18] powerpc/kvm: Rename kvm_alloc_hpt() for clarity David Gibson
2016-03-03 1:59 ` [RFC 12/18] powerpc/kvm: Gather HPT related variables into sub-structure David Gibson
2016-03-03 1:59 ` [RFC 13/18] powerpc/kvm: Don't store values derivable from HPT order David Gibson
2016-03-03 1:59 ` [RFC 14/18] powerpc/kvm: Split HPT allocation from activation David Gibson
2016-03-03 1:59 ` [RFC 15/18] powerpc/kvm: Allow KVM_PPC_ALLOCATE_HTAB ioctl() to change HPT size David Gibson
2016-03-03 1:59 ` [RFC 16/18] powerpc/kvm: HPT resizing stub implementation David Gibson
2016-03-03 1:59 ` [RFC 17/18] powerpc/kvm: Advertise availablity of HPT resizing on KVM HV David Gibson
2016-03-03 1:59 ` [RFC 18/18] powerpc/kvm: Outline of HPT resizing implementation David Gibson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1456970389-28802-9-git-send-email-david@gibson.dropbear.id.au \
--to=david@gibson.dropbear.id.au \
--cc=aik@ozlabs.ru \
--cc=benh@kernel.crashing.org \
--cc=bharata@linux.vnet.ibm.com \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=paulus@samba.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).