Commit b04e12b1 authored by William Lee Irwin III's avatar William Lee Irwin III Committed by Linus Torvalds

[PATCH] report per-process pagetable usage

Andi Kleen requested that the number of pagetable pages in use by a process
be reported in /proc/$PID/status; this patch implements that.
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 4492bf66
...@@ -247,6 +247,7 @@ int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma) ...@@ -247,6 +247,7 @@ int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
page = pmd_page(*pmd); page = pmd_page(*pmd);
pmd_clear(pmd); pmd_clear(pmd);
mm->nr_ptes--;
dec_page_state(nr_page_table_pages); dec_page_state(nr_page_table_pages);
page_cache_release(page); page_cache_release(page);
} }
......
...@@ -213,6 +213,7 @@ static int prepare_low_seg_for_htlb(struct mm_struct *mm, unsigned long seg) ...@@ -213,6 +213,7 @@ static int prepare_low_seg_for_htlb(struct mm_struct *mm, unsigned long seg)
} }
page = pmd_page(*pmd); page = pmd_page(*pmd);
pmd_clear(pmd); pmd_clear(pmd);
mm->nr_ptes--;
dec_page_state(nr_page_table_pages); dec_page_state(nr_page_table_pages);
pte_free_tlb(tlb, page); pte_free_tlb(tlb, page);
} }
......
...@@ -18,12 +18,14 @@ char *task_mem(struct mm_struct *mm, char *buffer) ...@@ -18,12 +18,14 @@ char *task_mem(struct mm_struct *mm, char *buffer)
"VmData:\t%8lu kB\n" "VmData:\t%8lu kB\n"
"VmStk:\t%8lu kB\n" "VmStk:\t%8lu kB\n"
"VmExe:\t%8lu kB\n" "VmExe:\t%8lu kB\n"
"VmLib:\t%8lu kB\n", "VmLib:\t%8lu kB\n"
"VmPTE:\t%8lu kB\n",
(mm->total_vm - mm->reserved_vm) << (PAGE_SHIFT-10), (mm->total_vm - mm->reserved_vm) << (PAGE_SHIFT-10),
mm->locked_vm << (PAGE_SHIFT-10), mm->locked_vm << (PAGE_SHIFT-10),
mm->rss << (PAGE_SHIFT-10), mm->rss << (PAGE_SHIFT-10),
data << (PAGE_SHIFT-10), data << (PAGE_SHIFT-10),
mm->stack_vm << (PAGE_SHIFT-10), text, lib); mm->stack_vm << (PAGE_SHIFT-10), text, lib,
(PTRS_PER_PTE*sizeof(pte_t)*mm->nr_ptes) >> 10);
return buffer; return buffer;
} }
......
...@@ -227,7 +227,7 @@ struct mm_struct { ...@@ -227,7 +227,7 @@ struct mm_struct {
unsigned long start_brk, brk, start_stack; unsigned long start_brk, brk, start_stack;
unsigned long arg_start, arg_end, env_start, env_end; unsigned long arg_start, arg_end, env_start, env_end;
unsigned long rss, total_vm, locked_vm, shared_vm; unsigned long rss, total_vm, locked_vm, shared_vm;
unsigned long exec_vm, stack_vm, reserved_vm, def_flags; unsigned long exec_vm, stack_vm, reserved_vm, def_flags, nr_ptes;
unsigned long saved_auxv[42]; /* for /proc/PID/auxv */ unsigned long saved_auxv[42]; /* for /proc/PID/auxv */
......
...@@ -302,6 +302,7 @@ static struct mm_struct * mm_init(struct mm_struct * mm) ...@@ -302,6 +302,7 @@ static struct mm_struct * mm_init(struct mm_struct * mm)
atomic_set(&mm->mm_count, 1); atomic_set(&mm->mm_count, 1);
init_rwsem(&mm->mmap_sem); init_rwsem(&mm->mmap_sem);
mm->core_waiters = 0; mm->core_waiters = 0;
mm->nr_ptes = 0;
mm->page_table_lock = SPIN_LOCK_UNLOCKED; mm->page_table_lock = SPIN_LOCK_UNLOCKED;
mm->ioctx_list_lock = RW_LOCK_UNLOCKED; mm->ioctx_list_lock = RW_LOCK_UNLOCKED;
mm->ioctx_list = NULL; mm->ioctx_list = NULL;
......
...@@ -114,6 +114,7 @@ static inline void free_one_pmd(struct mmu_gather *tlb, pmd_t * dir) ...@@ -114,6 +114,7 @@ static inline void free_one_pmd(struct mmu_gather *tlb, pmd_t * dir)
page = pmd_page(*dir); page = pmd_page(*dir);
pmd_clear(dir); pmd_clear(dir);
dec_page_state(nr_page_table_pages); dec_page_state(nr_page_table_pages);
tlb->mm->nr_ptes--;
pte_free_tlb(tlb, page); pte_free_tlb(tlb, page);
} }
...@@ -163,7 +164,6 @@ pte_t fastcall * pte_alloc_map(struct mm_struct *mm, pmd_t *pmd, unsigned long a ...@@ -163,7 +164,6 @@ pte_t fastcall * pte_alloc_map(struct mm_struct *mm, pmd_t *pmd, unsigned long a
spin_lock(&mm->page_table_lock); spin_lock(&mm->page_table_lock);
if (!new) if (!new)
return NULL; return NULL;
/* /*
* Because we dropped the lock, we should re-check the * Because we dropped the lock, we should re-check the
* entry, as somebody else could have populated it.. * entry, as somebody else could have populated it..
...@@ -172,6 +172,7 @@ pte_t fastcall * pte_alloc_map(struct mm_struct *mm, pmd_t *pmd, unsigned long a ...@@ -172,6 +172,7 @@ pte_t fastcall * pte_alloc_map(struct mm_struct *mm, pmd_t *pmd, unsigned long a
pte_free(new); pte_free(new);
goto out; goto out;
} }
mm->nr_ptes++;
inc_page_state(nr_page_table_pages); inc_page_state(nr_page_table_pages);
pmd_populate(mm, pmd, new); pmd_populate(mm, pmd, new);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment