----- Original Message -----
search:
-f struct-page.flags-mask
When searching kernel memory, crash walks through all identity
mapping space which includes all physical memory. Nowadays we
have machines that equipped with more than 256G memory, it takes
a long time to go through all pages, especially most of them
are used by user space programs (e.g. LRU pages). This option
allows us to skip pages with certain struct page flags.
-g
Allow us to skip whole compound pages instead of only skipping
head pages when using -f, because some flags are only set to
head pages which tails pages share same properties with their
head pages.
kmem:
-k
Verify compound page order. Useful when debugging memory leak
caused by freeing compound pages with wrong order.
-r
Only print used pages (i.e. the page count is not zero). Makes
the output smaller (and faster to grep/vim/emacs).
Yu Zhao (5):
memory: better compound page support
memory: struct page.flags based filter
memory: skip compound pages when using search filter
memory: display and verify compound page order
memory: kmem option to skip free pages
Hello Yu,
OK, initially I have looked at these patches from an end-user perspective,
and will wait on reviewing the technical implementation of your patchset
until some basics below are taken care of.
Also, can you separate this into two separate patchset postings, one for
the kmem command, and the other for the search command? I understand
they both use the compound page flag changes, but the common stuff can
be put in one or the other, and it can be specified that one patch
essentially depends upon the other being in place.
First, please fix these warnings:
$ make warn
... [ cut ] ...
cc -c -g -DX86_64 -DLZO -DSNAPPY -DGDB_7_6 memory.c -Wall -O2 -Wstrict-prototypes
-Wmissing-prototypes -fstack-protector -Wformat-security
memory.c: In function ‘PG_slab_flag_init’:
memory.c:4909:2: warning: pointer targets in passing argument 2 of ‘enumerator_value’
differ in signedness [-Wpointer-sign]
In file included from memory.c:19:0:
defs.h:4645:5: note: expected ‘long int *’ but argument is of type ‘ulong *’
memory.c:4910:6: warning: pointer targets in passing argument 2 of ‘enumerator_value’
differ in signedness [-Wpointer-sign]
In file included from memory.c:19:0:
defs.h:4645:5: note: expected ‘long int *’ but argument is of type ‘ulong *’
memory.c:4917:2: warning: pointer targets in passing argument 2 of ‘enumerator_value’
differ in signedness [-Wpointer-sign]
In file included from memory.c:19:0:
defs.h:4645:5: note: expected ‘long int *’ but argument is of type ‘ulong *’
memory.c:4918:13: warning: pointer targets in passing argument 2 of ‘enumerator_value’
differ in signedness [-Wpointer-sign]
In file included from memory.c:19:0:
defs.h:4645:5: note: expected ‘long int *’ but argument is of type ‘ulong *’
memory.c: In function ‘__is_page_head’:
memory.c:18332:9: warning: suggest parentheses around comparison in operand of ‘&’
[-Wparentheses]
memory.c: In function ‘is_page_head’:
memory.c:18345:9: warning: suggest parentheses around comparison in operand of ‘&’
[-Wparentheses]
memory.c: In function ‘__is_page_tail’:
memory.c:18354:9: warning: suggest parentheses around comparison in operand of ‘&’
[-Wparentheses]
memory.c: In function ‘is_page_tail’:
memory.c:18367:9: warning: suggest parentheses around comparison in operand of ‘&’
[-Wparentheses]
...
Since the kmem -k and -r flags are only relevant when used with -p,
then that should be specified clearly in the help page synopsis,
i.e., something like:
-"[-f|-F|-p|-c|-C|-i|-s|-S|-v|-V|-n|-z|-o|-h] [slab] [[-P] address]\n"
+"[-f|-F|-p [-k][-r]|-c|-C|-i|-s|-S|-v|-V|-n|-z|-o|-h] [slab] [[-P]
address]\n"
And in cmd_kmem(), any attempt to use -k or -r outside of kmem -p
should generate an error message and fail immediately. So in the case
of a specified address, put a check for the kflag and rflag right
after the for(...) line, and error(FATAL, ...) right there:
4607 for (i = 0; i < spec_addr; i++) {
4608
4609 if (Pflag)
4610 meminfo.memtype = PHYSADDR;
4611 else
4612 meminfo.memtype = IS_KVADDR(value[i]) ?
4613 KVADDR : PHYSADDR;
4614
4615 if (fflag) {
4616 meminfo.spec_addr = value[i];
4617 meminfo.flags = ADDRESS_SPECIFIED;
4618 if (meminfo.calls++)
4619 fprintf(fp, "\n");
4620 vt->dump_free_pages(&meminfo);
4621 fflag++;
4622 }
4623
4624 if (pflag) {
4625 meminfo.spec_addr = value[i];
4626 meminfo.flags = ADDRESS_SPECIFIED;
4627 dump_mem_map(&meminfo);
4628 pflag++;
4629 }
4630
And here, you should check for the invalid kflag and rflag if the pflag
is not set:
4735 if (pflag == 1) {
4736 if (kflag)
4737 meminfo.extra_flags |= VERIFY_COMPOUND_PAGES;
4738 if (rflag)
4739 meminfo.extra_flags |= SKIP_FREE_PAGES;
4740 dump_mem_map(&meminfo);
4741 }
i.e., something like:
if (pflag == 1) {
(as above)
} else if (kflag || rflag)
error(FATAL, ...)
Lastly, I'm not all that excited about the -k option. It sounds like you
have had a specific bug where the "freed with the wrong order" bug occurred,
and now you're addressing it from the crash utility after the fact. How
often does that even happen? I don't know -- others may disagree.
With respect to the search command, the new options need better documentation.
First, I don't even see -g in the synopsis? It should be contained inside
the [-f ...] block.
Then, the "-f struct-page.flags-mask" option needs to be simplified in its
name string, maybe "-f page-mask". And the "preceded by the letter n"
business
is something that's never been done by any other command, and it's just kind of
strange. Maybe there could be both an "-f page-mask" and an "-F
page-mask"?
Also, fix this:
SYNOPSIS
search [-s start] [ -[kKV] | -u | -p | -t ] [-e end | -l length] [-m mask]
[-f struct-page.flags-mask] [-x count] -[cwh] [value | (expression) |
symbol | string] ...
so that it does not exceed 80 columns.
The explanation of each option should be on the same line:
-g
Skip whole compound page instead of only skipping head pages when
using with -f. Only has effect with -f.
Is there a good reason for restricting -f to virtual addresses only?
And like cmd_kmem(), cmd_search() should have error checking, and fail if
the -g option is used without -f (or -F).
Thanks,
Dave