----- Original Message ----- > Hi Dave, > > Thanks for your additional reviews. > > I have reworked get_kernel_config() with all of your suggestions. > But I have other suggestion about ikconfig data life-time. > > I attach two patches of different life-time term. > patch#1: ikconfig data has life-time which is complied with your > suggestion > patch#2: ikconfig data is permanent (no life-time, whole crash > running) > > I think there is a trade-off between command response time and crash > VM size. > > If commands which use get_kernel_config() always have to build ikconfig data, > it spends excrescent times of zlib decompress, setup, free process. > But patch#2 spends them only once in crash-startup. > (Even though there was no stress in my environs with patch#1, > but my spec is 2GB MEM and 2.4GHz 4-CPUs.) > > Also I lightly compared VM size, > there was no prominent VM gaps between them. > > # zcat /proc/config.gz | wc -l > 1369 > ikconfig_ents: 416 (Valid 416 kernel configs) > > statm: TOTAL RSS SHARED TEXT LIB DATA > > With patch#1 > # cat statm > 22692 19515 9703 1372 0 10496 0 > > With patch#2 > # cat statm > 22695 19512 9694 1372 0 10499 0 > > Do you think which life-time is better? > (I would like to push patch#2...) Definitely #1. The access of the ikconfig data is really nothing much more than a typical memory read, although it does have to be uncompressed. But, think about it, when running against a compressed diskump or compressed kdump dumpfile, every memory access has to be uncompressed. Let me review/test your patch #1, and I'll get back to you with my results. Thanks, Dave > Thanks a lot, > Toshi. > > >Hello Toshi, > > > >Here are my comments and further suggestions for this patchset: > > > >0001-new-ikconfig-API.patch > >0002-dump_kernel_table.patch > > > > In the interest of simplification, let me suggest the following. > > > > With your current scheme, this is required: > > > > crash> extend module.so > > ... > > the module's _init() function gets called, which does: > > read_in_kernel_config(IKCFG_SETUP); > > ret = get_kernel_config("XXX", str); > > read_in_kernel_config(IKCFG_FREE); > > ... > > crash> > > > > And then you have a bunch of stuff for handling multiple extension > > modules, reference counting, etc. > > > > But extension modules should not have to worry about having to make > > the two read_in_kernel_config() calls -- it should simply be a > > matter > > of doing this to get a kernel configuration item: > > > > ret = get_kernel_config("XXX", str); > > > > This would typically be called one (or more) times in their _init() > > function, but it could also be called in a registered function as > > well. > > > > Anyway, let the read_in_kernel_config(IKCFG_SETUP) and (IKCFG_FREE) > > mechanisms be handled by the static crash code: > > > > - read_in_kernel_config(IKCFG_SETUP) should be called by > > the exported get_kernel_config() function. (see below) > > > > - read_in_kernel_config(IKCFG_FREE) should be called by the > > restore_sanity() function, which gets called just before > > the "crash>" prompt for the *next* crash command is displayed. > > (see below) > > > > That way, the ikconfig data is only available for the life-time of > > a particular command, for example, while the crash "extend" command > > is running, or perhaps later on when a module's registered command > > is run. > > > > That being the case, all of the stuff you have for handling > > multiple > > extension modules can be removed, because that could never happen. > > > > The kt->ikconfig_setup counter can be removed, and replaced by > > a new kt->ikconfig_flags field, that has at least two flags: > > > > #define IKCONFIG_AVAIL 0x1 /* kernel contains ikconfig data */ > > #define IKCONFIG_LOADED 0x2 /* ikconfig data is currently loaded > > */ > > > > And the would be set/cleared like so: > > > > - When the initialization-time read_in_kernel_config(IKCFG_INIT) > > call is > > made, IKCFG_AVAIL would get set if the ikconfig data is available > > in > > the kernel. > > > > - When read_in_kernel_config(IKCFG_SETUP) successfully reads the > > ikconfig > > data, then IKCFG_LOADED could be be set (temporarily). > > > > - When read_in_kernel_config(IKCFG_FREE) is called, IKCFG_LOADED > > gets cleared. > > > > That being the case, get_kernel_config() could have this at the > > top: > > > > switch (kt->ikconfig_flags & (IKCFG_LOADED|IKCFG_AVAIL)) > > { > > case IKCFG_AVAIL: > > read_in_kernel_config(IKCFG_SETUP); > > if (!kt->config_flags & IKCFG_LOADED) > > return IKCONFIG_N; > > break; > > > > case (IKCFG_LOADED|IKCFG_AVAIL): /* already loaded */ > > break; > > > > default: > > return IKCFG_N; > > } > > > > And restore_sanity() could just do this: > > > > if (kt->ikconfig_flags & IKCFG_LOADED) > > read_in_kernel_config(IKCFG_FREE); > > > > And lastly, I see no need for kt->ikconfig_refs. You increment > > it in get_kernel_config() each time it is called, and then set > > it back to 0 when read_in_kernel_config(IKCFG_FREE) frees > > everything. > > But nobody else reads it -- and I don't see why an extension module > > would ever need to read it? > > > >0003-load_module_symbols_helper.patch > > > > Queued for the next release. > > > >Thanks again, > > Dave > > > > > >----- Original Message ----- > >> Declare get_kernel_config(), load_module_symbols_helper() > >> for crash outside extension users. > >> CRASH_MODULE_PATH valiable can apply to search non-standard module > >> path > >> from load_module_symbols_helper() and "mod" command. > >> > >> - get_kernel_config("config name", &val) > >> Return one of target kernel configurations. > >> If val == NULL, return value is poinited whether config is valid or > >> not. > >> IKCONFIG_N: kernel config is not set (not valid). > >> IKCONFIG_Y: kernel config is set y (valid). > >> IKCONFIG_M: kernel config is set m (valid). > >> IKCONFIG_STR: kernel config is values or strings, etc (valid). > >> > >> "help -k" can display ikconfig setup state, > >> number of valid ikconfig entries, function calls. > >> > >> Notes: > >> 1. How to activate get_kernel_config(). > >> read_in_kernel_config(IKCFG_SETUP) > >> -> get_kernel_config() become active. > >> read_in_kernel_config(IKCFG_FREE) > >> -> get_kernel_config() become iniactive. > >> > >> 2. This function require CONFIG_IKCONFIG=y. Otherwise user is > >> warned. > >> > >> Functional change from previous one. > >> "config name" can be allowed both with or without CONFIG_ prefix > >> strings. > >> [ Dave's recommendation ] > >> > >> - load_module_symbols_helper("module name") > >> Load specified kernel module symbols with argument. > >> This is simplified usage from original load_module_symbols(). > >> > >> Add "CRASH_MODULE_PATH" valiable which can use to resolve > >> non-standard module path. > >> > >> Functional change from previous one. > >> "CRASH_MODULE_PATH" could be used by the "mod -s" command as well. > >> [ Dave's recommendation ] > >> Example usage: > >> < in .crashrc > > >> mod -s ext3 > >> mod -s jbd > >> : > >> : > >> > >> export CRASH_MODULE_PATH="your module's root directory" > >> /usr/sbin/crash > >> > >> Even if target kernel is changed, > >> crash will load appropriate ext3 or jbd modules by this valiable. > >> > >> Toshikazu Nakayama (3): > >> new ikconfig API. > >> dump_kernel_table() > >> load_module_symbols_helper(). > >> > >> crash-5.1.1/defs.h | 14 +++++ > >> crash-5.1.1/kernel.c | 148 > >> ++++++++++++++++++++++++++++++++++++++++++++++++++ > >> 2 files changed, 162 insertions(+), 0 deletions(-) > >> > >> -- > >> 1.7.4.rc2.3.g60a2e > >> > >> > >> -- > >> Crash-utility mailing list > >> Crash-utility@xxxxxxxxxx > >> https://www.redhat.com/mailman/listinfo/crash-utility > > > >-- > >Crash-utility mailing list > >Crash-utility@xxxxxxxxxx > >https://www.redhat.com/mailman/listinfo/crash-utility > > -- > Crash-utility mailing list > Crash-utility@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/crash-utility -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility