lkml.org 
[lkml]   [2017]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.11 35/78] powerpc/mm: Add physical address to Linux page table dump
    Date
    4.11-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Oliver O'Halloran <oohall@gmail.com>

    commit aaa229529244a1135b29353fefb001c430db79f0 upstream.

    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 virtually 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.

    Fixes: 8eb07b187000 ("powerpc/mm: Dump linux pagetables")
    Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
    [mpe: Print the physicall address with 0x like the other addresses]
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/powerpc/mm/dump_linuxpagetables.c | 18 ++++++++++++++++--
    1 file changed, 16 insertions(+), 2 deletions(-)

    --- a/arch/powerpc/mm/dump_linuxpagetables.c
    +++ b/arch/powerpc/mm/dump_linuxpagetables.c
    @@ -57,6 +57,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;
    };
    @@ -253,7 +255,9 @@ static void dump_addr(struct pg_state *s
    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, "0x%016lx ", st->start_pa);
    +
    delta = (addr - st->start_address) >> 10;
    /* Work out what appropriate unit to use */
    while (!(delta & 1023) && unit[1]) {
    @@ -268,11 +272,15 @@ static void note_page(struct pg_state *s
    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:
    @@ -280,9 +288,11 @@ static void note_page(struct pg_state *s
    * - 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) {
    @@ -306,8 +316,12 @@ static void note_page(struct pg_state *s
    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;
    }
    }


    \
     
     \ /
      Last update: 2017-06-19 18:15    [W:4.178 / U:0.308 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site