* [RFC 2/3] arm: mm: Define set_memory_* functions for ARM
[not found] ` <1371057810-3189-3-git-send-email-lauraa@codeaurora.org>
@ 2013-06-12 17:32 ` Russell King - ARM Linux
2013-06-13 16:25 ` Catalin Marinas
` (2 subsequent siblings)
3 siblings, 0 replies; 11+ messages in thread
From: Russell King - ARM Linux @ 2013-06-12 17:32 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jun 12, 2013 at 10:23:29AM -0700, Laura Abbott wrote:
> Other architectures define various set_memory functions to allow
> attributes to be changed (e.g. set_memory_x, set_memory_rw, etc.)
> Currently, these functions are missing on ARM. Define these in an
> appropriate manner for ARM.
Please ensure that these functions only accept arguments for the module
range; they will fail probably very noisily and destructively if they
encounter the section mappings which we use for the direct RAM mapping.
^ permalink raw reply [flat|nested] 11+ messages in thread
* [RFC 2/3] arm: mm: Define set_memory_* functions for ARM
[not found] ` <1371057810-3189-3-git-send-email-lauraa@codeaurora.org>
2013-06-12 17:32 ` [RFC 2/3] arm: mm: Define set_memory_* functions for ARM Russell King - ARM Linux
@ 2013-06-13 16:25 ` Catalin Marinas
2013-06-18 11:09 ` Will Deacon
2013-10-25 13:08 ` Will Deacon
3 siblings, 0 replies; 11+ messages in thread
From: Catalin Marinas @ 2013-06-13 16:25 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jun 12, 2013 at 06:23:29PM +0100, Laura Abbott wrote:
> +int set_memory_ro(unsigned long addr, int numpages)
> +{
> + unsigned long start = addr;
> + unsigned long size = PAGE_SIZE*numpages;
> + unsigned end = start + size;
> +
> + apply_to_page_range(&init_mm, start, size, pte_set_ro, NULL);
> + dsb();
> + flush_tlb_kernel_range(start, end);
I think flush_tlb_kernel_range() already has a DSB.
--
Catalin
^ permalink raw reply [flat|nested] 11+ messages in thread
* [RFC 2/3] arm: mm: Define set_memory_* functions for ARM
[not found] ` <1371057810-3189-3-git-send-email-lauraa@codeaurora.org>
2013-06-12 17:32 ` [RFC 2/3] arm: mm: Define set_memory_* functions for ARM Russell King - ARM Linux
2013-06-13 16:25 ` Catalin Marinas
@ 2013-06-18 11:09 ` Will Deacon
2013-06-19 1:48 ` Laura Abbott
2013-10-25 13:08 ` Will Deacon
3 siblings, 1 reply; 11+ messages in thread
From: Will Deacon @ 2013-06-18 11:09 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jun 12, 2013 at 06:23:29PM +0100, Laura Abbott wrote:
> Other architectures define various set_memory functions to allow
> attributes to be changed (e.g. set_memory_x, set_memory_rw, etc.)
> Currently, these functions are missing on ARM. Define these in an
> appropriate manner for ARM.
>
> Signed-off-by: Laura Abbott <lauraa@codeaurora.org>
> ---
> arch/arm/include/asm/cacheflush.h | 5 ++
> arch/arm/mm/mmu.c | 86 +++++++++++++++++++++++++++++++++++++
> 2 files changed, 91 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h
> index bff7138..55ed26b 100644
> --- a/arch/arm/include/asm/cacheflush.h
> +++ b/arch/arm/include/asm/cacheflush.h
> @@ -438,4 +438,9 @@ static inline void __sync_cache_range_r(volatile void *p, size_t size)
> #define sync_cache_w(ptr) __sync_cache_range_w(ptr, sizeof *(ptr))
> #define sync_cache_r(ptr) __sync_cache_range_r(ptr, sizeof *(ptr))
>
> +int set_memory_ro(unsigned long addr, int numpages);
> +int set_memory_rw(unsigned long addr, int numpages);
> +int set_memory_x(unsigned long addr, int numpages);
> +int set_memory_nx(unsigned long addr, int numpages);
This seems like a pretty clunky interface with a horribly generic name, but
that seems to be what x86 and s390 are using. I wonder if there would be any
interest in tidying it up a bit? It really looks like something that is
x86-specific but has started to grow users in core code (set_memory_4k?!).
Will
^ permalink raw reply [flat|nested] 11+ messages in thread
* [RFC 2/3] arm: mm: Define set_memory_* functions for ARM
2013-06-18 11:09 ` Will Deacon
@ 2013-06-19 1:48 ` Laura Abbott
2013-06-19 13:59 ` Will Deacon
0 siblings, 1 reply; 11+ messages in thread
From: Laura Abbott @ 2013-06-19 1:48 UTC (permalink / raw)
To: linux-arm-kernel
On 6/18/2013 4:09 AM, Will Deacon wrote:
> On Wed, Jun 12, 2013 at 06:23:29PM +0100, Laura Abbott wrote:
>> Other architectures define various set_memory functions to allow
>> attributes to be changed (e.g. set_memory_x, set_memory_rw, etc.)
>> Currently, these functions are missing on ARM. Define these in an
>> appropriate manner for ARM.
>>
>> Signed-off-by: Laura Abbott <lauraa@codeaurora.org>
>> ---
>> arch/arm/include/asm/cacheflush.h | 5 ++
>> arch/arm/mm/mmu.c | 86 +++++++++++++++++++++++++++++++++++++
>> 2 files changed, 91 insertions(+), 0 deletions(-)
>>
>> diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h
>> index bff7138..55ed26b 100644
>> --- a/arch/arm/include/asm/cacheflush.h
>> +++ b/arch/arm/include/asm/cacheflush.h
>> @@ -438,4 +438,9 @@ static inline void __sync_cache_range_r(volatile void *p, size_t size)
>> #define sync_cache_w(ptr) __sync_cache_range_w(ptr, sizeof *(ptr))
>> #define sync_cache_r(ptr) __sync_cache_range_r(ptr, sizeof *(ptr))
>>
>> +int set_memory_ro(unsigned long addr, int numpages);
>> +int set_memory_rw(unsigned long addr, int numpages);
>> +int set_memory_x(unsigned long addr, int numpages);
>> +int set_memory_nx(unsigned long addr, int numpages);
>
> This seems like a pretty clunky interface with a horribly generic name, but
> that seems to be what x86 and s390 are using. I wonder if there would be any
> interest in tidying it up a bit? It really looks like something that is
> x86-specific but has started to grow users in core code (set_memory_4k?!).
>
I think cleanup would be beneficial. Nothing else really uses the
set_memory_* functions and s390 explicitly defined them so they could
use CONFIG_DEBUG_SET_MODULE_RONX as well. Perhaps the work I did with
apply_to_page_range could apply across all architectures?
Thanks,
Laura
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
^ permalink raw reply [flat|nested] 11+ messages in thread
* [RFC 2/3] arm: mm: Define set_memory_* functions for ARM
2013-06-19 1:48 ` Laura Abbott
@ 2013-06-19 13:59 ` Will Deacon
0 siblings, 0 replies; 11+ messages in thread
From: Will Deacon @ 2013-06-19 13:59 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jun 19, 2013 at 02:48:28AM +0100, Laura Abbott wrote:
> On 6/18/2013 4:09 AM, Will Deacon wrote:
> > On Wed, Jun 12, 2013 at 06:23:29PM +0100, Laura Abbott wrote:
> >> Other architectures define various set_memory functions to allow
> >> attributes to be changed (e.g. set_memory_x, set_memory_rw, etc.)
> >> Currently, these functions are missing on ARM. Define these in an
> >> appropriate manner for ARM.
> >>
> >> Signed-off-by: Laura Abbott <lauraa@codeaurora.org>
> >> ---
> >> arch/arm/include/asm/cacheflush.h | 5 ++
> >> arch/arm/mm/mmu.c | 86 +++++++++++++++++++++++++++++++++++++
> >> 2 files changed, 91 insertions(+), 0 deletions(-)
> >>
> >> diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h
> >> index bff7138..55ed26b 100644
> >> --- a/arch/arm/include/asm/cacheflush.h
> >> +++ b/arch/arm/include/asm/cacheflush.h
> >> @@ -438,4 +438,9 @@ static inline void __sync_cache_range_r(volatile void *p, size_t size)
> >> #define sync_cache_w(ptr) __sync_cache_range_w(ptr, sizeof *(ptr))
> >> #define sync_cache_r(ptr) __sync_cache_range_r(ptr, sizeof *(ptr))
> >>
> >> +int set_memory_ro(unsigned long addr, int numpages);
> >> +int set_memory_rw(unsigned long addr, int numpages);
> >> +int set_memory_x(unsigned long addr, int numpages);
> >> +int set_memory_nx(unsigned long addr, int numpages);
> >
> > This seems like a pretty clunky interface with a horribly generic name, but
> > that seems to be what x86 and s390 are using. I wonder if there would be any
> > interest in tidying it up a bit? It really looks like something that is
> > x86-specific but has started to grow users in core code (set_memory_4k?!).
> >
>
> I think cleanup would be beneficial. Nothing else really uses the
> set_memory_* functions and s390 explicitly defined them so they could
> use CONFIG_DEBUG_SET_MODULE_RONX as well. Perhaps the work I did with
> apply_to_page_range could apply across all architectures?
It's certainly worth a look, and would probably warrant changing the
function prototypes to take the size rather than the number of pages too.
Will
^ permalink raw reply [flat|nested] 11+ messages in thread
* [RFC 2/3] arm: mm: Define set_memory_* functions for ARM
[not found] ` <1371057810-3189-3-git-send-email-lauraa@codeaurora.org>
` (2 preceding siblings ...)
2013-06-18 11:09 ` Will Deacon
@ 2013-10-25 13:08 ` Will Deacon
2013-10-27 10:18 ` Russell King - ARM Linux
3 siblings, 1 reply; 11+ messages in thread
From: Will Deacon @ 2013-10-25 13:08 UTC (permalink / raw)
To: linux-arm-kernel
Hi Laura,
On Wed, Jun 12, 2013 at 06:23:29PM +0100, Laura Abbott wrote:
> Other architectures define various set_memory functions to allow
> attributes to be changed (e.g. set_memory_x, set_memory_rw, etc.)
> Currently, these functions are missing on ARM. Define these in an
> appropriate manner for ARM.
[...]
> +int set_memory_ro(unsigned long addr, int numpages)
> +{
> + unsigned long start = addr;
> + unsigned long size = PAGE_SIZE*numpages;
> + unsigned end = start + size;
> +
> + apply_to_page_range(&init_mm, start, size, pte_set_ro, NULL);
> + dsb();
> + flush_tlb_kernel_range(start, end);
The TLB_WB flag gives you the dsb, so you don't need to code it explicitly
here (same comment for the other occurrences in this patch).
Will
^ permalink raw reply [flat|nested] 11+ messages in thread
* [RFC 2/3] arm: mm: Define set_memory_* functions for ARM
2013-10-25 13:08 ` Will Deacon
@ 2013-10-27 10:18 ` Russell King - ARM Linux
0 siblings, 0 replies; 11+ messages in thread
From: Russell King - ARM Linux @ 2013-10-27 10:18 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Oct 25, 2013 at 02:08:40PM +0100, Will Deacon wrote:
> Hi Laura,
>
> On Wed, Jun 12, 2013 at 06:23:29PM +0100, Laura Abbott wrote:
> > Other architectures define various set_memory functions to allow
> > attributes to be changed (e.g. set_memory_x, set_memory_rw, etc.)
> > Currently, these functions are missing on ARM. Define these in an
> > appropriate manner for ARM.
>
> [...]
>
> > +int set_memory_ro(unsigned long addr, int numpages)
> > +{
> > + unsigned long start = addr;
> > + unsigned long size = PAGE_SIZE*numpages;
> > + unsigned end = start + size;
> > +
> > + apply_to_page_range(&init_mm, start, size, pte_set_ro, NULL);
> > + dsb();
> > + flush_tlb_kernel_range(start, end);
>
> The TLB_WB flag gives you the dsb, so you don't need to code it explicitly
> here (same comment for the other occurrences in this patch).
The version I have here doesn't have the above as a plain function, but
uses a macro to create these. It also checks that the memory start and
end are within the modules area to avoid any problems with it being used
elsewhere. The date on those patches was the 17th June.
^ permalink raw reply [flat|nested] 11+ messages in thread