[PATCH v3 16/18] powerpc/64s: Move hash MMU support code under CONFIG_PPC_64S_HASH_MMU

Nicholas Piggin npiggin at gmail.com
Fri Oct 22 20:34:15 AEDT 2021


Excerpts from Christophe Leroy's message of October 22, 2021 5:18 pm:
> 
> 
> Le 22/10/2021 à 00:30, Nicholas Piggin a écrit :
>> Compiling out hash support code when CONFIG_PPC_64S_HASH_MMU=n saves
>> 128kB kernel image size (90kB text) on powernv_defconfig minus KVM,
>> 350kB on pseries_defconfig minus KVM, 40kB on a tiny config.
>> 
>> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
>> ---
>>   arch/powerpc/Kconfig                          |  2 +-
>>   arch/powerpc/include/asm/book3s/64/mmu.h      | 19 +++++++++--
>>   .../include/asm/book3s/64/tlbflush-hash.h     |  7 ++++
>>   arch/powerpc/include/asm/book3s/pgtable.h     |  4 +++
>>   arch/powerpc/include/asm/mmu_context.h        |  2 ++
>>   arch/powerpc/include/asm/paca.h               |  8 +++++
>>   arch/powerpc/kernel/asm-offsets.c             |  2 ++
>>   arch/powerpc/kernel/entry_64.S                |  4 +--
>>   arch/powerpc/kernel/exceptions-64s.S          | 16 +++++++++
>>   arch/powerpc/kernel/mce.c                     |  2 +-
>>   arch/powerpc/kernel/mce_power.c               | 10 ++++--
>>   arch/powerpc/kernel/paca.c                    | 18 ++++------
>>   arch/powerpc/kernel/process.c                 | 13 +++----
>>   arch/powerpc/kernel/prom.c                    |  2 ++
>>   arch/powerpc/kernel/setup_64.c                |  5 +++
>>   arch/powerpc/kexec/core_64.c                  |  4 +--
>>   arch/powerpc/kexec/ranges.c                   |  4 +++
>>   arch/powerpc/mm/book3s64/Makefile             | 15 ++++----
>>   arch/powerpc/mm/book3s64/hugetlbpage.c        |  2 ++
>>   arch/powerpc/mm/book3s64/mmu_context.c        | 34 +++++++++++++++----
>>   arch/powerpc/mm/book3s64/pgtable.c            |  2 +-
>>   arch/powerpc/mm/book3s64/radix_pgtable.c      |  4 +++
>>   arch/powerpc/mm/copro_fault.c                 |  2 ++
>>   arch/powerpc/mm/ptdump/Makefile               |  2 +-
>>   arch/powerpc/platforms/powernv/idle.c         |  2 ++
>>   arch/powerpc/platforms/powernv/setup.c        |  2 ++
>>   arch/powerpc/platforms/pseries/lpar.c         | 11 ++++--
>>   arch/powerpc/platforms/pseries/lparcfg.c      |  2 +-
>>   arch/powerpc/platforms/pseries/mobility.c     |  6 ++++
>>   arch/powerpc/platforms/pseries/ras.c          |  2 ++
>>   arch/powerpc/platforms/pseries/reconfig.c     |  2 ++
>>   arch/powerpc/platforms/pseries/setup.c        |  6 ++--
>>   arch/powerpc/xmon/xmon.c                      |  8 +++--
>>   drivers/misc/lkdtm/Makefile                   |  2 +-
>>   drivers/misc/lkdtm/core.c                     |  2 +-
>>   35 files changed, 177 insertions(+), 51 deletions(-)
>> 
> 
>> diff --git a/arch/powerpc/include/asm/book3s/64/mmu.h b/arch/powerpc/include/asm/book3s/64/mmu.h
>> index c02f42d1031e..d94ebae386b6 100644
>> --- a/arch/powerpc/include/asm/book3s/64/mmu.h
>> +++ b/arch/powerpc/include/asm/book3s/64/mmu.h
>> @@ -233,7 +245,8 @@ static inline void setup_initial_memory_limit(phys_addr_t first_memblock_base,
>>   	 * know which translations we will pick. Hence go with hash
>>   	 * restrictions.
>>   	 */
>> -	return hash__setup_initial_memory_limit(first_memblock_base,
>> +	if (!radix_enabled())
>> +		return hash__setup_initial_memory_limit(first_memblock_base,
>>   					   first_memblock_size);
> 
> It is a void function, using return is not correct.

I guess for this case I can fix as I go.

>> @@ -112,8 +112,15 @@ static inline void hash__flush_tlb_kernel_range(unsigned long start,
>>   
>>   struct mmu_gather;
>>   extern void hash__tlb_flush(struct mmu_gather *tlb);
>> +extern void flush_tlb_pmd_range(struct mm_struct *mm, pmd_t *pmd,
>> +				unsigned long addr);
> 
> 'extern' is superflous

Ditto.

>> @@ -144,12 +147,21 @@ static int hash__init_new_context(struct mm_struct *mm)
>>   	return index;
>>   }
>>   
>> +void slb_setup_new_exec(void);
> 
> Include arch/powerpc/mm/book3s64/internal.h instead

Will do.

>> diff --git a/arch/powerpc/mm/book3s64/pgtable.c b/arch/powerpc/mm/book3s64/pgtable.c
>> index 7d556b5513e4..57d2d797c4f6 100644
>> --- a/arch/powerpc/mm/book3s64/pgtable.c
>> +++ b/arch/powerpc/mm/book3s64/pgtable.c
>> @@ -535,7 +535,7 @@ static int __init pgtable_debugfs_setup(void)
>>   }
>>   arch_initcall(pgtable_debugfs_setup);
>>   
>> -#ifdef CONFIG_ZONE_DEVICE
>> +#if defined(CONFIG_ZONE_DEVICE) && defined(ARCH_HAS_MEMREMAP_COMPAT_ALIGN)
> 
> Patch 12 does
> 
> 	select ARCH_HAS_MEMREMAP_COMPAT_ALIGN	if PPC_BOOK3S_64

Ah, I meant to change that to PPC_64S_HASH_MMU.

> 
> So this change is not needed
> 
>>   /*
>>    * Override the generic version in mm/memremap.c.
>>    *
> 
>> diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
>> index dd8241c009e5..30f764476c30 100644
>> --- a/arch/powerpc/xmon/xmon.c
>> +++ b/arch/powerpc/xmon/xmon.c
>> @@ -1160,9 +1160,11 @@ cmds(struct pt_regs *excp)
>>   			show_tasks();
>>   			break;
>>   #ifdef CONFIG_PPC_BOOK3S
>> +#if defined(CONFIG_PPC32) || defined(CONFIG_PPC_64S_HASH_MMU)
> 
> I think you'll get a build failure here.
> 
> dump_segments() is defined only with CONFIG_PPC_BOOK3S_64 and 
> CONFIG_PPC_BOOK3S_32, see
> 
> https://elixir.bootlin.com/linux/v5.15-rc5/source/arch/powerpc/xmon/xmon.c#L3745
> 
> and
> 
> https://elixir.bootlin.com/linux/v5.15-rc5/source/arch/powerpc/xmon/xmon.c#L3784

AFAIKS it is okay because it still has ifdef BOOK3S?

Thanks,
Nick



More information about the Linuxppc-dev mailing list