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)
|
unsigned long len)
|
||||||
{
|
{
|
||||||
struct slice_mask mask, available;
|
struct slice_mask mask, available;
|
||||||
|
unsigned int psize = mm->context.user_psize;
|
||||||
|
|
||||||
mask = slice_range_to_mask(addr, len);
|
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 */
|
#if 0 /* too verbose */
|
||||||
slice_dbg("is_hugepage_only_range(mm=%p, addr=%lx, len=%lx)\n",
|
slice_dbg("is_hugepage_only_range(mm=%p, addr=%lx, len=%lx)\n",
|
||||||
|
|
Загрузка…
Ссылка в новой задаче