diff options
| author | Alex Chiang <achiang@hp.com> | 2009-12-14 20:57:52 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-15 11:53:11 -0500 |
| commit | dcfe730c60030fb76e2794a8960c6bd84c6c6163 (patch) | |
| tree | b15402daa7b91950bd514322e6da677704231766 /Documentation | |
| parent | f1327bf18c8737aeb85226f02f102dfa065fddde (diff) | |
page-types: learn to describe flags directly from command line
Teach page-types to describe page flags directly from the command line.
Why is this useful? For instance, if you're using memory hotplug and see
this in /var/log/messages:
kernel: removing from LRU failed 3836dd0/1/1e00000000000010
It would be nice to decode those page flags without staring at the source.
Example usage and output:
# Documentation/vm/page-types -d 0x10
0x0000000000000010 ____D_____________________________ dirty
# Documentation/vm/page-types -d anon
0x0000000000001000 ____________a_____________________ anonymous
# Documentation/vm/page-types -d anon,0x10
0x0000000000001010 ____D_______a_____________________ dirty,anonymous
[achiang@hp.com: documentation]
Signed-off-by: Alex Chiang <achiang@hp.com>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Haicheng Li <haicheng.li@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'Documentation')
| -rw-r--r-- | Documentation/vm/page-types.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/Documentation/vm/page-types.c b/Documentation/vm/page-types.c index 2279b616a7ac..8c28be6a47cb 100644 --- a/Documentation/vm/page-types.c +++ b/Documentation/vm/page-types.c | |||
| @@ -674,6 +674,7 @@ static void usage(void) | |||
| 674 | printf( | 674 | printf( |
| 675 | "page-types [options]\n" | 675 | "page-types [options]\n" |
| 676 | " -r|--raw Raw mode, for kernel developers\n" | 676 | " -r|--raw Raw mode, for kernel developers\n" |
| 677 | " -d|--describe flags Describe flags\n" | ||
| 677 | " -a|--addr addr-spec Walk a range of pages\n" | 678 | " -a|--addr addr-spec Walk a range of pages\n" |
| 678 | " -b|--bits bits-spec Walk pages with specified bits\n" | 679 | " -b|--bits bits-spec Walk pages with specified bits\n" |
| 679 | " -p|--pid pid Walk process address space\n" | 680 | " -p|--pid pid Walk process address space\n" |
| @@ -686,6 +687,10 @@ static void usage(void) | |||
| 686 | " -X|--hwpoison hwpoison pages\n" | 687 | " -X|--hwpoison hwpoison pages\n" |
| 687 | " -x|--unpoison unpoison pages\n" | 688 | " -x|--unpoison unpoison pages\n" |
| 688 | " -h|--help Show this usage message\n" | 689 | " -h|--help Show this usage message\n" |
| 690 | "flags:\n" | ||
| 691 | " 0x10 bitfield format, e.g.\n" | ||
| 692 | " anon bit-name, e.g.\n" | ||
| 693 | " 0x10,anon comma-separated list, e.g.\n" | ||
| 689 | "addr-spec:\n" | 694 | "addr-spec:\n" |
| 690 | " N one page at offset N (unit: pages)\n" | 695 | " N one page at offset N (unit: pages)\n" |
| 691 | " N+M pages range from N to N+M-1\n" | 696 | " N+M pages range from N to N+M-1\n" |
| @@ -884,6 +889,15 @@ static void parse_bits_mask(const char *optarg) | |||
| 884 | add_bits_filter(mask, bits); | 889 | add_bits_filter(mask, bits); |
| 885 | } | 890 | } |
| 886 | 891 | ||
| 892 | static void describe_flags(const char *optarg) | ||
| 893 | { | ||
| 894 | uint64_t flags = parse_flag_names(optarg, 0); | ||
| 895 | |||
| 896 | printf("0x%016llx\t%s\t%s\n", | ||
| 897 | (unsigned long long)flags, | ||
| 898 | page_flag_name(flags), | ||
| 899 | page_flag_longname(flags)); | ||
| 900 | } | ||
| 887 | 901 | ||
| 888 | static const struct option opts[] = { | 902 | static const struct option opts[] = { |
| 889 | { "raw" , 0, NULL, 'r' }, | 903 | { "raw" , 0, NULL, 'r' }, |
| @@ -891,6 +905,7 @@ static const struct option opts[] = { | |||
| 891 | { "file" , 1, NULL, 'f' }, | 905 | { "file" , 1, NULL, 'f' }, |
| 892 | { "addr" , 1, NULL, 'a' }, | 906 | { "addr" , 1, NULL, 'a' }, |
| 893 | { "bits" , 1, NULL, 'b' }, | 907 | { "bits" , 1, NULL, 'b' }, |
| 908 | { "describe" , 1, NULL, 'd' }, | ||
| 894 | { "list" , 0, NULL, 'l' }, | 909 | { "list" , 0, NULL, 'l' }, |
| 895 | { "list-each" , 0, NULL, 'L' }, | 910 | { "list-each" , 0, NULL, 'L' }, |
| 896 | { "no-summary", 0, NULL, 'N' }, | 911 | { "no-summary", 0, NULL, 'N' }, |
| @@ -907,7 +922,7 @@ int main(int argc, char *argv[]) | |||
| 907 | page_size = getpagesize(); | 922 | page_size = getpagesize(); |
| 908 | 923 | ||
| 909 | while ((c = getopt_long(argc, argv, | 924 | while ((c = getopt_long(argc, argv, |
| 910 | "rp:f:a:b:lLNXxh", opts, NULL)) != -1) { | 925 | "rp:f:a:b:d:lLNXxh", opts, NULL)) != -1) { |
| 911 | switch (c) { | 926 | switch (c) { |
| 912 | case 'r': | 927 | case 'r': |
| 913 | opt_raw = 1; | 928 | opt_raw = 1; |
| @@ -924,6 +939,10 @@ int main(int argc, char *argv[]) | |||
| 924 | case 'b': | 939 | case 'b': |
| 925 | parse_bits_mask(optarg); | 940 | parse_bits_mask(optarg); |
| 926 | break; | 941 | break; |
| 942 | case 'd': | ||
| 943 | opt_no_summary = 1; | ||
| 944 | describe_flags(optarg); | ||
| 945 | break; | ||
| 927 | case 'l': | 946 | case 'l': |
| 928 | opt_list = 1; | 947 | opt_list = 1; |
| 929 | break; | 948 | break; |
