On Wed, 2009-01-14 at 13:09 -0600, Dave Kleikamp wrote: > powerpc: is_hugepage_only_range() must account for both 4kB and 64kB slices > > The subpage_prot syscall fails on second and subsequent calls for a given > region, because is_hugepage_only_range() is mis-identifying the 4 kB > slices when the process has a 64 kB page size. > > Signed-off-by: Dave Kleikamp <sha...@linux.vnet.ibm.com> > Cc: Paul Mackerras <pau...@samba.org> > Cc: Benjamin Herrenschmidt <b...@kernel.crashing.org>
Looks good. I'll put that in for .29 Cheers, Ben. > diff --git a/arch/powerpc/mm/slice.c b/arch/powerpc/mm/slice.c > index db44e02..ba51948 100644 > --- a/arch/powerpc/mm/slice.c > +++ b/arch/powerpc/mm/slice.c > @@ -710,9 +710,18 @@ int is_hugepage_only_range(struct mm_struct *mm, > unsigned long addr, > unsigned long len) > { > struct slice_mask mask, available; > + unsigned int psize = mm->context.user_psize; > > mask = slice_range_to_mask(addr, len); > - available = slice_mask_for_size(mm, mm->context.user_psize); > + available = slice_mask_for_size(mm, psize); > +#ifdef CONFIG_PPC_64K_PAGES > + /* We need to account for 4k slices too */ > + if (psize == MMU_PAGE_64K) { > + struct slice_mask compat_mask; > + compat_mask = slice_mask_for_size(mm, MMU_PAGE_4K); > + or_mask(available, compat_mask); > + } > +#endif > > #if 0 /* too verbose */ > slice_dbg("is_hugepage_only_range(mm=%p, addr=%lx, len=%lx)\n", > _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev