hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/arch/powerpc/mm/book3s64/radix_pgtable.c
....@@ -783,9 +783,9 @@
783783 }
784784
785785 static void remove_pte_table(pte_t *pte_start, unsigned long addr,
786
- unsigned long end)
786
+ unsigned long end, bool direct)
787787 {
788
- unsigned long next;
788
+ unsigned long next, pages = 0;
789789 pte_t *pte;
790790
791791 pte = pte_start + pte_index(addr);
....@@ -807,13 +807,16 @@
807807 }
808808
809809 pte_clear(&init_mm, addr, pte);
810
+ pages++;
810811 }
812
+ if (direct)
813
+ update_page_count(mmu_virtual_psize, -pages);
811814 }
812815
813816 static void __meminit remove_pmd_table(pmd_t *pmd_start, unsigned long addr,
814
- unsigned long end)
817
+ unsigned long end, bool direct)
815818 {
816
- unsigned long next;
819
+ unsigned long next, pages = 0;
817820 pte_t *pte_base;
818821 pmd_t *pmd;
819822
....@@ -831,19 +834,22 @@
831834 continue;
832835 }
833836 pte_clear(&init_mm, addr, (pte_t *)pmd);
837
+ pages++;
834838 continue;
835839 }
836840
837841 pte_base = (pte_t *)pmd_page_vaddr(*pmd);
838
- remove_pte_table(pte_base, addr, next);
842
+ remove_pte_table(pte_base, addr, next, direct);
839843 free_pte_table(pte_base, pmd);
840844 }
845
+ if (direct)
846
+ update_page_count(MMU_PAGE_2M, -pages);
841847 }
842848
843849 static void __meminit remove_pud_table(pud_t *pud_start, unsigned long addr,
844
- unsigned long end)
850
+ unsigned long end, bool direct)
845851 {
846
- unsigned long next;
852
+ unsigned long next, pages = 0;
847853 pmd_t *pmd_base;
848854 pud_t *pud;
849855
....@@ -861,16 +867,20 @@
861867 continue;
862868 }
863869 pte_clear(&init_mm, addr, (pte_t *)pud);
870
+ pages++;
864871 continue;
865872 }
866873
867
- pmd_base = (pmd_t *)pud_page_vaddr(*pud);
868
- remove_pmd_table(pmd_base, addr, next);
874
+ pmd_base = pud_pgtable(*pud);
875
+ remove_pmd_table(pmd_base, addr, next, direct);
869876 free_pmd_table(pmd_base, pud);
870877 }
878
+ if (direct)
879
+ update_page_count(MMU_PAGE_1G, -pages);
871880 }
872881
873
-static void __meminit remove_pagetable(unsigned long start, unsigned long end)
882
+static void __meminit remove_pagetable(unsigned long start, unsigned long end,
883
+ bool direct)
874884 {
875885 unsigned long addr, next;
876886 pud_t *pud_base;
....@@ -898,8 +908,8 @@
898908 continue;
899909 }
900910
901
- pud_base = (pud_t *)p4d_page_vaddr(*p4d);
902
- remove_pud_table(pud_base, addr, next);
911
+ pud_base = p4d_pgtable(*p4d);
912
+ remove_pud_table(pud_base, addr, next, direct);
903913 free_pud_table(pud_base, p4d);
904914 }
905915
....@@ -922,7 +932,7 @@
922932
923933 int __meminit radix__remove_section_mapping(unsigned long start, unsigned long end)
924934 {
925
- remove_pagetable(start, end);
935
+ remove_pagetable(start, end, true);
926936 return 0;
927937 }
928938 #endif /* CONFIG_MEMORY_HOTPLUG */
....@@ -958,7 +968,7 @@
958968 #ifdef CONFIG_MEMORY_HOTPLUG
959969 void __meminit radix__vmemmap_remove_mapping(unsigned long start, unsigned long page_size)
960970 {
961
- remove_pagetable(start, start + page_size);
971
+ remove_pagetable(start, start + page_size, false);
962972 }
963973 #endif
964974 #endif
....@@ -1064,8 +1074,8 @@
10641074 pte_t entry, unsigned long address, int psize)
10651075 {
10661076 struct mm_struct *mm = vma->vm_mm;
1067
- unsigned long set = pte_val(entry) & (_PAGE_DIRTY | _PAGE_ACCESSED |
1068
- _PAGE_RW | _PAGE_EXEC);
1077
+ unsigned long set = pte_val(entry) & (_PAGE_DIRTY | _PAGE_SOFT_DIRTY |
1078
+ _PAGE_ACCESSED | _PAGE_RW | _PAGE_EXEC);
10691079
10701080 unsigned long change = pte_val(entry) ^ pte_val(*ptep);
10711081 /*
....@@ -1156,7 +1166,7 @@
11561166 pmd_t *pmd;
11571167 int i;
11581168
1159
- pmd = (pmd_t *)pud_page_vaddr(*pud);
1169
+ pmd = pud_pgtable(*pud);
11601170 pud_clear(pud);
11611171
11621172 flush_tlb_kernel_range(addr, addr + PUD_SIZE);