powerpc: is_hugepage_only_range() must account for both 4kB and 64kB slices
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 <shaggy@linux.vnet.ibm.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
Родитель
5d9ee3ff3d
Коммит
9ba0fdbfae
|
@ -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",
|
||||
|
|
Загрузка…
Ссылка в новой задаче