s390/mm,ptdump: make page table dumping seq_file optional
authorHeiko Carstens <hca@linux.ibm.com>
Wed, 9 Sep 2020 09:14:52 +0000 (11:14 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Mon, 14 Sep 2020 09:38:35 +0000 (11:38 +0200)
s390 version of ae5d1cf358a5 ("arm64: dump: Make the page table
dumping seq_file optional").

Tested-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/mm/dump_pagetables.c

index 09c7179..b7401a2 100644 (file)
@@ -51,18 +51,34 @@ struct pg_state {
        const struct addr_marker *marker;
 };
 
+#define pt_dump_seq_printf(m, fmt, args...)    \
+({                                             \
+       struct seq_file *__m = (m);             \
+                                               \
+       if (__m)                                \
+               seq_printf(__m, fmt, ##args);   \
+})
+
+#define pt_dump_seq_puts(m, fmt)               \
+({                                             \
+       struct seq_file *__m = (m);             \
+                                               \
+       if (__m)                                \
+               seq_printf(__m, fmt);           \
+})
+
 static void print_prot(struct seq_file *m, unsigned int pr, int level)
 {
        static const char * const level_name[] =
                { "ASCE", "PGD", "PUD", "PMD", "PTE" };
 
-       seq_printf(m, "%s ", level_name[level]);
+       pt_dump_seq_printf(m, "%s ", level_name[level]);
        if (pr & _PAGE_INVALID) {
-               seq_printf(m, "I\n");
+               pt_dump_seq_printf(m, "I\n");
                return;
        }
-       seq_puts(m, (pr & _PAGE_PROTECT) ? "RO " : "RW ");
-       seq_puts(m, (pr & _PAGE_NOEXEC) ? "NX\n" : "X\n");
+       pt_dump_seq_puts(m, (pr & _PAGE_PROTECT) ? "RO " : "RW ");
+       pt_dump_seq_puts(m, (pr & _PAGE_NOEXEC) ? "NX\n" : "X\n");
 }
 
 static void note_page(struct ptdump_state *pt_st, unsigned long addr, int level, u64 val)
@@ -87,25 +103,25 @@ static void note_page(struct ptdump_state *pt_st, unsigned long addr, int level,
        if (level == -1)
                addr = max_addr;
        if (st->level == -1) {
-               seq_printf(m, "---[ %s ]---\n", st->marker->name);
+               pt_dump_seq_printf(m, "---[ %s ]---\n", st->marker->name);
                st->start_address = addr;
                st->current_prot = prot;
                st->level = level;
        } else if (prot != st->current_prot || level != st->level ||
                   addr >= st->marker[1].start_address) {
-               seq_printf(m, "0x%0*lx-0x%0*lx ",
-                          width, st->start_address,
-                          width, addr);
+               pt_dump_seq_printf(m, "0x%0*lx-0x%0*lx ",
+                                  width, st->start_address,
+                                  width, addr);
                delta = (addr - st->start_address) >> 10;
                while (!(delta & 0x3ff) && unit[1]) {
                        delta >>= 10;
                        unit++;
                }
-               seq_printf(m, "%9lu%c ", delta, *unit);
+               pt_dump_seq_printf(m, "%9lu%c ", delta, *unit);
                print_prot(m, st->current_prot, st->level);
                while (addr >= st->marker[1].start_address) {
                        st->marker++;
-                       seq_printf(m, "---[ %s ]---\n", st->marker->name);
+                       pt_dump_seq_printf(m, "---[ %s ]---\n", st->marker->name);
                }
                st->start_address = addr;
                st->current_prot = prot;