Messages in this thread Patch in this message | | | Date | Thu, 21 Oct 2004 18:35:15 -0700 | From | Jay Lan <> | Subject | [Lse-tech] [PATCH 2.6.9 2/2] enhanced accounting data collection |
| |
2/2: acct_mm
Enhanced MM accounting data collection.
Signed-off-by: Jay Lan <jlan@sgi.com>
Index: linux/fs/exec.c =================================================================== --- linux.orig/fs/exec.c 2004-10-01 17:16:34.924263618 -0700 +++ linux/fs/exec.c 2004-10-14 12:13:17.600743917 -0700 @@ -47,6 +47,7 @@ #include <linux/syscalls.h> #include <linux/rmap.h> #include <linux/pagg.h> +#include <linux/acct.h> #include <asm/uaccess.h> #include <asm/mmu_context.h> @@ -1163,6 +1164,8 @@ /* execve success */ security_bprm_free(bprm); + acct_update_integrals(); + update_mem_hiwater(); kfree(bprm); return retval; } Index: linux/include/linux/sched.h =================================================================== --- linux.orig/include/linux/sched.h 2004-10-01 17:16:35.105905373 -0700 +++ linux/include/linux/sched.h 2004-10-14 12:15:33.450280955 -0700 @@ -249,6 +249,8 @@ struct kioctx *ioctx_list; struct kioctx default_kioctx; + + unsigned long hiwater_rss, hiwater_vm; }; extern int mmlist_nr; @@ -593,6 +595,10 @@ /* i/o counters(bytes read/written, #syscalls */ unsigned long rchar, wchar, syscr, syscw; +#if defined(CONFIG_BSD_PROCESS_ACCT) + u64 acct_rss_mem1, acct_vm_mem1; + clock_t acct_stimexpd; +#endif }; @@ -817,6 +823,19 @@ /* Remove the current tasks stale references to the old mm_struct */ extern void mm_release(struct task_struct *, struct mm_struct *); +/* Update highwater values */ +static inline void update_mem_hiwater(void) +{ + if (current->mm) { + if (current->mm->hiwater_rss < current->mm->rss) { + current->mm->hiwater_rss = current->mm->rss; + } + if (current->mm->hiwater_vm < current->mm->total_vm) { + current->mm->hiwater_vm = current->mm->total_vm; + } + } +} + extern int copy_thread(int, unsigned long, unsigned long, unsigned long, struct task_struct *, struct pt_regs *); extern void flush_thread(void); extern void exit_thread(void); Index: linux/kernel/exit.c =================================================================== --- linux.orig/kernel/exit.c 2004-10-01 17:16:34.931099598 -0700 +++ linux/kernel/exit.c 2004-10-14 12:16:36.448747186 -0700 @@ -808,6 +808,8 @@ ptrace_notify((PTRACE_EVENT_EXIT << 8) | SIGTRAP); } + acct_update_integrals(); + update_mem_hiwater(); acct_process(code); __exit_mm(tsk); Index: linux/kernel/fork.c =================================================================== --- linux.orig/kernel/fork.c 2004-10-01 17:16:35.106881941 -0700 +++ linux/kernel/fork.c 2004-10-14 12:17:21.626782307 -0700 @@ -39,7 +39,7 @@ #include <linux/profile.h> #include <linux/rmap.h> #include <linux/pagg.h> - +#include <linux/acct.h> #include <asm/pgtable.h> #include <asm/pgalloc.h> #include <asm/uaccess.h> @@ -609,6 +609,9 @@ if (retval) goto free_pt; + mm->hiwater_rss = mm->rss; + mm->hiwater_vm = mm->total_vm; + good_mm: tsk->mm = mm; tsk->active_mm = mm; @@ -996,6 +999,8 @@ p->utime = p->stime = 0; p->rchar = p->wchar = p->syscr = p->syscw = 0; + acct_clear_integrals(p); + p->lock_depth = -1; /* -1 = no lock */ p->start_time = get_jiffies_64(); p->security = NULL; Index: linux/mm/memory.c =================================================================== --- linux.orig/mm/memory.c 2004-09-29 20:04:32.000000000 -0700 +++ linux/mm/memory.c 2004-10-14 12:18:22.611563293 -0700 @@ -44,6 +44,7 @@ #include <linux/highmem.h> #include <linux/pagemap.h> #include <linux/rmap.h> +#include <linux/acct.h> #include <linux/module.h> #include <linux/init.h> @@ -605,6 +606,7 @@ tlb = tlb_gather_mmu(mm, 0); unmap_vmas(&tlb, mm, vma, address, end, &nr_accounted, details); tlb_finish_mmu(tlb, address, end); + acct_update_integrals(); spin_unlock(&mm->page_table_lock); } @@ -1095,9 +1097,11 @@ spin_lock(&mm->page_table_lock); page_table = pte_offset_map(pmd, address); if (likely(pte_same(*page_table, pte))) { - if (PageReserved(old_page)) + if (PageReserved(old_page)) { ++mm->rss; - else + acct_update_integrals(); + update_mem_hiwater(); + } else page_remove_rmap(old_page); break_cow(vma, new_page, address, page_table); lru_cache_add_active(new_page); @@ -1379,6 +1383,9 @@ remove_exclusive_swap_page(page); mm->rss++; + acct_update_integrals(); + update_mem_hiwater(); + pte = mk_pte(page, vma->vm_page_prot); if (write_access && can_share_swap_page(page)) { pte = maybe_mkwrite(pte_mkdirty(pte), vma); @@ -1444,6 +1451,8 @@ goto out; } mm->rss++; + acct_update_integrals(); + update_mem_hiwater(); entry = maybe_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot)), vma); @@ -1553,6 +1562,9 @@ if (pte_none(*page_table)) { if (!PageReserved(new_page)) ++mm->rss; + acct_update_integrals(); + update_mem_hiwater(); + flush_icache_page(vma, new_page); entry = mk_pte(new_page, vma->vm_page_prot); if (write_access) Index: linux/mm/mmap.c =================================================================== --- linux.orig/mm/mmap.c 2004-09-29 20:05:13.000000000 -0700 +++ linux/mm/mmap.c 2004-10-14 12:18:56.394014760 -0700 @@ -20,6 +20,7 @@ #include <linux/hugetlb.h> #include <linux/profile.h> #include <linux/module.h> +#include <linux/acct.h> #include <linux/mount.h> #include <linux/mempolicy.h> #include <linux/rmap.h> @@ -1014,6 +1015,8 @@ down_write(&mm->mmap_sem); } __vm_stat_account(mm, vm_flags, file, len >> PAGE_SHIFT); + acct_update_integrals(); + update_mem_hiwater(); return addr; unmap_and_free_vma: @@ -1360,6 +1363,8 @@ if (vma->vm_flags & VM_LOCKED) vma->vm_mm->locked_vm += grow; __vm_stat_account(vma->vm_mm, vma->vm_flags, vma->vm_file, grow); + acct_update_integrals(); + update_mem_hiwater(); anon_vma_unlock(vma); return 0; } @@ -1816,6 +1821,8 @@ mm->locked_vm += len >> PAGE_SHIFT; make_pages_present(addr, addr + len); } + acct_update_integrals(); + update_mem_hiwater(); return addr; } Index: linux/mm/mremap.c =================================================================== --- linux.orig/mm/mremap.c 2004-09-29 20:04:57.000000000 -0700 +++ linux/mm/mremap.c 2004-10-14 12:19:20.738903400 -0700 @@ -16,6 +16,7 @@ #include <linux/fs.h> #include <linux/highmem.h> #include <linux/security.h> +#include <linux/acct.h> #include <asm/uaccess.h> #include <asm/cacheflush.h> @@ -232,6 +233,9 @@ new_addr + new_len); } + acct_update_integrals(); + update_mem_hiwater(); + return new_addr; } @@ -368,6 +372,8 @@ make_pages_present(addr + old_len, addr + new_len); } + acct_update_integrals(); + update_mem_hiwater(); ret = addr; goto out; } Index: linux/mm/rmap.c =================================================================== --- linux.orig/mm/rmap.c 2004-09-29 20:05:41.000000000 -0700 +++ linux/mm/rmap.c 2004-10-14 15:22:02.760847036 -0700 @@ -50,6 +50,7 @@ #include <linux/swapops.h> #include <linux/slab.h> #include <linux/init.h> +#include <linux/acct.h> #include <linux/rmap.h> #include <linux/rcupdate.h> @@ -581,6 +582,7 @@ } mm->rss--; + acct_update_integrals(); page_remove_rmap(page); page_cache_release(page); @@ -680,6 +682,7 @@ page_remove_rmap(page); page_cache_release(page); + acct_update_integrals(); mm->rss--; (*mapcount)--; } Index: linux/mm/swapfile.c =================================================================== --- linux.orig/mm/swapfile.c 2004-09-29 20:04:22.000000000 -0700 +++ linux/mm/swapfile.c 2004-10-14 12:20:00.377839180 -0700 @@ -24,6 +24,7 @@ #include <linux/module.h> #include <linux/rmap.h> #include <linux/security.h> +#include <linux/acct.h> #include <linux/backing-dev.h> #include <asm/pgtable.h> @@ -435,6 +436,8 @@ set_pte(dir, pte_mkold(mk_pte(page, vma->vm_page_prot))); page_add_anon_rmap(page, vma, address); swap_free(entry); + acct_update_integrals(); + update_mem_hiwater(); } /* vma->vm_mm->page_table_lock is held */ Index: linux/include/linux/acct.h =================================================================== --- linux.orig/include/linux/acct.h 2004-09-29 20:04:21.000000000 -0700 +++ linux/include/linux/acct.h 2004-10-14 12:09:18.730013599 -0700 @@ -120,9 +120,34 @@ struct super_block; extern void acct_auto_close(struct super_block *sb); extern void acct_process(long exitcode); + +static inline void acct_update_integrals(void) +{ + long delta; + + if (current->mm) { + delta = current->stime - current->acct_stimexpd; + current->acct_stimexpd = current->stime; + current->acct_rss_mem1 += delta * current->mm->rss; + current->acct_vm_mem1 += delta * current->mm->total_vm; + } +} + +static inline void acct_clear_integrals(struct task_struct *tsk) +{ + if (tsk) { + tsk->acct_stimexpd = 0; + tsk->acct_rss_mem1 = 0; + tsk->acct_vm_mem1 = 0; + } +} + #else #define acct_auto_close(x) do { } while (0) #define acct_process(x) do { } while (0) + +#define acct_update_integrals() do { } while (0) +#define acct_clear_integrals(task) do { } while (0) #endif /* | |