2009-11-14 02:00:42

by Steven J. Magnani

[permalink] [raw]
Subject: [PATCH] procfs: Use proper units for noMMU statm

On no-MMU systems, sizes reported in /proc/n/statm have units of bytes.
Per Documentation/filesystems/proc.txt, these values should be in pages.

Signed-off-by: Steven J. Magnani <[email protected]>
---
diff -uprN a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c
--- a/fs/proc/task_nommu.c 2009-11-13 16:48:14.000000000 -0600
+++ b/fs/proc/task_nommu.c 2009-11-13 16:51:09.000000000 -0600
@@ -110,8 +110,11 @@ int task_statm(struct mm_struct *mm, int
}
}

- size += (*text = mm->end_code - mm->start_code);
- size += (*data = mm->start_stack - mm->start_data);
+ size >>= PAGE_SHIFT;
+ *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK))
+ >> PAGE_SHIFT;
+ *data = (mm->start_stack - mm->start_data) >> PAGE_SHIFT;
+ size += *text + *data;
up_read(&mm->mmap_sem);
*resident = size;
return size;


2009-11-14 04:41:12

by Cong Wang

[permalink] [raw]
Subject: Re: [PATCH] procfs: Use proper units for noMMU statm

On Fri, Nov 13, 2009 at 07:52:14PM -0600, [email protected] wrote:
>On no-MMU systems, sizes reported in /proc/n/statm have units of bytes.
>Per Documentation/filesystems/proc.txt, these values should be in pages.
>
>Signed-off-by: Steven J. Magnani <[email protected]>
>---
>diff -uprN a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c
>--- a/fs/proc/task_nommu.c 2009-11-13 16:48:14.000000000 -0600
>+++ b/fs/proc/task_nommu.c 2009-11-13 16:51:09.000000000 -0600
>@@ -110,8 +110,11 @@ int task_statm(struct mm_struct *mm, int
> }
> }
>
>- size += (*text = mm->end_code - mm->start_code);
>- size += (*data = mm->start_stack - mm->start_data);
>+ size >>= PAGE_SHIFT;
>+ *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK))
>+ >> PAGE_SHIFT;
>+ *data = (mm->start_stack - mm->start_data) >> PAGE_SHIFT;

Are '->start_stack' and '->start_data' already page aligned on NOMMU arch?

If yes, this patch looks good.


>+ size += *text + *data;
> up_read(&mm->mmap_sem);
> *resident = size;
> return size;
>
>--
>To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>the body of a message to [email protected]
>More majordomo info at http://vger.kernel.org/majordomo-info.html
>Please read the FAQ at http://www.tux.org/lkml/

--
Live like a child, think like the god.

2009-11-16 14:55:46

by Steven J. Magnani

[permalink] [raw]
Subject: Re: [PATCH] procfs: Use proper units for noMMU statm

On Sat, 2009-11-14 at 12:41 +0800, Américo Wang wrote:
> On Fri, Nov 13, 2009 at 07:52:14PM -0600, [email protected] wrote:
> >On no-MMU systems, sizes reported in /proc/n/statm have units of bytes.
> >Per Documentation/filesystems/proc.txt, these values should be in pages.
> >
> > ...
> >
> >+ *data = (mm->start_stack - mm->start_data) >> PAGE_SHIFT;
>
> Are '->start_stack' and '->start_data' already page aligned on NOMMU arch?
>

In looking over binfmt_flat.c (main executable type for noMMU systems),
I don't think there's a guarantee of more than 32- or 64-bit alignment.
Thanks for the suggestion, I'll submit an updated patch.

------------------------------------------------------------------------
Steven J. Magnani "I claim this network for MARS!
http://www.digidescorp.com Earthling, return my space modulator!"

#include <standard.disclaimer>


2009-11-16 14:55:46

by Steven J. Magnani

[permalink] [raw]
Subject: [PATCH v2] procfs: Use proper units for noMMU statm

Reworked to guarantee page alignment of terms used in data size calculation
and to reduce time spent with mmap_sem held.

On no-MMU systems, sizes reported in /proc/n/statm have units of bytes.
Per Documentation/filesystems/proc.txt, these values should be in pages.

Signed-off-by: Steven J. Magnani <[email protected]>
---

diff -uprN a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c
--- a/fs/proc/task_nommu.c 2009-11-13 16:48:14.000000000 -0600
+++ b/fs/proc/task_nommu.c 2009-11-14 12:17:00.000000000 -0600
@@ -110,9 +110,13 @@ int task_statm(struct mm_struct *mm, int
}
}

- size += (*text = mm->end_code - mm->start_code);
- size += (*data = mm->start_stack - mm->start_data);
+ *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK))
+ >> PAGE_SHIFT;
+ *data = (PAGE_ALIGN(mm->start_stack) - (mm->start_data & PAGE_MASK))
+ >> PAGE_SHIFT;
up_read(&mm->mmap_sem);
+ size >>= PAGE_SHIFT;
+ size += *text + *data;
*resident = size;
return size;
}