[Crash-utility] [PATCH 0/2] The new API about ikconfig.
Dave Anderson
anderson at redhat.com
Wed Jan 19 17:12:11 UTC 2011
----- Original Message -----
> Hi,
>
> I would like to suggest new ikconfig's API from defs.h.
>
> The get_kernel_config("config name without CONFIG_ prefix", &val)
> will 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).
>
> API require CONFIG_IKCONFIG=y. Otherwise user is warned.
>
> I think it is useful for such as extension module developers
> to write kernel config switch code.
>
> Although ifdef or symbol APIs can be used instead,
> I believe using this API can write more impressive or flexible code
> about kernel config depended parts (over my senses...).
>
> Thanks,
> Toshi.
Hello Toshi,
I have a few issues/questions with your patch:
1. This should be impossible, because even if preload_extensions()
is used, that function is called long after the init-time call
to read_in_kernel_config(IKCFG_INIT) is done:
+ if (command == IKCFG_INIT && kt->ikconfig_setup) {
+ /* fastpath */
+ if (get_kernel_config("DEBUG_BUGVERBOSE", NULL) == IKCONFIG_N)
+ kt->flags |= BUGVERBOSE_OFF;
+
+ if (get_kernel_config("NR_CPUS", &val) == IKCONFIG_STR) {
+ kt->kernel_NR_CPUS = atoi(val);
+ if (CRASHDEBUG(1))
+ error(INFO, "CONFIG_NR_CPUS: %d\n",
+ kt->kernel_NR_CPUS);
+ }
+ if (get_kernel_config("PGTABLE_4", NULL) == IKCONFIG_Y) {
+ machdep->flags |= VM_4_LEVEL;
+ if (CRASHDEBUG(1))
+ error(INFO, "CONFIG_PGTABLE_4\n");
+ }
+ if (get_kernel_config("HZ", &val) == IKCONFIG_STR) {
+ machdep->hz = atoi(val);
+ if (CRASHDEBUG(1))
+ error(INFO, "CONFIG_HZ: %d\n", machdep->hz);
+ }
+
+ goto out1;
+ }
2. I didn't test this, but I think this will be a problem because it will
not return back to the _init() function in the extension module:
if ((sp = symbol_search("kernel_config_data")) == NULL) {
- if (command == IKCFG_READ)
+ if (command == IKCFG_READ || command == IKCFG_SETUP)
error(FATAL,
"kernel_config_data does not exist in this kernel\n");
return;
It should do this:
If IKCONFIG_INIT: return quietly with no error message
If IKCONFIG_READ: error(FATAL, ...
If IKCONFIG_SETUP: error(WARNING, ...
2. Can you explain the need for the IKCONFIG_SORT_INTERVAL stuff?
3. When adding items to any global structure (such as to the kernel_table),
I always add them to the end of the structure so that any pre-existing
extension modules that use something in the unmodified structure will
still work even if additional entries are added to the end.
4. Just a preference on my part, but I would allow get_kernel_config()
to accept both "CONFIG_XXXX" and "XXX" as a "name" argument, and then
just strip off "CONFIG_" if it's there.
Dave
> -----------------------------------------------------------
>
> Example usage: Resolve RADIX_TREE_MAP_SHIFT from config depends.
>
> [ code of kernel-2.6.35 ]
>
> #define RADIX_TREE_MAP_SHIFT (CONFIG_BASE_SMALL ? 4 : 6)
>
> [ code of crash utility or extension modules ]
>
> static int radix_tree_map_shift = 6;
> #define RADIX_TREE_MAP_SHIFT radix_tree_map_shift
>
> int _init(void)
> {
> read_in_kernel_config(IKCFG_SETUP);
>
> if (get_kernel_config("BASE_SMALL", NULL) == IKCONFIG_Y)
> radix_tree_map_shift = 4;
>
> return 0;
> }
>
> int int _fini(void)
> {
> read_in_kernel_config(IKCFG_FREE);
>
> return 0;
> }
>
> Toshikazu Nakayama (2):
> new ikconfig API.
> dump_kernel_table()
>
> crash-5.1.1/defs.h | 13 ++++
> crash-5.1.1/kernel.c | 166
> +++++++++++++++++++++++++++++++++++++++++++++++++-
> 2 files changed, 178 insertions(+), 1 deletions(-)
>
> --
> 1.7.4.rc2
>
> --
> 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