From: labbott@redhat.com (Laura Abbott)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC][PATCH 2/4] arm64: Add option to force mapping with PAGE_SIZE pages
Date: Tue, 26 Jan 2016 13:51:15 -0800 [thread overview]
Message-ID: <56A7EA53.6080206@redhat.com> (raw)
In-Reply-To: <20160126111438.GA5059@leverpostej>
On 01/26/2016 03:14 AM, Mark Rutland wrote:
> Hi,
>
> On Mon, Jan 25, 2016 at 08:52:13AM -0800, Laura Abbott wrote:
>> Under some circumstances (e.g. debugging) it may be useful to have all
>> kernel memory mapped using PAGE_SIZE pages. Add an option for this.
>>
>> Signed-off-by: Laura Abbott <labbott@fedoraproject.org>
>> ---
>> arch/arm64/Kconfig | 11 +++++++++++
>> arch/arm64/mm/mmu.c | 10 +++++++---
>> 2 files changed, 18 insertions(+), 3 deletions(-)
>>
>> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
>> index ffa3c54..faf7eac 100644
>> --- a/arch/arm64/Kconfig
>> +++ b/arch/arm64/Kconfig
>> @@ -504,6 +504,17 @@ config HOTPLUG_CPU
>> Say Y here to experiment with turning CPUs off and on. CPUs
>> can be controlled through /sys/devices/system/cpu.
>>
>> +config FORCE_PAGES
>> + bool "Force all memory mappings to be PAGE_SIZE"
>> + help
>> + For performance reasons, kernel memory may be mapped with
>> + page table entries larger than the expected PAGE_SIZE. This results
>> + in better TLB performance but prevents adjustment of page table
>> + attributes at runtime. Say Y here to have all kernel memory mapped
>> + with PAGE_SIZE entries.
>> +
>> + If unsure, say N.
>> +
>
> I think we can make this a boot-time option, given that we're simply
> flipping a boolean that only directly affects a small amount of boot
> code. I doubt there would be a noticeable overhead, and it makes it more
> likely that we can use this to debug production kernels.
>
> Is there a usecase other than DEBUG_PAGEALLOC that you have in mind? If
> not, we could just hang this off of debug_pagealloc_enabled(), as we
> parse the early params before we create the usual page tables.
>
I only had DEBUG_PAGEALLOC use case in mind but I'm not sure about linking
the two completely. I'll see about adding a boot option instead of the
Kconfig option and then disabling debug_pagealloc if it isn't set.
Thanks,
Laura
> Thanks,
> Mark.
>
>> source kernel/Kconfig.preempt
>> source kernel/Kconfig.hz
>>
>> diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
>> index 2d6e7cf..450d38a 100644
>> --- a/arch/arm64/mm/mmu.c
>> +++ b/arch/arm64/mm/mmu.c
>> @@ -181,7 +181,8 @@ static void alloc_init_pmd(pud_t *pud, unsigned long addr, unsigned long end,
>> do {
>> next = pmd_addr_end(addr, end);
>> /* try section mapping first */
>> - if (((addr | next | phys) & ~SECTION_MASK) == 0) {
>> + if (((addr | next | phys) & ~SECTION_MASK) == 0 &&
>> + (!IS_ENABLED(CONFIG_FORCE_PAGES) || !pgtable_alloc)) {
>> pmd_t old_pmd =*pmd;
>> set_pmd(pmd, __pmd(phys |
>> pgprot_val(mk_sect_prot(prot))));
>> @@ -208,8 +209,11 @@ static void alloc_init_pmd(pud_t *pud, unsigned long addr, unsigned long end,
>> }
>>
>> static inline bool use_1G_block(unsigned long addr, unsigned long next,
>> - unsigned long phys)
>> + unsigned long phys, phys_addr_t (*pgtable_alloc)(void))
>> {
>> + if (pgtable_alloc && IS_ENABLED(CONFIG_FORCE_PAGES))
>> + return false;
>> +
>> if (PAGE_SHIFT != 12)
>> return false;
>>
>> @@ -241,7 +245,7 @@ static void alloc_init_pud(pgd_t *pgd, unsigned long addr, unsigned long end,
>> /*
>> * For 4K granule only, attempt to put down a 1GB block
>> */
>> - if (use_1G_block(addr, next, phys)) {
>> + if (use_1G_block(addr, next, phys, pgtable_alloc)) {
>> pud_t old_pud = *pud;
>> set_pud(pud, __pud(phys |
>> pgprot_val(mk_sect_prot(prot))));
>> --
>> 2.5.0
>>
WARNING: multiple messages have this Message-ID (diff)
From: Laura Abbott <labbott@redhat.com>
To: Mark Rutland <mark.rutland@arm.com>,
Laura Abbott <labbott@fedoraproject.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will.deacon@arm.com>,
Ard Biesheuvel <ard.biesheuvel@linaro.org>,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [RFC][PATCH 2/4] arm64: Add option to force mapping with PAGE_SIZE pages
Date: Tue, 26 Jan 2016 13:51:15 -0800 [thread overview]
Message-ID: <56A7EA53.6080206@redhat.com> (raw)
In-Reply-To: <20160126111438.GA5059@leverpostej>
On 01/26/2016 03:14 AM, Mark Rutland wrote:
> Hi,
>
> On Mon, Jan 25, 2016 at 08:52:13AM -0800, Laura Abbott wrote:
>> Under some circumstances (e.g. debugging) it may be useful to have all
>> kernel memory mapped using PAGE_SIZE pages. Add an option for this.
>>
>> Signed-off-by: Laura Abbott <labbott@fedoraproject.org>
>> ---
>> arch/arm64/Kconfig | 11 +++++++++++
>> arch/arm64/mm/mmu.c | 10 +++++++---
>> 2 files changed, 18 insertions(+), 3 deletions(-)
>>
>> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
>> index ffa3c54..faf7eac 100644
>> --- a/arch/arm64/Kconfig
>> +++ b/arch/arm64/Kconfig
>> @@ -504,6 +504,17 @@ config HOTPLUG_CPU
>> Say Y here to experiment with turning CPUs off and on. CPUs
>> can be controlled through /sys/devices/system/cpu.
>>
>> +config FORCE_PAGES
>> + bool "Force all memory mappings to be PAGE_SIZE"
>> + help
>> + For performance reasons, kernel memory may be mapped with
>> + page table entries larger than the expected PAGE_SIZE. This results
>> + in better TLB performance but prevents adjustment of page table
>> + attributes at runtime. Say Y here to have all kernel memory mapped
>> + with PAGE_SIZE entries.
>> +
>> + If unsure, say N.
>> +
>
> I think we can make this a boot-time option, given that we're simply
> flipping a boolean that only directly affects a small amount of boot
> code. I doubt there would be a noticeable overhead, and it makes it more
> likely that we can use this to debug production kernels.
>
> Is there a usecase other than DEBUG_PAGEALLOC that you have in mind? If
> not, we could just hang this off of debug_pagealloc_enabled(), as we
> parse the early params before we create the usual page tables.
>
I only had DEBUG_PAGEALLOC use case in mind but I'm not sure about linking
the two completely. I'll see about adding a boot option instead of the
Kconfig option and then disabling debug_pagealloc if it isn't set.
Thanks,
Laura
> Thanks,
> Mark.
>
>> source kernel/Kconfig.preempt
>> source kernel/Kconfig.hz
>>
>> diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
>> index 2d6e7cf..450d38a 100644
>> --- a/arch/arm64/mm/mmu.c
>> +++ b/arch/arm64/mm/mmu.c
>> @@ -181,7 +181,8 @@ static void alloc_init_pmd(pud_t *pud, unsigned long addr, unsigned long end,
>> do {
>> next = pmd_addr_end(addr, end);
>> /* try section mapping first */
>> - if (((addr | next | phys) & ~SECTION_MASK) == 0) {
>> + if (((addr | next | phys) & ~SECTION_MASK) == 0 &&
>> + (!IS_ENABLED(CONFIG_FORCE_PAGES) || !pgtable_alloc)) {
>> pmd_t old_pmd =*pmd;
>> set_pmd(pmd, __pmd(phys |
>> pgprot_val(mk_sect_prot(prot))));
>> @@ -208,8 +209,11 @@ static void alloc_init_pmd(pud_t *pud, unsigned long addr, unsigned long end,
>> }
>>
>> static inline bool use_1G_block(unsigned long addr, unsigned long next,
>> - unsigned long phys)
>> + unsigned long phys, phys_addr_t (*pgtable_alloc)(void))
>> {
>> + if (pgtable_alloc && IS_ENABLED(CONFIG_FORCE_PAGES))
>> + return false;
>> +
>> if (PAGE_SHIFT != 12)
>> return false;
>>
>> @@ -241,7 +245,7 @@ static void alloc_init_pud(pgd_t *pgd, unsigned long addr, unsigned long end,
>> /*
>> * For 4K granule only, attempt to put down a 1GB block
>> */
>> - if (use_1G_block(addr, next, phys)) {
>> + if (use_1G_block(addr, next, phys, pgtable_alloc)) {
>> pud_t old_pud = *pud;
>> set_pud(pud, __pud(phys |
>> pgprot_val(mk_sect_prot(prot))));
>> --
>> 2.5.0
>>
next prev parent reply other threads:[~2016-01-26 21:51 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-25 16:52 [RFC][PATCH 0/4] ARCH_SUPPORTS_DEBUG_PAGEALLOC for arm64 Laura Abbott
2016-01-25 16:52 ` Laura Abbott
2016-01-25 16:52 ` [RFC][PATCH 1/4] arm64: Drop alloc function from create_mapping Laura Abbott
2016-01-25 16:52 ` Laura Abbott
2016-01-26 11:22 ` Mark Rutland
2016-01-26 11:22 ` Mark Rutland
2016-01-26 21:26 ` Laura Abbott
2016-01-26 21:26 ` Laura Abbott
2016-01-25 16:52 ` [RFC][PATCH 2/4] arm64: Add option to force mapping with PAGE_SIZE pages Laura Abbott
2016-01-25 16:52 ` Laura Abbott
2016-01-26 11:14 ` Mark Rutland
2016-01-26 11:14 ` Mark Rutland
2016-01-26 21:51 ` Laura Abbott [this message]
2016-01-26 21:51 ` Laura Abbott
2016-01-25 16:52 ` [RFC][PATCH 3/4] arm64: Add support for ARCH_SUPPORTS_DEBUG_PAGEALLOC Laura Abbott
2016-01-25 16:52 ` Laura Abbott
2016-01-25 16:52 ` [RFC][PATCH 4/4] arm64: ptdump: Indicate whether memory should be faulting Laura Abbott
2016-01-25 16:52 ` Laura Abbott
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=56A7EA53.6080206@redhat.com \
--to=labbott@redhat.com \
--cc=linux-arm-kernel@lists.infradead.org \
/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.