mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	x86/mm/dump_pagetables: Fix printout of p4d level
Modify printk_prot() and callers to print out additional page table level correctly. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Dave Hansen <dave.hansen@intel.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: linux-arch@vger.kernel.org Cc: linux-mm@kvack.org Link: http://lkml.kernel.org/r/20170716225954.74185-3-kirill.shutemov@linux.intel.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
		
							parent
							
								
									3a366f791d
								
							
						
					
					
						commit
						45dcd20913
					
				
					 1 changed files with 9 additions and 9 deletions
				
			
		| 
						 | 
					@ -138,7 +138,7 @@ static void printk_prot(struct seq_file *m, pgprot_t prot, int level, bool dmsg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	pgprotval_t pr = pgprot_val(prot);
 | 
						pgprotval_t pr = pgprot_val(prot);
 | 
				
			||||||
	static const char * const level_name[] =
 | 
						static const char * const level_name[] =
 | 
				
			||||||
		{ "cr3", "pgd", "pud", "pmd", "pte" };
 | 
							{ "cr3", "pgd", "p4d", "pud", "pmd", "pte" };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!pgprot_val(prot)) {
 | 
						if (!pgprot_val(prot)) {
 | 
				
			||||||
		/* Not present */
 | 
							/* Not present */
 | 
				
			||||||
| 
						 | 
					@ -162,12 +162,12 @@ static void printk_prot(struct seq_file *m, pgprot_t prot, int level, bool dmsg)
 | 
				
			||||||
			pt_dump_cont_printf(m, dmsg, "    ");
 | 
								pt_dump_cont_printf(m, dmsg, "    ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Bit 7 has a different meaning on level 3 vs 4 */
 | 
							/* Bit 7 has a different meaning on level 3 vs 4 */
 | 
				
			||||||
		if (level <= 3 && pr & _PAGE_PSE)
 | 
							if (level <= 4 && pr & _PAGE_PSE)
 | 
				
			||||||
			pt_dump_cont_printf(m, dmsg, "PSE ");
 | 
								pt_dump_cont_printf(m, dmsg, "PSE ");
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			pt_dump_cont_printf(m, dmsg, "    ");
 | 
								pt_dump_cont_printf(m, dmsg, "    ");
 | 
				
			||||||
		if ((level == 4 && pr & _PAGE_PAT) ||
 | 
							if ((level == 5 && pr & _PAGE_PAT) ||
 | 
				
			||||||
		    ((level == 3 || level == 2) && pr & _PAGE_PAT_LARGE))
 | 
							    ((level == 4 || level == 3) && pr & _PAGE_PAT_LARGE))
 | 
				
			||||||
			pt_dump_cont_printf(m, dmsg, "PAT ");
 | 
								pt_dump_cont_printf(m, dmsg, "PAT ");
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			pt_dump_cont_printf(m, dmsg, "    ");
 | 
								pt_dump_cont_printf(m, dmsg, "    ");
 | 
				
			||||||
| 
						 | 
					@ -298,7 +298,7 @@ static void walk_pte_level(struct seq_file *m, struct pg_state *st, pmd_t addr,
 | 
				
			||||||
	for (i = 0; i < PTRS_PER_PTE; i++) {
 | 
						for (i = 0; i < PTRS_PER_PTE; i++) {
 | 
				
			||||||
		prot = pte_flags(*start);
 | 
							prot = pte_flags(*start);
 | 
				
			||||||
		st->current_address = normalize_addr(P + i * PTE_LEVEL_MULT);
 | 
							st->current_address = normalize_addr(P + i * PTE_LEVEL_MULT);
 | 
				
			||||||
		note_page(m, st, __pgprot(prot), 4);
 | 
							note_page(m, st, __pgprot(prot), 5);
 | 
				
			||||||
		start++;
 | 
							start++;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -317,13 +317,13 @@ static void walk_pmd_level(struct seq_file *m, struct pg_state *st, pud_t addr,
 | 
				
			||||||
		if (!pmd_none(*start)) {
 | 
							if (!pmd_none(*start)) {
 | 
				
			||||||
			if (pmd_large(*start) || !pmd_present(*start)) {
 | 
								if (pmd_large(*start) || !pmd_present(*start)) {
 | 
				
			||||||
				prot = pmd_flags(*start);
 | 
									prot = pmd_flags(*start);
 | 
				
			||||||
				note_page(m, st, __pgprot(prot), 3);
 | 
									note_page(m, st, __pgprot(prot), 4);
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				walk_pte_level(m, st, *start,
 | 
									walk_pte_level(m, st, *start,
 | 
				
			||||||
					       P + i * PMD_LEVEL_MULT);
 | 
										       P + i * PMD_LEVEL_MULT);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else
 | 
							} else
 | 
				
			||||||
			note_page(m, st, __pgprot(0), 3);
 | 
								note_page(m, st, __pgprot(0), 4);
 | 
				
			||||||
		start++;
 | 
							start++;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -362,13 +362,13 @@ static void walk_pud_level(struct seq_file *m, struct pg_state *st, p4d_t addr,
 | 
				
			||||||
		    !pud_already_checked(prev_pud, start, st->check_wx)) {
 | 
							    !pud_already_checked(prev_pud, start, st->check_wx)) {
 | 
				
			||||||
			if (pud_large(*start) || !pud_present(*start)) {
 | 
								if (pud_large(*start) || !pud_present(*start)) {
 | 
				
			||||||
				prot = pud_flags(*start);
 | 
									prot = pud_flags(*start);
 | 
				
			||||||
				note_page(m, st, __pgprot(prot), 2);
 | 
									note_page(m, st, __pgprot(prot), 3);
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				walk_pmd_level(m, st, *start,
 | 
									walk_pmd_level(m, st, *start,
 | 
				
			||||||
					       P + i * PUD_LEVEL_MULT);
 | 
										       P + i * PUD_LEVEL_MULT);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else
 | 
							} else
 | 
				
			||||||
			note_page(m, st, __pgprot(0), 2);
 | 
								note_page(m, st, __pgprot(0), 3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		prev_pud = start;
 | 
							prev_pud = start;
 | 
				
			||||||
		start++;
 | 
							start++;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue