[dm-devel] Modern device mapper module makes problems for dump analysis

Mikulas Patocka mpatocka at redhat.com
Fri Dec 4 01:36:46 UTC 2015



On Thu, 3 Dec 2015, Mike Snitzer wrote:

> 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).

The function __rcu_dereference_check does:
((typeof(*p) __force __kernel *)(________p1));

--- and that typeof(*p) will not compile if the structure pointerd to by p 
isn't defined. You could change "typeof(*p) *" to "typeof(p)" and it will 
compile, but I don't know what to do with the __force and __kernel flags.

Mikulas


> 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