[dm-devel] Modern device mapper module makes problems for dump analysis
Mike Snitzer
snitzer at redhat.com
Thu Dec 3 19:31:30 UTC 2015
On Tue, Dec 01 2015 at 8:34am -0500,
Alexey Ishchuk <aishchuk at linux.vnet.ibm.com> wrote:
> Hi,
>
> in the modern device mapper Linux kernel module the data structure
> struct dm_table is declared more than once. One of those
> declarations is the real structure definition and the other are
> dummy definitions. This coding manner makes serious problems for the
> Linux kernel dump analysis with crash utility using custom EPPIC
> language scripts and even the dminfo built-in crash extension does
> not work with the dumps. The problem occurs because the crash
> utility tries to expose to the EPPIC language scripts a dummy
> structure definition that contains no required fields.
>
> I would like to get to know, why do we need more than one struct
> dm_table declarations in the kernel module? Is it possible to
> improve the device mapper kernel module code to have the only one
> struct dm_table declaration to allow kernel dumps to be analyzed
> using custom scripts?
The dm.c definition is:
/*
* A dummy definition to make RCU happy.
* struct dm_table should never be dereferenced in this file.
*/
struct dm_table {
int undefined__;
};
As you can see in the block comment above this dummy definition is
purely to "make RCU happy"...
We'll need to research how/if we can avoid such hacks (and still have
RCU function as needed).
But short of eliminating the dummy definition, have you tried using the
crash utility's 'set scope <text_address>' capability to force the use
of the dm-table.c definition? e.g.:
crash> mod -s dm_mod
MODULE NAME SIZE OBJECT FILE
ffffffffa0013640 dm_mod 110592 /lib/modules/4.4.0-rc1.snitm+/kernel/drivers/md/dm-mod.ko
crash> struct dm_table
struct dm_table {
int undefined__;
}
SIZE: 4
crash> set scope dm_table_create
scope: ffffffffa0005b30 (dm_table_create)
crash> struct dm_table
struct dm_table {
struct mapped_device *md;
unsigned int type;
unsigned int depth;
unsigned int counts[16];
sector_t *index[16];
unsigned int num_targets;
unsigned int num_allocated;
sector_t *highs;
struct dm_target *targets;
struct target_type *immutable_target_type;
unsigned int integrity_supported : 1;
unsigned int singleton : 1;
fmode_t mode;
struct list_head devices;
void (*event_fn)(void *);
void *event_context;
struct dm_md_mempools *mempools;
struct list_head target_callbacks;
}
SIZE: 304
More information about the dm-devel
mailing list