From: William Lee Irwin III <wli@holomorphy.com>
To: Roger Luethi <rl@hellgate.ch>
Cc: Andrew Morton <akpm@osdl.org>,
linux-kernel@vger.kernel.org,
Albert Cahalan <albert@users.sf.net>, Paul Jackson <pj@sgi.com>
Subject: [2/2] handle CONFIG_MMU=n and use new vm stats for CONFIG_MMU=y
Date: Wed, 8 Sep 2004 18:21:37 -0700 [thread overview]
Message-ID: <20040909012137.GM3106@holomorphy.com> (raw)
In-Reply-To: <20040909011708.GL3106@holomorphy.com>
On Wed, Sep 08, 2004 at 06:15:49PM -0700, William Lee Irwin III wrote:
>> This is a straight rediff of nproc vs. 2.6.9-rc1-mm4. No changes
>> whatsoever to the underlying code were made; rather, this merely
>> resolves offsets so it applies cleanly.
>> Compiletested on ia64.
On Wed, Sep 08, 2004 at 06:17:08PM -0700, William Lee Irwin III wrote:
> Repost with appropriate Subject: line.
Make __task_mem() and __task_mem_cheap() use the appropriate methods
for CONFIG_MMU=y and add some attempt at correct code for CONFIG_MMU=n.
The new methods for /proc/ accounting involve using counters kept in
the mm instead of iteration over vmas. For the CONFIG_MMU=y case this
does not involve acquiring mm->mmap_sem for any per-mm statistics. The
CONFIG_MMU=n case still needs iteration over tblocks to calculate them.
-- wli
Index: mm4-2.6.9-rc1/kernel/nproc.c
===================================================================
--- mm4-2.6.9-rc1.orig/kernel/nproc.c 2004-09-08 17:45:27.503587983 -0700
+++ mm4-2.6.9-rc1/kernel/nproc.c 2004-09-08 18:11:24.826811093 -0700
@@ -44,44 +44,20 @@
* __task_mem/__task_mem_cheap basically duplicate the MMU version of
* task_mem, but they are split by cost and work on structs.
*/
-
+#ifdef CONFIG_MMU
static void __task_mem(struct task_struct *tsk, struct task_mem *res)
{
struct mm_struct *mm = get_task_mm(tsk);
- if (mm) {
- unsigned long data = 0, stack = 0, exec = 0, lib = 0;
- struct vm_area_struct *vma;
-
- down_read(&mm->mmap_sem);
- for (vma = mm->mmap; vma; vma = vma->vm_next) {
- unsigned long len = (vma->vm_end - vma->vm_start) >> 10;
- if (!vma->vm_file) {
- data += len;
- if (vma->vm_flags & VM_GROWSDOWN)
- stack += len;
- continue;
- }
- if (vma->vm_flags & VM_WRITE)
- continue;
- if (vma->vm_flags & VM_EXEC) {
- exec += len;
- if (vma->vm_flags & VM_EXECUTABLE)
- continue;
- lib += len;
- }
- }
- res->vmdata = data - stack;
- res->vmstack = stack;
- res->vmexe = exec - lib;
- res->vmlib = lib;
- up_read(&mm->mmap_sem);
+ if (!mm)
+ memset(res, 0, sizeof(struct task_mem));
+ else {
+ res->vmdata = (mm->total_vm - mm->shared_vm - mm->stack_vm)
+ << (PAGE_SHIFT - 10);
+ res->vmstack = mm->stack_vm << (PAGE_SHIFT - 10);
+ res->vmexe = PAGE_ALIGN(mm->end_code - mm->start_code) >> 10;
+ res->vmlib = (mm->exec_vm << (PAGE_SHIFT - 10)) - res->vmexe;
mmput(mm);
- } else {
- res->vmdata = 0;
- res->vmstack = 0;
- res->vmexe = 0;
- res->vmlib = 0;
}
}
@@ -99,6 +75,80 @@
res->vmrss = 0;
}
}
+#else /* !CONFIG_MMU */
+static void __task_mem(task_t *task, struct task_mem *stats)
+{
+ struct mm_struct *mm = get_task_mm(task)
+
+ if (!mm)
+ memset(stats, 0, sizeof(struct task_mem));
+ else {
+ unsigned long bytes = 0, sbytes = 0, slack = 0;
+ struct mm_tblk_struct *tblk;
+
+ down_read(&mm->mmap_sem);
+ for (tblk = &mm->context.tblk; tblk; tblk = tblk->next) {
+ if (!tblk->rblock)
+ continue;
+ bytes += kobjsize(tblk);
+ if (atomic_read(&mm->mm_count) > 1) ||
+ tblk->rblock->refcount > 1) {
+ sbytes += kobjsize(tblk->rblock->kblock);
+ sbytes += kobjsize(tblk->rblock);
+ } else {
+ bytes += kobjsize(tblk->rblock->kblock);
+ bytes += kobjsize(tblk->rblock);
+ slack += kobjsize(tblock->rblock->kblock);
+ }
+ }
+ if (atomic_read(&mm->mm_count) > 1)
+ sbytes += kobjsize(mm);
+ else
+ bytes += kobjsize(mm);
+ up_read(&mm->mmap_sem);
+ mmput(mm);
+ if (task->fs && atomic_read(&task->fs->count) > 1)
+ sbytes += kobjsize(task->files);
+ else
+ bytes += kobjsize(task->files);
+ if (task->sighand && atomic_read(&task->sighand->count) > 1)
+ sbytes += kobjsize(task->sighand);
+ else
+ bytes += kobjsize(task->sighand);
+ bytes += kobjsize(task);
+ /* some interpretation is needed */
+ stats->vmdata = bytes;
+ stats->vmstack = sbytes;
+ stats->vmexe = stats->vmlib = 0;
+ }
+}
+
+static void __task_mem_cheap(task_t *task, struct task_mem_cheap *stats)
+{
+ struct mm_struct *mm = get_task_mm(task);
+ struct mm_tblock_struct *tblk;
+ int size;
+
+ memset(stats, 0, sizeof(struct task_mem_cheap));
+ stats->vmrss += kobjsize(mm);
+ down_read(&mm->mmap_sem);
+ for (tblk = &mm->context.block; tblk; tblk = tblk->next) {
+ if (tblk->next)
+ stats->vmrss += kobjsize(tblk->next);
+ if (tblk->rblock) {
+ stats->vmsize += kobjsize(tblk->rblock);
+ stats->vmrss += kobjsize(tblk->rblock);
+ stats->vmrss += kobjsize(tblk->rblock->kblock);
+ }
+ }
+ stats->vmrss += mm->end_code - mm->start_code;
+ stats->vmrss += mm->start_stack - mm->start_data;
+ up_read(&mm->mmap_sem);
+ mmput(mm);
+ stats->vmrss >>= 10;
+ stats->vmsize >>= 10;
+}
+#endif /* !CONFIG_MMU */
/*
* page_alloc.c already has an extra function broken out to fill a
next prev parent reply other threads:[~2004-09-09 1:24 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-09-08 18:40 [0/1][ANNOUNCE] nproc v2: netlink access to /proc information Roger Luethi
2004-09-08 18:41 ` [1/1][PATCH] " Roger Luethi
2004-09-09 0:35 ` William Lee Irwin III
2004-09-09 0:43 ` William Lee Irwin III
2004-09-09 1:15 ` William Lee Irwin III
2004-09-09 1:17 ` [1/2] rediff nproc v2 vs. 2.6.9-rc1-mm4 William Lee Irwin III
2004-09-09 1:21 ` William Lee Irwin III [this message]
2004-09-09 1:22 ` [2/2] handle CONFIG_MMU=n and use new vm stats for CONFIG_MMU=y William Lee Irwin III
2004-09-09 1:26 ` [3/2] round up text memory to the nearest page in fs/proc/task_mmu.c William Lee Irwin III
2004-09-09 18:43 ` [1/1][PATCH] nproc v2: netlink access to /proc information Roger Luethi
2004-09-09 18:49 ` William Lee Irwin III
2004-09-09 19:00 ` William Lee Irwin III
2004-09-09 19:02 ` [4/2] consolidate __task_mem() and __task_mem_cheap() William Lee Irwin III
2004-09-09 19:07 ` Roger Luethi
2004-09-09 19:15 ` [5/2] fix nommu VSZ reporting in consolidated task_mem() William Lee Irwin III
2004-09-09 19:11 ` [1/1][PATCH] nproc v2: netlink access to /proc information Roger Luethi
2004-09-09 19:23 ` William Lee Irwin III
2004-09-09 21:19 ` Roger Luethi
2004-09-10 15:30 ` Roger Luethi
2004-09-11 22:25 ` Albert Cahalan
2004-09-12 4:58 ` William Lee Irwin III
2004-09-14 5:59 ` Roger Luethi
2004-09-14 6:18 ` William Lee Irwin III
2004-09-14 6:23 ` William Lee Irwin III
2004-09-14 7:47 ` Greg Ungerer
2004-09-14 8:27 ` Roger Luethi
2004-09-09 11:53 ` Stephen Smalley
2004-09-09 17:22 ` William Lee Irwin III
2004-09-09 17:53 ` Roger Luethi
2004-09-09 20:01 ` Stephen Smalley
2004-09-09 20:48 ` Chris Wright
2004-09-10 12:11 ` Stephen Smalley
2004-09-09 20:55 ` Roger Luethi
2004-09-09 21:05 ` Chris Wright
2004-09-09 21:25 ` Roger Luethi
2004-09-11 22:36 ` Albert Cahalan
2004-09-12 5:00 ` William Lee Irwin III
2004-09-14 6:44 ` Roger Luethi
2004-09-14 7:10 ` William Lee Irwin III
2004-09-14 7:55 ` Roger Luethi
2004-09-14 8:01 ` William Lee Irwin III
2004-09-14 9:27 ` Roger Luethi
2004-09-14 15:37 ` William Lee Irwin III
2004-09-14 16:01 ` Roger Luethi
2004-09-14 16:37 ` William Lee Irwin III
2004-09-14 17:15 ` Roger Luethi
2004-09-14 17:43 ` William Lee Irwin III
2004-09-14 18:45 ` Roger Luethi
2004-09-14 19:07 ` William Lee Irwin III
2004-09-14 19:31 ` Roger Luethi
2004-09-14 19:36 ` William Lee Irwin III
2004-09-14 19:50 ` Roger Luethi
2004-09-15 11:44 ` Roger Luethi
2004-09-15 20:02 ` Roger Luethi
2004-09-15 20:20 ` William Lee Irwin III
2004-09-15 20:33 ` Roger Luethi
2004-09-15 20:44 ` Roger Luethi
2004-09-14 18:37 ` Chris Wright
2004-09-14 18:55 ` Roger Luethi
2004-09-14 19:05 ` Chris Wright
2004-09-14 21:12 ` Roger Luethi
2004-09-09 20:44 ` Chris Wright
2004-09-16 21:43 ` nproc: So? Roger Luethi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040909012137.GM3106@holomorphy.com \
--to=wli@holomorphy.com \
--cc=akpm@osdl.org \
--cc=albert@users.sf.net \
--cc=linux-kernel@vger.kernel.org \
--cc=pj@sgi.com \
--cc=rl@hellgate.ch \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox