Both set_huge_pte_at(...) and huge_ptep_get_and_clear(...)
call real_hugepage_size_to_pte_count_idx(hugepage_size) when adjusting
huge_pte_count. For 8MB/4MB the huge_pte_count index computed is 1(one).
This is incorrect because this index is for xl_hugepages. So the tsb
grow code in the mm fault path does not grow the tsb for 8MB/4MB
hugepages.
Signed-off-by: Bob Picco <bob.picco@oracle.com>
Signed-off-by: Vijay Kumar <vijay.ac.kumar@oracle.com>
Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
Tested-by: Mike Kravetz <mike.kravetz@oracle.com>
Orabug:
24490586
(cherry picked from commit
c928d6fccaa59bd4b6cffc904144fa67a4726ff6)
Signed-off-by: Allen Pais <allen.pais@oracle.com>
return pte_count_index;
}
-static inline unsigned int real_hugepage_size_to_pte_count_idx(
- unsigned long real_hugepage_size)
-{
- unsigned int pte_count_index = MM_PTES_HUGE;
-
- if (real_hugepage_size != REAL_HPAGE_SIZE)
- pte_count_index = MM_PTES_XLHUGE;
-
- return pte_count_index;
-}
-
void __init hv_establish_xl_hugepage_tsb_descriptor(unsigned short pgsz_idx,
unsigned int pgsz_mask);
if (!pte_present(*ptep) && pte_present(entry)) {
unsigned int pte_count_idx =
- real_hugepage_size_to_pte_count_idx(hugepage_size);
+ hugepage_size_to_pte_count_idx(hugepage_size);
mm->context.huge_pte_count[pte_count_idx]++;
}
if (pte_present(entry)) {
unsigned int pte_count_idx =
- real_hugepage_size_to_pte_count_idx(hugepage_size);
+ hugepage_size_to_pte_count_idx(hugepage_size);
mm->context.huge_pte_count[pte_count_idx]--;
}