powerpc: Allow ppc_md platform hook to override memory_block_size_bytes
PATCH v2 1/2 powerpc: Allow ppc_md platform hook to override memory_block_size_bytes
The pseries platform code unconditionally overrides memory_block_size_bytes regardless of the running platform.
Create a ppc_md hook that so each platform can choose to do what it wants.
Signed-off-by Anton Blanchard <[email protected]>
--- arch/powerpc/include/asm/machdep.h | 3 +++ arch/powerpc/kernel/setup_64.c | 10 ++++++++++ arch/powerpc/platforms/pseries/hotplug-memory.c | 17 +++-------------- arch/powerpc/platforms/pseries/pseries.h | 2 ++ arch/powerpc/platforms/pseries/setup.c | 3 +++ 5 files changed, 21 insertions(+), 14 deletions(-)
arch/powerpc/include/asm/machdep.h +3 -0
@@ -98,6 +98,9 @@ struct machdep_calls {void (*iommu_save)(void );void (*iommu_restore)(void );#endif +#ifdef CONFIG_MEMORY_HOTPLUG_SPARSE +unsigned long (*memory_block_size)(void ); +#endif #endif /* CONFIG_PPC64 */ void (*pci_dma_dev_setup)(struct pci_dev *dev);
arch/powerpc/kernel/setup_64.c +10 -0
@@ -36,6 +36,7 @@#include <linux/lockdep.h> #include <linux/memblock.h> #include <linux/hugetlb.h> +#include <linux/memory.h> #include <asm/io.h> #include <asm/kdump.h>
@@ -780,6 +781,15 @@ void __init setup_per_cpu_areas(void) }#endif +#ifdef CONFIG_MEMORY_HOTPLUG_SPARSE +unsigned long memory_block_size_bytes (void ) +{ +if (ppc_md.memory_block_size) +return ppc_md.memory_block_size (); + +return MIN_MEMORY_BLOCK_SIZE ; +} +#endif #if defined(CONFIG_PPC_INDIRECT_PIO ) || defined(CONFIG_PPC_INDIRECT_MMIO )struct ppc_pci_io ppc_pci_io;
arch/powerpc/platforms/pseries/hotplug-memory.c +3 -14
@@ -21,7 +21,7 @@#include <asm/prom.h> #include <asm/sparsemem.h> -static unsigned long get_memblock_size (void ) +unsigned long pseries_memory_block_size (void ) {struct device_node *np;unsigned int memblock_size =MIN_MEMORY_BLOCK_SIZE ;
@@ -64,17 +64,6 @@ static unsigned long get_memblock_size(void)return memblock_size; } -/* WARNING: This is going to override the generic definition whenever -* pseries is built-in regardless of what platform is active at boot -* time. This is fine for now as this is the only "option" and it -* should work everywhere. If not, we'll have to turn this into a -* ppc_md. callback -*/ -unsigned long memory_block_size_bytes (void ) -{ -return get_memblock_size (); -} -#ifdef CONFIG_MEMORY_HOTREMOVE static int pseries_remove_memory (u64 start,u64 size) {
@@ -105,7 +94,7 @@ static int pseries_remove_memblock(unsigned long base, unsigned int memblock_sizif (!pfn_valid (start_pfn)) goto out; - block_sz =memory_block_size_bytes (); + block_sz =pseries_memory_block_size (); sections_per_block = block_sz /MIN_MEMORY_BLOCK_SIZE ; nid =memory_add_physaddr_to_nid (base);
@@ -201,7 +190,7 @@ static int pseries_update_drconf_memory(struct of_prop_reconfig *pr)u32 *p;int i, rc = -EINVAL ; - memblock_size =get_memblock_size (); + memblock_size =pseries_memory_block_size ();if (!memblock_size)return -EINVAL ;
arch/powerpc/platforms/pseries/pseries.h +2 -0
@@ -64,4 +64,6 @@ extern int dlpar_detach_node(struct device_node *);struct pci_host_bridge ;int pseries_root_bridge_prepare (struct pci_host_bridge *bridge); +unsigned long pseries_memory_block_size (void ); +#endif /* _PSERIES_PSERIES_H */
arch/powerpc/platforms/pseries/setup.c +3 -0
@@ -810,4 +810,7 @@ define_machine(pseries) {#ifdef CONFIG_KEXEC .machine_kexec = pSeries_machine_kexec,#endif +#ifdef CONFIG_MEMORY_HOTPLUG_SPARSE + .memory_block_size = pseries_memory_block_size, +#endif };
Signature · 1 line
1.9.1
PATCH v2 2/2 powerpc/powernv: Set memory_block_size_bytes to 256MB
powerpc sets a low SECTION_SIZE_BITS to accomodate small pseries boxes. We default to 16MB memory blocks, and boxes with a lot of memory end up with enormous numbers of sysfs memory nodes.
Set a more reasonable default for powernv of 256MB.
Signed-off-by Anton Blanchard <[email protected]>
--- arch/powerpc/platforms/powernv/setup.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
arch/powerpc/platforms/powernv/setup.c +10 -0
@@ -244,6 +244,13 @@ static void pnv_kexec_cpu_down(int crash_shutdown, int secondary) }#endif /* CONFIG_KEXEC */ +#ifdef CONFIG_MEMORY_HOTPLUG_SPARSE +static unsigned long pnv_memory_block_size (void ) +{ +return 256UL *1024 *1024 ; +} +#endif +static void __init pnv_setup_machdep_opal (void ) { ppc_md.get_boot_time = opal_get_boot_time;
@@ -326,4 +333,7 @@ define_machine(powernv) {#ifdef CONFIG_KEXEC .kexec_cpu_down = pnv_kexec_cpu_down,#endif +#ifdef CONFIG_MEMORY_HOTPLUG_SPARSE + .memory_block_size = pnv_memory_block_size, +#endif };
Signature · 1 line
1.9.1