[-mm PATCH] updates for hotplug memory remove
Badari Pulavarty
pbadari at us.ibm.com
Wed Jan 30 11:31:40 EST 2008
On Tue, 2008-01-29 at 14:18 +0900, Yasunori Goto wrote:
> Hello. Badari-san.
>
> Is your patch for notification the event of removing to firmware, right?
Correct.
>
> Have you ever tested hotadd(probe) of the removed memory?
Yes. I did. In my touch testing, I was able to remove memory and add
it back to the system without any issues. But again, I didn't force
the system to use that memory :(
> I'm afraid there are some differences of the status between pre hot-add
> section and the removed section by this patch. I think the mem_section of
> removed memory should be invalidated at least.
I think its a generic issue. Nothing specific for ppc64. Isn't it ?
Thanks,
Badari
>
> But anyway, this is a great first step for physical memory remove.
>
> Thanks.
>
>
> > On Mon, 2008-01-28 at 16:31 -0800, Badari Pulavarty wrote:
> >
> >
> > > 2) Can you replace the following patch with this ?
> > >
> > > add-remove_memory-for-ppc64-2.patch
> > >
> > > I found that, I do need arch-specific hooks to get the memory remove
> > > working on ppc64 LPAR. Earlier, I tried to make remove_memory() arch
> > > neutral, but we do need arch specific hooks.
> > >
> > > Thanks,
> > > Badari
> >
> > Andrew,
> >
> > Here is the patch which provides arch-specific code to complete memory
> > remove on ppc64 LPAR. So far, it works fine in my testing - but waiting
> > for ppc-experts for review and completeness.
> >
> > FYI.
> >
> > Thanks,
> > Badari
> >
> > For memory remove, we need to clean up htab mappings for the
> > section of the memory we are removing.
> >
> > This patch implements support for removing htab bolted mappings
> > for ppc64 lpar. Other sub-archs, may need to implement similar
> > functionality for the hotplug memory remove to work.
> >
> > Signed-off-by: Badari Pulavarty <pbadari at us.ibm.com>
> > ---
> > arch/powerpc/mm/hash_utils_64.c | 23 +++++++++++++++++++++++
> > arch/powerpc/mm/mem.c | 4 +++-
> > arch/powerpc/platforms/pseries/lpar.c | 15 +++++++++++++++
> > include/asm-powerpc/machdep.h | 2 ++
> > include/asm-powerpc/sparsemem.h | 1 +
> > 5 files changed, 44 insertions(+), 1 deletion(-)
> >
> > Index: linux-2.6.24-rc8/arch/powerpc/mm/hash_utils_64.c
> > ===================================================================
> > --- linux-2.6.24-rc8.orig/arch/powerpc/mm/hash_utils_64.c 2008-01-25 08:04:32.000000000 -0800
> > +++ linux-2.6.24-rc8/arch/powerpc/mm/hash_utils_64.c 2008-01-28 11:45:40.000000000 -0800
> > @@ -191,6 +191,24 @@ int htab_bolt_mapping(unsigned long vsta
> > return ret < 0 ? ret : 0;
> > }
> >
> > +static void htab_remove_mapping(unsigned long vstart, unsigned long vend,
> > + int psize, int ssize)
> > +{
> > + unsigned long vaddr;
> > + unsigned int step, shift;
> > +
> > + shift = mmu_psize_defs[psize].shift;
> > + step = 1 << shift;
> > +
> > + if (!ppc_md.hpte_removebolted) {
> > + printk("Sub-arch doesn't implement hpte_removebolted\n");
> > + return;
> > + }
> > +
> > + for (vaddr = vstart; vaddr < vend; vaddr += step)
> > + ppc_md.hpte_removebolted(vaddr, psize, ssize);
> > +}
> > +
> > static int __init htab_dt_scan_seg_sizes(unsigned long node,
> > const char *uname, int depth,
> > void *data)
> > @@ -436,6 +454,11 @@ void create_section_mapping(unsigned lon
> > _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_COHERENT | PP_RWXX,
> > mmu_linear_psize, mmu_kernel_ssize));
> > }
> > +
> > +void remove_section_mapping(unsigned long start, unsigned long end)
> > +{
> > + htab_remove_mapping(start, end, mmu_linear_psize, mmu_kernel_ssize);
> > +}
> > #endif /* CONFIG_MEMORY_HOTPLUG */
> >
> > static inline void make_bl(unsigned int *insn_addr, void *func)
> > Index: linux-2.6.24-rc8/include/asm-powerpc/sparsemem.h
> > ===================================================================
> > --- linux-2.6.24-rc8.orig/include/asm-powerpc/sparsemem.h 2008-01-15 20:22:48.000000000 -0800
> > +++ linux-2.6.24-rc8/include/asm-powerpc/sparsemem.h 2008-01-25 08:18:11.000000000 -0800
> > @@ -20,6 +20,7 @@
> >
> > #ifdef CONFIG_MEMORY_HOTPLUG
> > extern void create_section_mapping(unsigned long start, unsigned long end);
> > +extern void remove_section_mapping(unsigned long start, unsigned long end);
> > #ifdef CONFIG_NUMA
> > extern int hot_add_scn_to_nid(unsigned long scn_addr);
> > #else
> > Index: linux-2.6.24-rc8/arch/powerpc/mm/mem.c
> > ===================================================================
> > --- linux-2.6.24-rc8.orig/arch/powerpc/mm/mem.c 2008-01-25 08:16:37.000000000 -0800
> > +++ linux-2.6.24-rc8/arch/powerpc/mm/mem.c 2008-01-25 08:20:33.000000000 -0800
> > @@ -156,7 +156,9 @@ int remove_memory(u64 start, u64 size)
> > ret = offline_pages(start_pfn, end_pfn, 120 * HZ);
> > if (ret)
> > goto out;
> > - /* Arch-specific calls go here - next patch */
> > +
> > + start = (unsigned long)__va(start);
> > + remove_section_mapping(start, start + size);
> > out:
> > return ret;
> > }
> > Index: linux-2.6.24-rc8/arch/powerpc/platforms/pseries/lpar.c
> > ===================================================================
> > --- linux-2.6.24-rc8.orig/arch/powerpc/platforms/pseries/lpar.c 2008-01-15 20:22:48.000000000 -0800
> > +++ linux-2.6.24-rc8/arch/powerpc/platforms/pseries/lpar.c 2008-01-28 14:10:58.000000000 -0800
> > @@ -520,6 +520,20 @@ static void pSeries_lpar_hpte_invalidate
> > BUG_ON(lpar_rc != H_SUCCESS);
> > }
> >
> > +static void pSeries_lpar_hpte_removebolted(unsigned long ea,
> > + int psize, int ssize)
> > +{
> > + unsigned long slot, vsid, va;
> > +
> > + vsid = get_kernel_vsid(ea, ssize);
> > + va = hpt_va(ea, vsid, ssize);
> > +
> > + slot = pSeries_lpar_hpte_find(va, psize, ssize);
> > + BUG_ON(slot == -1);
> > +
> > + pSeries_lpar_hpte_invalidate(slot, va, psize, ssize, 0);
> > +}
> > +
> > /* Flag bits for H_BULK_REMOVE */
> > #define HBR_REQUEST 0x4000000000000000UL
> > #define HBR_RESPONSE 0x8000000000000000UL
> > @@ -597,6 +611,7 @@ void __init hpte_init_lpar(void)
> > ppc_md.hpte_updateboltedpp = pSeries_lpar_hpte_updateboltedpp;
> > ppc_md.hpte_insert = pSeries_lpar_hpte_insert;
> > ppc_md.hpte_remove = pSeries_lpar_hpte_remove;
> > + ppc_md.hpte_removebolted = pSeries_lpar_hpte_removebolted;
> > ppc_md.flush_hash_range = pSeries_lpar_flush_hash_range;
> > ppc_md.hpte_clear_all = pSeries_lpar_hptab_clear;
> > }
> > Index: linux-2.6.24-rc8/include/asm-powerpc/machdep.h
> > ===================================================================
> > --- linux-2.6.24-rc8.orig/include/asm-powerpc/machdep.h 2008-01-25 08:04:41.000000000 -0800
> > +++ linux-2.6.24-rc8/include/asm-powerpc/machdep.h 2008-01-28 11:45:17.000000000 -0800
> > @@ -68,6 +68,8 @@ struct machdep_calls {
> > unsigned long vflags,
> > int psize, int ssize);
> > long (*hpte_remove)(unsigned long hpte_group);
> > + void (*hpte_removebolted)(unsigned long ea,
> > + int psize, int ssize);
> > void (*flush_hash_range)(unsigned long number, int local);
> >
> > /* special for kexec, to be called in real mode, linar mapping is
> >
> >
> > --
> > To unsubscribe, send a message with 'unsubscribe linux-mm' in
> > the body to majordomo at kvack.org. For more info on Linux MM,
> > see: http://www.linux-mm.org/ .
> > Don't email: <a href=mailto:"dont at kvack.org"> email at kvack.org </a>
>
More information about the Linuxppc-dev
mailing list