powerpc/mm: fix up pgtable dump flags
PATCH 1/2 powerpc/mm: fix up pgtable dump flags
On Book3s we have two PTE flags used to mark cache-inhibited mappings:_PAGE_TOLERANT and _PAGE_NON_IDEMPOTENT. Currently the kernel page table dumper only looks at the generic _PAGE_NO_CACHE which is defined to be _PAGE_TOLERANT. This patch modifies the dumper so both flags are shown in the dump.
--- arch/powerpc/mm/dump_linuxpagetables.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
arch/powerpc/mm/dump_linuxpagetables.c +13 -0
@@ -154,11 +154,24 @@ static const struct flag_info flag_array[] = { .clear = " ", }, { #endif +#ifndef CONFIG_PPC_BOOK3S_64 .mask = _PAGE_NO_CACHE, .val = _PAGE_NO_CACHE, .set = "no cache", .clear = " ", }, { +#else + .mask = _PAGE_NON_IDEMPOTENT, + .val = _PAGE_NON_IDEMPOTENT, + .set = "non-idempotent", + .clear = " ", + }, { + .mask = _PAGE_TOLERANT, + .val = _PAGE_TOLERANT, + .set = "tolerant", + .clear = " ", + }, { +#endif #ifdef CONFIG_PPC_BOOK3S_64 .mask = H_PAGE_BUSY, .val = H_PAGE_BUSY,
Signature · 1 line
2.9.3
PATCH 2/2 powerpc/mm: add phys addr to linux page table dump
The current page table dumper scans the linux page tables and coalesces mappings with adjacent virtual addresses and similar PTE flags. This behaviour is somewhat broken when you consider the IOREMAP space where entirely unrelated mappings will appear to be contiguous. This patch modifies the range coalescing so that only ranges that are both physically and virtually contiguous are combined. This patch also adds to the dump output the physical address at the start of each range.
--- arch/powerpc/mm/dump_linuxpagetables.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
arch/powerpc/mm/dump_linuxpagetables.c +16 -2
@@ -56,6 +56,8 @@ struct pg_state {struct seq_file *seq;const struct addr_marker *marker;unsigned long start_address; +unsigned long start_pa; +unsigned long last_pa;unsigned int level;u64 current_flags; };
@@ -265,7 +267,9 @@ static void dump_addr(struct pg_state *st, unsigned long addr)const char *unit = units;unsigned long delta; -seq_printf (st->seq,"0x%016lx-0x%016lx " , st->start_address, addr-1 ); +seq_printf (st->seq,"0x%016lx-0x%016lx " , st->start_address, addr-1 ); +seq_printf (st->seq,"%016lx " , st->start_pa); + delta = (addr - st->start_address) >>10 ;/* Work out what appropriate unit to use */ while (!(delta &1023 ) && unit[1 ]) {
@@ -280,11 +284,15 @@ static void note_page(struct pg_state *st, unsigned long addr, unsigned int level, u64 val) {u64 flag = val & pg_level[level].mask; +u64 pa = val &PTE_RPN_MASK ; +/* At first no level is set */ if (!st->level) { st->level = level; st->current_flags = flag; st->start_address = addr; + st->start_pa = pa; + st->last_pa = pa;seq_printf (st->seq,"---[ %s ]---\n" , st->marker->name);/* * Dump the section of virtual memory when:
@@ -292,9 +300,11 @@ static void note_page(struct pg_state *st, unsigned long addr,* - we change levels in the tree. * - the address is in a different section of memory and is thus * used for a different purpose, regardless of the flags. +* - the pa of this page is not adjacent to the last inspected page */ }else if (flag != st->current_flags || level != st->level || - addr >= st->marker[1 ].start_address) { + addr >= st->marker[1 ].start_address || + pa != st->last_pa +PAGE_SIZE ) {/* Check the PTE flags */ if (st->current_flags) {
@@ -318,8 +328,12 @@ static void note_page(struct pg_state *st, unsigned long addr,seq_printf (st->seq,"---[ %s ]---\n" , st->marker->name); } st->start_address = addr; + st->start_pa = pa; + st->last_pa = pa; st->current_flags = flag; st->level = level; + }else { + st->last_pa = pa; } }
Signature · 1 line
2.9.3
Re: [PATCH 2/2] powerpc/mm: add phys addr to linux page table dump
Quoted 70 lines · Oliver O'Halloran
The current page table dumper scans the linux page tables and coalesces mappings with adjacent virtual addresses and similar PTE flags. This behaviour is somewhat broken when you consider the IOREMAP space where entirely unrelated mappings will appear to be contiguous. This patch modifies the range coalescing so that only ranges that are both physically and virtually contiguous are combined. This patch also adds to the dump output the physical address at the start of each range.
Cc Rashmica Gupta <[email protected]>Signed-off-by Oliver O'Halloran <[email protected]>--- arch/powerpc/mm/dump_linuxpagetables.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)arch/powerpc/mm/dump_linuxpagetables.c +12
-2@@ -56,6 +56,8 @@ struct pg_state {struct seq_file *seq;const struct addr_marker *marker;unsigned long start_address; +unsigned long start_pa; +unsigned long last_pa;unsigned int level;u64 current_flags; };@@ -265,7 +267,9 @@ static void dump_addr(struct pg_state *st, unsigned long addr)const char *unit = units;unsigned long delta; -seq_printf (st->seq,"0x%016lx-0x%016lx " , st->start_address, addr-1 ); +seq_printf (st->seq,"0x%016lx-0x%016lx " , st->start_address, addr-1 ); +seq_printf (st->seq,"%016lx " , st->start_pa); + delta = (addr - st->start_address) >>10 ;/* Work out what appropriate unit to use */ while (!(delta &1023 ) && unit[1 ]) {@@ -280,11 +284,15 @@ static void note_page(struct pg_state *st, unsigned long addr, unsigned int level, u64 val) {u64 flag = val & pg_level[level].mask; +u64 pa = val &PTE_RPN_MASK ; +/* At first no level is set */ if (!st->level) { st->level = level; st->current_flags = flag; st->start_address = addr; + st->start_pa = pa; + st->last_pa = pa;seq_printf (st->seq,"---[ %s ]---\n" , st->marker->name);/* * Dump the section of virtual memory when: @@ -292,9 +300,11 @@ static void note_page(struct pg_state *st, unsigned long addr,* - we change levels in the tree. * - the address is in a different section of memory and is thus * used for a different purpose, regardless of the flags. +* - the pa of this page is not adjacent to the last inspected page */ }else if (flag != st->current_flags || level != st->level || - addr >= st->marker[1 ].start_address) { + addr >= st->marker[1 ].start_address || + pa != st->last_pa +PAGE_SIZE ) {/* Check the PTE flags */ if (st->current_flags) {@@ -318,8 +328,12 @@ static void note_page(struct pg_state *st, unsigned long addr,seq_printf (st->seq,"---[ %s ]---\n" , st->marker->name); }
arch/powerpc/mm/dump_linuxpagetables.c static void note_page(struct pg_state *st, unsigned long addr, · line 339
Quoted 10 lines
arch/powerpc/mm/dump_linuxpagetables.c +4
-0st->start_address = addr; + st->start_pa = pa; + st->last_pa = pa; st->current_flags = flag; st->level = level; + }else { + st->last_pa = pa; } }
Makes sense to me!
Quoted 8 lines · Oliver O'Halloran
On Book3s we have two PTE flags used to mark cache-inhibited mappings:
_PAGE_TOLERANTand_PAGE_NON_IDEMPOTENT. Currently the kernel page table dumper only looks at the generic_PAGE_NO_CACHEwhich is defined to be_PAGE_TOLERANT. This patch modifies the dumper so both flags are shown in the dump.Cc Rashmica Gupta <[email protected]>Signed-off-by Oliver O'Halloran <[email protected]>
Should we also add in _PAGE_SAO that is in Book3s?
Quoted 33 lines
--- arch/powerpc/mm/dump_linuxpagetables.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)arch/powerpc/mm/dump_linuxpagetables.c +13
-0@@ -154,11 +154,24 @@ static const struct flag_info flag_array[] = { .clear = " ", }, { #endif +#ifndef CONFIG_PPC_BOOK3S_64 .mask = _PAGE_NO_CACHE, .val = _PAGE_NO_CACHE, .set = "no cache", .clear = " ", }, { +#else + .mask = _PAGE_NON_IDEMPOTENT, + .val = _PAGE_NON_IDEMPOTENT, + .set = "non-idempotent", + .clear = " ", + }, { + .mask = _PAGE_TOLERANT, + .val = _PAGE_TOLERANT, + .set = "tolerant", + .clear = " ", + }, { +#endif #ifdef CONFIG_PPC_BOOK3S_64 .mask = H_PAGE_BUSY, .val = H_PAGE_BUSY,
Michael Ellerman
reviewerQuoted 11 lines · Rashmica Gupta
Quoted 8 lines · Oliver O'Halloran
On Book3s we have two PTE flags used to mark cache-inhibited mappings:
_PAGE_TOLERANTand_PAGE_NON_IDEMPOTENT. Currently the kernel page table dumper only looks at the generic_PAGE_NO_CACHEwhich is defined to be_PAGE_TOLERANT. This patch modifies the dumper so both flags are shown in the dump.Cc Rashmica Gupta <[email protected]>Signed-off-by Oliver O'Halloran <[email protected]>Should we also add in
_PAGE_SAOthat is in Book3s?
I don't think we ever expect to see it in the kernel page tables. But if we did that would be "interesting".
I've forgotten what the code does with unknown bits, does it already print them in some way?
If not we should either add that or add _PAGE_SAO and everything else that could possibly ever be there.
cheers
Quoted 12 lines · Michael Ellerman
Quoted 9 lines · Rashmica Gupta
Quoted 8 lines · Oliver O'Halloran
On Book3s we have two PTE flags used to mark cache-inhibited mappings:
_PAGE_TOLERANTand_PAGE_NON_IDEMPOTENT. Currently the kernel page table dumper only looks at the generic_PAGE_NO_CACHEwhich is defined to be_PAGE_TOLERANT. This patch modifies the dumper so both flags are shown in the dump.Cc Rashmica Gupta <[email protected]>Signed-off-by Oliver O'Halloran <[email protected]>
Quoted 7 lines
Quoted 1 line
Should we also add in
_PAGE_SAOthat is in Book3s?I don't think we ever expect to see it in the kernel page tables. But if we did that would be "interesting".
I've forgotten what the code does with unknown bits, does it already print them in some way?
Currently it just traverses the list of known bits and prints out a message for each. Printing any unknown bits is probably a good idea. I'll send another patch to add that though and leave this one as-is.
Quoted 2 lines
If not we should either add that or add
_PAGE_SAOand everything else that could possibly ever be there.
ok
Michael Ellerman
reviewerQuoted 18 lines · Oliver O'Halloran
Quoted 17 lines · Michael Ellerman
Quoted 11 lines · Rashmica Gupta
Quoted 8 lines · Oliver O'Halloran
On Book3s we have two PTE flags used to mark cache-inhibited mappings:
_PAGE_TOLERANTand_PAGE_NON_IDEMPOTENT. Currently the kernel page table dumper only looks at the generic_PAGE_NO_CACHEwhich is defined to be_PAGE_TOLERANT. This patch modifies the dumper so both flags are shown in the dump.Cc Rashmica Gupta <[email protected]>Signed-off-by Oliver O'Halloran <[email protected]>Should we also add in
_PAGE_SAOthat is in Book3s?I don't think we ever expect to see it in the kernel page tables. But if we did that would be "interesting".
Quoted 6 lines
Quoted 2 lines
I've forgotten what the code does with unknown bits, does it already print them in some way?
Currently it just traverses the list of known bits and prints out a message for each. Printing any unknown bits is probably a good idea. I'll send another patch to add that though and leave this one as-is.
Thanks.
cheers
Quoted 8 lines · Oliver O'Halloran
On Book3s we have two PTE flags used to mark cache-inhibited mappings:
_PAGE_TOLERANTand_PAGE_NON_IDEMPOTENT. Currently the kernel page table dumper only looks at the generic_PAGE_NO_CACHEwhich is defined to be_PAGE_TOLERANT. This patch modifies the dumper so both flags are shown in the dump.Cc Rashmica Gupta <[email protected]>Signed-off-by Oliver O'Halloran <[email protected]>
Series applied to powerpc next, thanks.
https://git.kernel.org/powerpc/c/70538eaa70c36340b4bb27206cad31
cheers