On Tue, 6 Mar 2018 23:24:59 +1000 Nicholas Piggin <npig...@gmail.com> wrote:
> diff --git a/arch/powerpc/mm/mmu_context_book3s64.c > b/arch/powerpc/mm/mmu_context_book3s64.c > index 929d9ef7083f..80acad52b006 100644 > --- a/arch/powerpc/mm/mmu_context_book3s64.c > +++ b/arch/powerpc/mm/mmu_context_book3s64.c > @@ -93,13 +93,6 @@ static int hash__init_new_context(struct mm_struct *mm) > if (index < 0) > return index; > > - /* > - * In the case of exec, use the default limit, > - * otherwise inherit it from the mm we are duplicating. > - */ > - if (!mm->context.slb_addr_limit) > - mm->context.slb_addr_limit = DEFAULT_MAP_WINDOW_USER64; [...] > diff --git a/arch/powerpc/mm/mmu_context_nohash.c > b/arch/powerpc/mm/mmu_context_nohash.c > index d98f7e5c141b..be8f5c9d4d08 100644 > --- a/arch/powerpc/mm/mmu_context_nohash.c > +++ b/arch/powerpc/mm/mmu_context_nohash.c > @@ -332,9 +332,6 @@ int init_new_context(struct task_struct *t, struct > mm_struct *mm) > pr_hard("initing context for mm @%p\n", mm); > > #ifdef CONFIG_PPC_MM_SLICES > - if (!mm->context.slb_addr_limit) > - mm->context.slb_addr_limit = DEFAULT_MAP_WINDOW; > - [...] > diff --git a/arch/powerpc/mm/slice.c b/arch/powerpc/mm/slice.c > index 5e9e1e57d580..af4351b15d01 100644 > --- a/arch/powerpc/mm/slice.c > +++ b/arch/powerpc/mm/slice.c > @@ -671,70 +671,29 @@ unsigned int get_slice_psize(struct mm_struct *mm, > unsigned long addr) > } > EXPORT_SYMBOL_GPL(get_slice_psize); > > -/* > - * This is called by hash_page when it needs to do a lazy conversion of > - * an address space from real 64K pages to combo 4K pages (typically > - * when hitting a non cacheable mapping on a processor or hypervisor > - * that won't allow them for 64K pages). > - * > - * This is also called in init_new_context() to change back the user > - * psize from whatever the parent context had it set to > - * N.B. This may be called before mm->context.id has been set. > - * > - * This function will only change the content of the {low,high)_slice_psize > - * masks, it will not flush SLBs as this shall be handled lazily by the > - * caller. > - */ > -void slice_set_user_psize(struct mm_struct *mm, unsigned int psize) > +void slice_init_new_context_exec(struct mm_struct *mm) > { > - int index, mask_index; > unsigned char *hpsizes, *lpsizes; > - unsigned long flags; > - unsigned int old_psize; > - int i; > - > - slice_dbg("slice_set_user_psize(mm=%p, psize=%d)\n", mm, psize); > - > - VM_BUG_ON(radix_enabled()); > - spin_lock_irqsave(&slice_convert_lock, flags); > + unsigned int psize = mmu_virtual_psize; > > - old_psize = mm->context.user_psize; > - slice_dbg(" old_psize=%d\n", old_psize); > - if (old_psize == psize) > - goto bail; > + slice_dbg("slice_init_new_context_exec(mm=%p)\n", mm); > > + /* > + * In the case of exec, use the default limit. In the > + * case of fork it is just inherited from the mm being > + * duplicated. > + */ > + mm->context.slb_addr_limit = DEFAULT_MAP_WINDOW_USER64; Okay this looks wrong for 8xx now I just noticed. But... isn't existing code wrong for 32-bit tasks on BOOK3S_64? It should be DEFAULT_MAP_WINDOW here I think? Thanks, Nick