Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dcfe730c authored by Alex Chiang's avatar Alex Chiang Committed by Linus Torvalds
Browse files

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: default avatarAlex Chiang <achiang@hp.com>
Signed-off-by: default avatarWu Fengguang <fengguang.wu@intel.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Haicheng Li <haicheng.li@intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent f1327bf1
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -674,6 +674,7 @@ static void usage(void)
	printf(
"page-types [options]\n"
"            -r|--raw                  Raw mode, for kernel developers\n"
"            -d|--describe flags        Describe flags\n"
"            -a|--addr    addr-spec    Walk a range of pages\n"
"            -b|--bits    bits-spec    Walk pages with specified bits\n"
"            -p|--pid     pid          Walk process address space\n"
@@ -686,6 +687,10 @@ static void usage(void)
"            -X|--hwpoison             hwpoison pages\n"
"            -x|--unpoison             unpoison pages\n"
"            -h|--help                 Show this usage message\n"
"flags:\n"
"            0x10                      bitfield format, e.g.\n"
"            anon                      bit-name, e.g.\n"
"            0x10,anon                 comma-separated list, e.g.\n"
"addr-spec:\n"
"            N                         one page at offset N (unit: pages)\n"
"            N+M                       pages range from N to N+M-1\n"
@@ -884,6 +889,15 @@ static void parse_bits_mask(const char *optarg)
	add_bits_filter(mask, bits);
}

static void describe_flags(const char *optarg)
{
	uint64_t flags = parse_flag_names(optarg, 0);

	printf("0x%016llx\t%s\t%s\n",
		(unsigned long long)flags,
		page_flag_name(flags),
		page_flag_longname(flags));
}

static const struct option opts[] = {
	{ "raw"       , 0, NULL, 'r' },
@@ -891,6 +905,7 @@ static const struct option opts[] = {
	{ "file"      , 1, NULL, 'f' },
	{ "addr"      , 1, NULL, 'a' },
	{ "bits"      , 1, NULL, 'b' },
	{ "describe"  , 1, NULL, 'd' },
	{ "list"      , 0, NULL, 'l' },
	{ "list-each" , 0, NULL, 'L' },
	{ "no-summary", 0, NULL, 'N' },
@@ -907,7 +922,7 @@ int main(int argc, char *argv[])
	page_size = getpagesize();

	while ((c = getopt_long(argc, argv,
				"rp:f:a:b:lLNXxh", opts, NULL)) != -1) {
				"rp:f:a:b:d:lLNXxh", opts, NULL)) != -1) {
		switch (c) {
		case 'r':
			opt_raw = 1;
@@ -924,6 +939,10 @@ int main(int argc, char *argv[])
		case 'b':
			parse_bits_mask(optarg);
			break;
		case 'd':
			opt_no_summary = 1;
			describe_flags(optarg);
			break;
		case 'l':
			opt_list = 1;
			break;