From: Andrew Morton <akpm@linux-foundation.org>
To: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Pavel Emelyanov <xemul@parallels.com>,
LKML <linux-kernel@vger.kernel.org>,
Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: Re: [rfc 0/2] Introducing VmFlags field into smaps output
Date: Tue, 23 Oct 2012 14:30:45 -0700 [thread overview]
Message-ID: <20121023143045.183657c4.akpm@linux-foundation.org> (raw)
In-Reply-To: <20121023071549.GC7020@moon>
On Tue, 23 Oct 2012 11:15:49 +0400
Cyrill Gorcunov <gorcunov@openvz.org> wrote:
> On Tue, Oct 23, 2012 at 10:34:30AM +0400, Cyrill Gorcunov wrote:
> > On Mon, Oct 22, 2012 at 11:30:25PM -0700, Andrew Morton wrote:
> > ...
> > > > Yup, but not only that, this kind of trick hides associativity between
> > > > VM_ constant and mnemonic, so on changes one would have to figure out
> > > > which position some flag has in this foo[] array, so I vote for not
> > > > use it :-)
> > >
> > > Well you could do
> > >
> > > struct {
> > > char x[2];
> > > } y[] = {
> > > [CLOG2(VM_DONTEXPAND)] = { 'd', 'e' },
> > > [CLOG2(VM_ACCOUNT)] = { 'a', 'c' },
> > > [CLOG2(VM_NORESERVE)] = { 'n', 'r' },
> > > };
> > >
> > > ...
> > >
> > > for (i = 0; i < BITS_PER_LONG; i++) {
> > > if (flags & (1 << i))
> > > seq_printf("%c%c ", y[i][0], y[i][1]);
> > > }
> > >
> > > where CLOG2() is extracted from the guts of ilog2().
> > >
> > > I'll stop now :)
> >
> > Yup, this one will be a wy better. Letme try it out :)
>
> ilog2 works well enough here as well.
> ---
> From: Cyrill Gorcunov <gorcunov@openvz.org>
> Subject: procfs: add VmFlags field in smaps output v3
>
> During c/r sessions we've found that there is no way at the moment to
> fetch some VMA associated flags, such as mlock() and madvise().
>
> This leads us to a problem -- we don't know if we should call for
> mlock() and/or madvise() after restore on the vma area we're bringing
> back to life.
>
> This patch intorduces a new field into "smaps" output called VmFlags,
> where all set flags associated with the particular VMA is shown as two
> letter mnemonics.
>
> [ Strictly speaking for c/r we only need mlock/madvise bits but it has been
> said that providing just a few flags looks somehow inconsistent. So all
> flags are here now. ]
>
> This feature is made available on CONFIG_CHECKPOINT_RESTORE=n kernels, as
> other applications may start to use these fields.
>
> The data is encoded in a somewhat awkward two letters mnemonic form, to
> encourage userspace to be prepared for fields being added or removed in
> the future.
>
Wow. This version generates 1k less kernel bloat than v2! Gee, and I
only sent that email as a late-night joke ;)
fs/proc/task_mmu.o with neither patch:
text data bss dec hex filename
14849 112 5312 20273 4f31 fs/proc/task_mmu.o
fs/proc/task_mmu.o with the v2 patch:
16074 112 5776 21962 55ca fs/proc/task_mmu.o
fs/proc/task_mmu.o with the v3 patch:
15446 112 5368 20926 51be fs/proc/task_mmu.o
fs/proc/task_mmu.o with the v3 patch and the below fix:
15123 112 5352 20587 506b fs/proc/task_mmu.o
So the delta has gone from 1700 bytes down to 300. Seems that it pays
to be anal about these things ;)
Don't forget the `static'! Without it, the compiler will need to
construct the array as a temporary on the stack each time the function
is called - it's just terrible. (There's no reason why the compiler
can't insert the static for us as an optimisation, and I think later
gcc's may have got smarter about this).
Was there a reason why you added the ".l = " to the initialiser? My
gcc is happy without it.
Also... what happens if there's an unrecognised bit set in `flags'?
Memory corruption or code skew could cause this. We emit a couple of
NULs into the procfs output, which I guess is an OK response to such a
condition.
From: Andrew Morton <akpm@linux-foundation.org>
Subject: procfs-add-vmflags-field-in-smaps-output-v3-fix
make mnemonics[] static, remove unneeded init code, tidy whitespace
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Pavel Emelyanov <xemul@parallels.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
fs/proc/task_mmu.c | 58 ++++++++++++++++++++-----------------------
1 file changed, 28 insertions(+), 30 deletions(-)
diff -puN Documentation/filesystems/proc.txt~procfs-add-vmflags-field-in-smaps-output-v3-fix Documentation/filesystems/proc.txt
diff -puN fs/proc/task_mmu.c~procfs-add-vmflags-field-in-smaps-output-v3-fix fs/proc/task_mmu.c
--- a/fs/proc/task_mmu.c~procfs-add-vmflags-field-in-smaps-output-v3-fix
+++ a/fs/proc/task_mmu.c
@@ -531,39 +531,37 @@ static void show_smap_vma_flags(struct s
/*
* Don't forget to update Documentation/ on changes.
*/
-
- const struct {
+ static const struct {
const char l[2];
} mnemonics[BITS_PER_LONG] = {
- [ilog2(VM_READ)] = { .l = {'r', 'd'} },
- [ilog2(VM_WRITE)] = { .l = {'w', 'r'} },
- [ilog2(VM_EXEC)] = { .l = {'e', 'x'} },
- [ilog2(VM_SHARED)] = { .l = {'s', 'h'} },
- [ilog2(VM_MAYREAD)] = { .l = {'m', 'r'} },
- [ilog2(VM_MAYWRITE)] = { .l = {'m', 'w'} },
- [ilog2(VM_MAYEXEC)] = { .l = {'m', 'e'} },
- [ilog2(VM_MAYSHARE)] = { .l = {'m', 's'} },
- [ilog2(VM_GROWSDOWN)] = { .l = {'g', 'd'} },
- [ilog2(VM_PFNMAP)] = { .l = {'p', 'f'} },
- [ilog2(VM_DENYWRITE)] = { .l = {'d', 'w'} },
- [ilog2(VM_LOCKED)] = { .l = {'l', 'o'} },
- [ilog2(VM_IO)] = { .l = {'i', 'o'} },
- [ilog2(VM_SEQ_READ)] = { .l = {'s', 'r'} },
- [ilog2(VM_RAND_READ)] = { .l = {'r', 'r'} },
- [ilog2(VM_DONTCOPY)] = { .l = {'d', 'c'} },
- [ilog2(VM_DONTEXPAND)] = { .l = {'d', 'e'} },
- [ilog2(VM_ACCOUNT)] = { .l = {'a', 'c'} },
- [ilog2(VM_NORESERVE)] = { .l = {'n', 'r'} },
- [ilog2(VM_HUGETLB)] = { .l = {'h', 't'} },
- [ilog2(VM_NONLINEAR)] = { .l = {'n', 'l'} },
- [ilog2(VM_ARCH_1)] = { .l = {'a', 'r'} },
- [ilog2(VM_DONTDUMP)] = { .l = {'d', 'd'} },
- [ilog2(VM_MIXEDMAP)] = { .l = {'m', 'm'} },
- [ilog2(VM_HUGEPAGE)] = { .l = {'h', 'g'} },
- [ilog2(VM_NOHUGEPAGE)] = { .l = {'n', 'h'} },
- [ilog2(VM_MERGEABLE)] = { .l = {'m', 'g'} },
+ [ilog2(VM_READ)] = { {'r', 'd'} },
+ [ilog2(VM_WRITE)] = { {'w', 'r'} },
+ [ilog2(VM_EXEC)] = { {'e', 'x'} },
+ [ilog2(VM_SHARED)] = { {'s', 'h'} },
+ [ilog2(VM_MAYREAD)] = { {'m', 'r'} },
+ [ilog2(VM_MAYWRITE)] = { {'m', 'w'} },
+ [ilog2(VM_MAYEXEC)] = { {'m', 'e'} },
+ [ilog2(VM_MAYSHARE)] = { {'m', 's'} },
+ [ilog2(VM_GROWSDOWN)] = { {'g', 'd'} },
+ [ilog2(VM_PFNMAP)] = { {'p', 'f'} },
+ [ilog2(VM_DENYWRITE)] = { {'d', 'w'} },
+ [ilog2(VM_LOCKED)] = { {'l', 'o'} },
+ [ilog2(VM_IO)] = { {'i', 'o'} },
+ [ilog2(VM_SEQ_READ)] = { {'s', 'r'} },
+ [ilog2(VM_RAND_READ)] = { {'r', 'r'} },
+ [ilog2(VM_DONTCOPY)] = { {'d', 'c'} },
+ [ilog2(VM_DONTEXPAND)] = { {'d', 'e'} },
+ [ilog2(VM_ACCOUNT)] = { {'a', 'c'} },
+ [ilog2(VM_NORESERVE)] = { {'n', 'r'} },
+ [ilog2(VM_HUGETLB)] = { {'h', 't'} },
+ [ilog2(VM_NONLINEAR)] = { {'n', 'l'} },
+ [ilog2(VM_ARCH_1)] = { {'a', 'r'} },
+ [ilog2(VM_DONTDUMP)] = { {'d', 'd'} },
+ [ilog2(VM_MIXEDMAP)] = { {'m', 'm'} },
+ [ilog2(VM_HUGEPAGE)] = { {'h', 'g'} },
+ [ilog2(VM_NOHUGEPAGE)] = { {'n', 'h'} },
+ [ilog2(VM_MERGEABLE)] = { {'m', 'g'} },
};
-
size_t i;
seq_puts(m, "VmFlags: ");
_
next prev parent reply other threads:[~2012-10-23 21:30 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-22 19:14 [rfc 0/2] Introducing VmFlags field into smaps output Cyrill Gorcunov
2012-10-22 19:14 ` [rfc 1/2] [RFC] procfs: Add VmFlags field in " Cyrill Gorcunov
2012-10-22 19:14 ` [rfc 2/2] [RFC] procfs: Documantation -- Add VmFlags field description Cyrill Gorcunov
2012-10-22 19:29 ` [rfc 0/2] Introducing VmFlags field into smaps output Andrew Morton
2012-10-22 19:39 ` Cyrill Gorcunov
2012-10-22 20:50 ` Pavel Emelyanov
2012-10-22 20:56 ` Cyrill Gorcunov
2012-10-22 21:34 ` Cyrill Gorcunov
2012-10-22 21:51 ` Andrew Morton
2012-10-23 6:13 ` Cyrill Gorcunov
2012-10-23 6:30 ` Andrew Morton
2012-10-23 6:34 ` Cyrill Gorcunov
2012-10-23 7:15 ` Cyrill Gorcunov
2012-10-23 21:30 ` Andrew Morton [this message]
2012-10-23 21:46 ` Cyrill Gorcunov
2012-10-23 21:59 ` Cyrill Gorcunov
2012-10-23 22:32 ` Peter Zijlstra
2012-10-23 23:56 ` Stephen Rothwell
2012-10-24 6:30 ` Cyrill Gorcunov
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=20121023143045.183657c4.akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=a.p.zijlstra@chello.nl \
--cc=gorcunov@openvz.org \
--cc=linux-kernel@vger.kernel.org \
--cc=xemul@parallels.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.