[Crash-utility] [PATCH 0/3] ikconfig and load module helper patches.

Dave Anderson anderson at redhat.com
Thu Jan 20 19:57:20 UTC 2011


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 at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility




More information about the Crash-utility mailing list