From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Dave Kleikamp <shaggy@linux.vnet.ibm.com>
Cc: Hugh Dickins <hugh@veritas.com>,
Andrew Morton <akpm@linux-foundation.org>,
Linuxppc-dev@ozlabs.org, Paul Mackerras <paulus@au1.ibm.com>,
linux-mm@kvack.org
Subject: Re: [patch 1/6] mm: Allow architectures to define additional protection bits
Date: Mon, 07 Jul 2008 15:52:36 +1000 [thread overview]
Message-ID: <1215409956.8970.82.camel@pasglop> (raw)
In-Reply-To: <1214920499.18690.10.camel@norville.austin.ibm.com>
On Tue, 2008-07-01 at 13:54 +0000, Dave Kleikamp wrote:
> On Tue, 2008-07-01 at 01:53 -0700, Andrew Morton wrote:
> > On Wed, 18 Jun 2008 17:32:55 -0500 shaggy@linux.vnet.ibm.com wrote:
> >
> > > This patch allows architectures to define functions to deal with
> > > additional protections bits for mmap() and mprotect().
> > >
> > > arch_calc_vm_prot_bits() maps additonal protection bits to vm_flags
> > > arch_vm_get_page_prot() maps additional vm_flags to the vma's vm_page_prot
> > > arch_validate_prot() checks for valid values of the protection bits
> >
> > It'd be simpler if Paul were to merge this. It doesn't conflict with
> > any pending work.
>
> That works for me. Paul, I'll send you an updated patchset.
Please, CC me as I'll handle this merge window.
> > Acked-by: Andrew Morton <akpm@linux-foundation.org>
> >
> > > Note: vm_get_page_prot() is now pretty ugly.
> >
> > It is. But afacit it generates the same code for non-powerpc.
> >
> > > Suggestions?
> >
> > nfi. Let us rub the Hugh-summoning lamp.
Didn't rub hard enough ? :-)
Cheers,
Ben.
> > > Signed-off-by: Dave Kleikamp <shaggy@linux.vnet.ibm.com>
> > > ---
> > >
> > > include/linux/mman.h | 28 +++++++++++++++++++++++++++-
> > > mm/mmap.c | 5 +++--
> > > mm/mprotect.c | 2 +-
> > > 3 files changed, 31 insertions(+), 4 deletions(-)
> > >
> > > Index: linux-2.6.26-rc5/include/linux/mman.h
> > > ===================================================================
> > > --- linux-2.6.26-rc5.orig/include/linux/mman.h
> > > +++ linux-2.6.26-rc5/include/linux/mman.h
> > > @@ -34,6 +34,31 @@ static inline void vm_unacct_memory(long
> > > }
> > >
> > > /*
> > > + * Allow architectures to handle additional protection bits
> > > + */
> > > +
> > > +#ifndef arch_calc_vm_prot_bits
> > > +#define arch_calc_vm_prot_bits(prot) 0
> > > +#endif
> > > +
> > > +#ifndef arch_vm_get_page_prot
> > > +#define arch_vm_get_page_prot(vm_flags) __pgprot(0)
> > > +#endif
> > > +
> > > +#ifndef arch_validate_prot
> > > +/*
> > > + * This is called from mprotect(). PROT_GROWSDOWN and PROT_GROWSUP have
> > > + * already been masked out.
> > > + *
> > > + * Returns true if the prot flags are valid
> > > + */
> > > +static inline int arch_validate_prot(unsigned long prot)
> > > +{
> > > + return (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM)) == 0;
> > > +}
> >
> > Officially we should now have
> >
> > #define arch_validate_prot arch_validate_prot
> >
> > here.
>
> No problem.
>
> > > +#endif
> > > +
> > > +/*
> > > * Optimisation macro. It is equivalent to:
> > > * (x & bit1) ? bit2 : 0
> > > * but this version is faster.
> > > @@ -51,7 +76,8 @@ calc_vm_prot_bits(unsigned long prot)
> > > {
> > > return _calc_vm_trans(prot, PROT_READ, VM_READ ) |
> > > _calc_vm_trans(prot, PROT_WRITE, VM_WRITE) |
> > > - _calc_vm_trans(prot, PROT_EXEC, VM_EXEC );
> > > + _calc_vm_trans(prot, PROT_EXEC, VM_EXEC) |
> > > + arch_calc_vm_prot_bits(prot);
> > > }
> > >
> > > /*
> > > Index: linux-2.6.26-rc5/mm/mmap.c
> > > ===================================================================
> > > --- linux-2.6.26-rc5.orig/mm/mmap.c
> > > +++ linux-2.6.26-rc5/mm/mmap.c
> > > @@ -72,8 +72,9 @@ pgprot_t protection_map[16] = {
> > >
> > > pgprot_t vm_get_page_prot(unsigned long vm_flags)
> > > {
> > > - return protection_map[vm_flags &
> > > - (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)];
> > > + return __pgprot(pgprot_val(protection_map[vm_flags &
> > > + (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]) |
> > > + pgprot_val(arch_vm_get_page_prot(vm_flags)));
> > > }
> > > EXPORT_SYMBOL(vm_get_page_prot);
> > >
> > > Index: linux-2.6.26-rc5/mm/mprotect.c
> > > ===================================================================
> > > --- linux-2.6.26-rc5.orig/mm/mprotect.c
> > > +++ linux-2.6.26-rc5/mm/mprotect.c
> > > @@ -239,7 +239,7 @@ sys_mprotect(unsigned long start, size_t
> > > end = start + len;
> > > if (end <= start)
> > > return -ENOMEM;
> > > - if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM))
> > > + if (!arch_validate_prot(prot))
> > > return -EINVAL;
> > >
> > > reqprot = prot;
> > >
> > > --
WARNING: multiple messages have this Message-ID (diff)
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Dave Kleikamp <shaggy@linux.vnet.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Hugh Dickins <hugh@veritas.com>,
linux-mm@kvack.org, Paul Mackerras <paulus@au1.ibm.com>,
Linuxppc-dev@ozlabs.org
Subject: Re: [patch 1/6] mm: Allow architectures to define additional protection bits
Date: Mon, 07 Jul 2008 15:52:36 +1000 [thread overview]
Message-ID: <1215409956.8970.82.camel@pasglop> (raw)
In-Reply-To: <1214920499.18690.10.camel@norville.austin.ibm.com>
On Tue, 2008-07-01 at 13:54 +0000, Dave Kleikamp wrote:
> On Tue, 2008-07-01 at 01:53 -0700, Andrew Morton wrote:
> > On Wed, 18 Jun 2008 17:32:55 -0500 shaggy@linux.vnet.ibm.com wrote:
> >
> > > This patch allows architectures to define functions to deal with
> > > additional protections bits for mmap() and mprotect().
> > >
> > > arch_calc_vm_prot_bits() maps additonal protection bits to vm_flags
> > > arch_vm_get_page_prot() maps additional vm_flags to the vma's vm_page_prot
> > > arch_validate_prot() checks for valid values of the protection bits
> >
> > It'd be simpler if Paul were to merge this. It doesn't conflict with
> > any pending work.
>
> That works for me. Paul, I'll send you an updated patchset.
Please, CC me as I'll handle this merge window.
> > Acked-by: Andrew Morton <akpm@linux-foundation.org>
> >
> > > Note: vm_get_page_prot() is now pretty ugly.
> >
> > It is. But afacit it generates the same code for non-powerpc.
> >
> > > Suggestions?
> >
> > nfi. Let us rub the Hugh-summoning lamp.
Didn't rub hard enough ? :-)
Cheers,
Ben.
> > > Signed-off-by: Dave Kleikamp <shaggy@linux.vnet.ibm.com>
> > > ---
> > >
> > > include/linux/mman.h | 28 +++++++++++++++++++++++++++-
> > > mm/mmap.c | 5 +++--
> > > mm/mprotect.c | 2 +-
> > > 3 files changed, 31 insertions(+), 4 deletions(-)
> > >
> > > Index: linux-2.6.26-rc5/include/linux/mman.h
> > > ===================================================================
> > > --- linux-2.6.26-rc5.orig/include/linux/mman.h
> > > +++ linux-2.6.26-rc5/include/linux/mman.h
> > > @@ -34,6 +34,31 @@ static inline void vm_unacct_memory(long
> > > }
> > >
> > > /*
> > > + * Allow architectures to handle additional protection bits
> > > + */
> > > +
> > > +#ifndef arch_calc_vm_prot_bits
> > > +#define arch_calc_vm_prot_bits(prot) 0
> > > +#endif
> > > +
> > > +#ifndef arch_vm_get_page_prot
> > > +#define arch_vm_get_page_prot(vm_flags) __pgprot(0)
> > > +#endif
> > > +
> > > +#ifndef arch_validate_prot
> > > +/*
> > > + * This is called from mprotect(). PROT_GROWSDOWN and PROT_GROWSUP have
> > > + * already been masked out.
> > > + *
> > > + * Returns true if the prot flags are valid
> > > + */
> > > +static inline int arch_validate_prot(unsigned long prot)
> > > +{
> > > + return (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM)) == 0;
> > > +}
> >
> > Officially we should now have
> >
> > #define arch_validate_prot arch_validate_prot
> >
> > here.
>
> No problem.
>
> > > +#endif
> > > +
> > > +/*
> > > * Optimisation macro. It is equivalent to:
> > > * (x & bit1) ? bit2 : 0
> > > * but this version is faster.
> > > @@ -51,7 +76,8 @@ calc_vm_prot_bits(unsigned long prot)
> > > {
> > > return _calc_vm_trans(prot, PROT_READ, VM_READ ) |
> > > _calc_vm_trans(prot, PROT_WRITE, VM_WRITE) |
> > > - _calc_vm_trans(prot, PROT_EXEC, VM_EXEC );
> > > + _calc_vm_trans(prot, PROT_EXEC, VM_EXEC) |
> > > + arch_calc_vm_prot_bits(prot);
> > > }
> > >
> > > /*
> > > Index: linux-2.6.26-rc5/mm/mmap.c
> > > ===================================================================
> > > --- linux-2.6.26-rc5.orig/mm/mmap.c
> > > +++ linux-2.6.26-rc5/mm/mmap.c
> > > @@ -72,8 +72,9 @@ pgprot_t protection_map[16] = {
> > >
> > > pgprot_t vm_get_page_prot(unsigned long vm_flags)
> > > {
> > > - return protection_map[vm_flags &
> > > - (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)];
> > > + return __pgprot(pgprot_val(protection_map[vm_flags &
> > > + (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]) |
> > > + pgprot_val(arch_vm_get_page_prot(vm_flags)));
> > > }
> > > EXPORT_SYMBOL(vm_get_page_prot);
> > >
> > > Index: linux-2.6.26-rc5/mm/mprotect.c
> > > ===================================================================
> > > --- linux-2.6.26-rc5.orig/mm/mprotect.c
> > > +++ linux-2.6.26-rc5/mm/mprotect.c
> > > @@ -239,7 +239,7 @@ sys_mprotect(unsigned long start, size_t
> > > end = start + len;
> > > if (end <= start)
> > > return -ENOMEM;
> > > - if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM))
> > > + if (!arch_validate_prot(prot))
> > > return -EINVAL;
> > >
> > > reqprot = prot;
> > >
> > > --
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2008-07-07 5:52 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-18 22:32 [patch 0/6] Strong Access Ordering page attributes for POWER7 shaggy
2008-06-18 22:32 ` shaggy
2008-06-18 22:32 ` [patch 1/6] mm: Allow architectures to define additional protection bits shaggy
2008-06-18 22:32 ` shaggy
2008-07-01 8:53 ` Andrew Morton
2008-07-01 8:53 ` Andrew Morton
2008-07-01 13:54 ` Dave Kleikamp
2008-07-01 13:54 ` Dave Kleikamp
2008-07-07 5:52 ` Benjamin Herrenschmidt [this message]
2008-07-07 5:52 ` Benjamin Herrenschmidt
2008-07-07 21:11 ` Hugh Dickins
2008-07-07 21:11 ` Hugh Dickins
2008-07-07 22:24 ` Benjamin Herrenschmidt
2008-07-07 22:24 ` Benjamin Herrenschmidt
2008-07-08 6:18 ` Benjamin Herrenschmidt
2008-07-08 6:18 ` Benjamin Herrenschmidt
2008-07-08 13:00 ` Hugh Dickins
2008-07-08 13:00 ` Hugh Dickins
2008-07-08 13:35 ` Dave Kleikamp
2008-07-08 13:35 ` Dave Kleikamp
2008-06-18 22:32 ` [patch 2/6] powerpc: hash_huge_page() should get the WIMG bits from the lpte shaggy
2008-06-18 22:32 ` shaggy
2008-06-18 22:32 ` [patch 3/6] powerpc: Define flags for Strong Access Ordering shaggy
2008-06-18 22:32 ` shaggy
2008-06-18 22:32 ` [patch 4/6] powerpc: Add SAO Feature bit to the cputable shaggy
2008-06-18 22:32 ` shaggy
2008-06-18 22:32 ` [patch 5/6] powerpc: Add Strong Access Ordering shaggy
2008-06-18 22:32 ` shaggy
2008-06-18 22:33 ` [patch 6/6] powerpc: Dont clear _PAGE_COHERENT when _PAGE_SAO is set shaggy
2008-06-18 22:33 ` shaggy
2008-07-03 23:39 ` [patch 0/6] Strong Access Ordering page attributes for POWER7 Benjamin Herrenschmidt
2008-07-03 23:39 ` Benjamin Herrenschmidt
2008-07-07 14:05 ` Dave Kleikamp
2008-07-07 14:05 ` Dave Kleikamp
2008-07-07 21:23 ` Joel Schopp
2008-07-07 21:23 ` Joel Schopp
2008-07-07 22:27 ` Benjamin Herrenschmidt
2008-07-07 22:27 ` Benjamin Herrenschmidt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1215409956.8970.82.camel@pasglop \
--to=benh@kernel.crashing.org \
--cc=Linuxppc-dev@ozlabs.org \
--cc=akpm@linux-foundation.org \
--cc=hugh@veritas.com \
--cc=linux-mm@kvack.org \
--cc=paulus@au1.ibm.com \
--cc=shaggy@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.