----- Original Message -----
Hi,
When I used crash based off of a mainline kernel to run kmem, it
failed. For your information, the detailed description of the problem
is as follows.
Version-Release number of selected component:
# uname -a
Linux
hp-rx8640-02.rhts.eng.bos.redhat.com 2.6.39-rc6+ #2 SMP Mon May
9 23:05:14 EDT 2011 ia64 ia64 ia64 GNU/Linux
Steps to Reproduce:
1、update the old kernel to the mainline kernel 2.6.39-rc6+
2、install crash
3、# crash <where the mainline kernel tree is>/vmlinux
4、crash> kmem -s
CACHE NAME OBJSIZE ALLOCATED TOTAL SLABS SSIZE
kmem: invalid structure member offset: slab_list
FILE: memory.c LINE: 9588 FUNCTION: verify_slab_v2()
[/usr/bin/crash] error trace: 40000000000db7c0 => 40000000000ca450 =>
40000000000c8ea0 => 40000000001c74a0
40000000001c74a0: OFFSET_verify+224
40000000000c8ea0: verify_slab_v2+448
40000000000ca450: do_slab_chain_percpu_v2_nodes+4208
40000000000db7c0: dump_kmem_cache_percpu_v2+3536
kmem: invalid structure member offset: slab_list
FILE: memory.c LINE: 9588 FUNCTION: verify_slab_v2()
Best Regards,
Qiannan Cui
Yes, I remember seeing the LKML post changing the slab structure
from this:
struct slab {
struct list_head list;
unsigned long colouroff;
void *s_mem; /* including colour offset */
unsigned int inuse; /* num of objs active in slab */
kmem_bufctl_t free;
unsigned short nodeid;
};
to this:
struct slab {
union {
struct {
struct list_head list;
unsigned long colouroff;
void *s_mem; /* including colour offset */
unsigned int inuse; /* num of objs active in slab */
kmem_bufctl_t free;
unsigned short nodeid;
};
struct slab_rcu __slab_cover_slab_rcu;
};
};
I had hoped that since the pre-existing fields had been moved
into an anonymous union that the member offsets would be
returned by gdb the same way. Apparently not:
(gdb) ptype struct slab
type = struct slab {
union {
struct {...};
struct slab_rcu __slab_cover_slab_rcu;
};
}
(gdb)
But the offsets can be determined in another manner.
Thanks,
Dave