* [PATCH] powerpc: is_hugepage_only_range() must account for both 4kB and 64kB slices
@ 2009-01-14 19:09 Dave Kleikamp
2009-01-15 1:54 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 2+ messages in thread
From: Dave Kleikamp @ 2009-01-14 19:09 UTC (permalink / raw)
To: ppc-dev; +Cc: Paul Mackerras
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>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
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",
--
David Kleikamp
IBM Linux Technology Center
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] powerpc: is_hugepage_only_range() must account for both 4kB and 64kB slices
2009-01-14 19:09 [PATCH] powerpc: is_hugepage_only_range() must account for both 4kB and 64kB slices Dave Kleikamp
@ 2009-01-15 1:54 ` Benjamin Herrenschmidt
0 siblings, 0 replies; 2+ messages in thread
From: Benjamin Herrenschmidt @ 2009-01-15 1:54 UTC (permalink / raw)
To: Dave Kleikamp; +Cc: ppc-dev, Paul Mackerras
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 <shaggy@linux.vnet.ibm.com>
> Cc: Paul Mackerras <paulus@samba.org>
> Cc: Benjamin Herrenschmidt <benh@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",
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-01-15 1:54 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-01-14 19:09 [PATCH] powerpc: is_hugepage_only_range() must account for both 4kB and 64kB slices Dave Kleikamp
2009-01-15 1:54 ` Benjamin Herrenschmidt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).