powerpc/book3s64/mm: Fix DirectMap stats in /proc/meminfo
[ Upstream commit 0da90af431abc3f497a38ec9ef6e43b0d0dabe80 ]
On memory unplug reduce DirectMap page count correctly.
root@ubuntu-guest:# grep Direct /proc/meminfo
DirectMap4k: 0 kB
DirectMap64k: 0 kB
DirectMap2M: 115343360 kB
DirectMap1G: 0 kB
Before fix:
root@ubuntu-guest:# ndctl disable-namespace all
disabled 1 namespace
root@ubuntu-guest:# grep Direct /proc/meminfo
DirectMap4k: 0 kB
DirectMap64k: 0 kB
DirectMap2M: 115343360 kB
DirectMap1G: 0 kB
After fix:
root@ubuntu-guest:# ndctl disable-namespace all
disabled 1 namespace
root@ubuntu-guest:# grep Direct /proc/meminfo
DirectMap4k: 0 kB
DirectMap64k: 0 kB
DirectMap2M: 104857600 kB
DirectMap1G: 0 kB
Fixes: a2dc009afa
("powerpc/mm/book3s/radix: Add mapping statistics")
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Tested-by: Sachin Sant <sachinp@linux.ibm.com <mailto:sachinp@linux.ibm.com>>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20230616110826.344417-4-aneesh.kumar@linux.ibm.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
7289ca7a51
commit
7afd0de0cc
@ -783,9 +783,9 @@ static void free_pud_table(pud_t *pud_start, p4d_t *p4d)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void remove_pte_table(pte_t *pte_start, unsigned long addr,
|
static void remove_pte_table(pte_t *pte_start, unsigned long addr,
|
||||||
unsigned long end)
|
unsigned long end, bool direct)
|
||||||
{
|
{
|
||||||
unsigned long next;
|
unsigned long next, pages = 0;
|
||||||
pte_t *pte;
|
pte_t *pte;
|
||||||
|
|
||||||
pte = pte_start + pte_index(addr);
|
pte = pte_start + pte_index(addr);
|
||||||
@ -807,13 +807,16 @@ static void remove_pte_table(pte_t *pte_start, unsigned long addr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
pte_clear(&init_mm, addr, pte);
|
pte_clear(&init_mm, addr, pte);
|
||||||
|
pages++;
|
||||||
}
|
}
|
||||||
|
if (direct)
|
||||||
|
update_page_count(mmu_virtual_psize, -pages);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __meminit remove_pmd_table(pmd_t *pmd_start, unsigned long addr,
|
static void __meminit remove_pmd_table(pmd_t *pmd_start, unsigned long addr,
|
||||||
unsigned long end)
|
unsigned long end, bool direct)
|
||||||
{
|
{
|
||||||
unsigned long next;
|
unsigned long next, pages = 0;
|
||||||
pte_t *pte_base;
|
pte_t *pte_base;
|
||||||
pmd_t *pmd;
|
pmd_t *pmd;
|
||||||
|
|
||||||
@ -831,19 +834,22 @@ static void __meminit remove_pmd_table(pmd_t *pmd_start, unsigned long addr,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
pte_clear(&init_mm, addr, (pte_t *)pmd);
|
pte_clear(&init_mm, addr, (pte_t *)pmd);
|
||||||
|
pages++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pte_base = (pte_t *)pmd_page_vaddr(*pmd);
|
pte_base = (pte_t *)pmd_page_vaddr(*pmd);
|
||||||
remove_pte_table(pte_base, addr, next);
|
remove_pte_table(pte_base, addr, next, direct);
|
||||||
free_pte_table(pte_base, pmd);
|
free_pte_table(pte_base, pmd);
|
||||||
}
|
}
|
||||||
|
if (direct)
|
||||||
|
update_page_count(MMU_PAGE_2M, -pages);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __meminit remove_pud_table(pud_t *pud_start, unsigned long addr,
|
static void __meminit remove_pud_table(pud_t *pud_start, unsigned long addr,
|
||||||
unsigned long end)
|
unsigned long end, bool direct)
|
||||||
{
|
{
|
||||||
unsigned long next;
|
unsigned long next, pages = 0;
|
||||||
pmd_t *pmd_base;
|
pmd_t *pmd_base;
|
||||||
pud_t *pud;
|
pud_t *pud;
|
||||||
|
|
||||||
@ -861,16 +867,20 @@ static void __meminit remove_pud_table(pud_t *pud_start, unsigned long addr,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
pte_clear(&init_mm, addr, (pte_t *)pud);
|
pte_clear(&init_mm, addr, (pte_t *)pud);
|
||||||
|
pages++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pmd_base = pud_pgtable(*pud);
|
pmd_base = pud_pgtable(*pud);
|
||||||
remove_pmd_table(pmd_base, addr, next);
|
remove_pmd_table(pmd_base, addr, next, direct);
|
||||||
free_pmd_table(pmd_base, pud);
|
free_pmd_table(pmd_base, pud);
|
||||||
}
|
}
|
||||||
|
if (direct)
|
||||||
|
update_page_count(MMU_PAGE_1G, -pages);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __meminit remove_pagetable(unsigned long start, unsigned long end)
|
static void __meminit remove_pagetable(unsigned long start, unsigned long end,
|
||||||
|
bool direct)
|
||||||
{
|
{
|
||||||
unsigned long addr, next;
|
unsigned long addr, next;
|
||||||
pud_t *pud_base;
|
pud_t *pud_base;
|
||||||
@ -899,7 +909,7 @@ static void __meminit remove_pagetable(unsigned long start, unsigned long end)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pud_base = p4d_pgtable(*p4d);
|
pud_base = p4d_pgtable(*p4d);
|
||||||
remove_pud_table(pud_base, addr, next);
|
remove_pud_table(pud_base, addr, next, direct);
|
||||||
free_pud_table(pud_base, p4d);
|
free_pud_table(pud_base, p4d);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -922,7 +932,7 @@ int __meminit radix__create_section_mapping(unsigned long start,
|
|||||||
|
|
||||||
int __meminit radix__remove_section_mapping(unsigned long start, unsigned long end)
|
int __meminit radix__remove_section_mapping(unsigned long start, unsigned long end)
|
||||||
{
|
{
|
||||||
remove_pagetable(start, end);
|
remove_pagetable(start, end, true);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_MEMORY_HOTPLUG */
|
#endif /* CONFIG_MEMORY_HOTPLUG */
|
||||||
@ -958,7 +968,7 @@ int __meminit radix__vmemmap_create_mapping(unsigned long start,
|
|||||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||||
void __meminit radix__vmemmap_remove_mapping(unsigned long start, unsigned long page_size)
|
void __meminit radix__vmemmap_remove_mapping(unsigned long start, unsigned long page_size)
|
||||||
{
|
{
|
||||||
remove_pagetable(start, start + page_size);
|
remove_pagetable(start, start + page_size, false);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user