|
@@ -2790,6 +2790,12 @@ void hugetlb_show_meminfo(void)
|
|
1UL << (huge_page_order(h) + PAGE_SHIFT - 10));
|
|
1UL << (huge_page_order(h) + PAGE_SHIFT - 10));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void hugetlb_report_usage(struct seq_file *m, struct mm_struct *mm)
|
|
|
|
+{
|
|
|
|
+ seq_printf(m, "HugetlbPages:\t%8lu kB\n",
|
|
|
|
+ atomic_long_read(&mm->hugetlb_usage) << (PAGE_SHIFT - 10));
|
|
|
|
+}
|
|
|
|
+
|
|
/* Return the number pages of memory we physically have, in PAGE_SIZE units. */
|
|
/* Return the number pages of memory we physically have, in PAGE_SIZE units. */
|
|
unsigned long hugetlb_total_pages(void)
|
|
unsigned long hugetlb_total_pages(void)
|
|
{
|
|
{
|
|
@@ -3025,6 +3031,7 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src,
|
|
get_page(ptepage);
|
|
get_page(ptepage);
|
|
page_dup_rmap(ptepage);
|
|
page_dup_rmap(ptepage);
|
|
set_huge_pte_at(dst, addr, dst_pte, entry);
|
|
set_huge_pte_at(dst, addr, dst_pte, entry);
|
|
|
|
+ hugetlb_count_add(pages_per_huge_page(h), dst);
|
|
}
|
|
}
|
|
spin_unlock(src_ptl);
|
|
spin_unlock(src_ptl);
|
|
spin_unlock(dst_ptl);
|
|
spin_unlock(dst_ptl);
|
|
@@ -3105,6 +3112,7 @@ again:
|
|
if (huge_pte_dirty(pte))
|
|
if (huge_pte_dirty(pte))
|
|
set_page_dirty(page);
|
|
set_page_dirty(page);
|
|
|
|
|
|
|
|
+ hugetlb_count_sub(pages_per_huge_page(h), mm);
|
|
page_remove_rmap(page);
|
|
page_remove_rmap(page);
|
|
force_flush = !__tlb_remove_page(tlb, page);
|
|
force_flush = !__tlb_remove_page(tlb, page);
|
|
if (force_flush) {
|
|
if (force_flush) {
|
|
@@ -3509,6 +3517,7 @@ retry:
|
|
&& (vma->vm_flags & VM_SHARED)));
|
|
&& (vma->vm_flags & VM_SHARED)));
|
|
set_huge_pte_at(mm, address, ptep, new_pte);
|
|
set_huge_pte_at(mm, address, ptep, new_pte);
|
|
|
|
|
|
|
|
+ hugetlb_count_add(pages_per_huge_page(h), mm);
|
|
if ((flags & FAULT_FLAG_WRITE) && !(vma->vm_flags & VM_SHARED)) {
|
|
if ((flags & FAULT_FLAG_WRITE) && !(vma->vm_flags & VM_SHARED)) {
|
|
/* Optimization, do the COW without a second fault */
|
|
/* Optimization, do the COW without a second fault */
|
|
ret = hugetlb_cow(mm, vma, address, ptep, new_pte, page, ptl);
|
|
ret = hugetlb_cow(mm, vma, address, ptep, new_pte, page, ptl);
|