Re: BUG: unable to handle kernel paging request at 0000000000002328 __d_lookup+0xc8/0x1d0

From: Zdenek Kabelac
Date: Wed Feb 04 2009 - 10:27:38 EST


2009/2/4 Arjan van de Ven <arjan@xxxxxxxxxxxxx>:
> On Wed, 4 Feb 2009 15:49:52 +0100
> Zdenek Kabelac <zdenek.kabelac@xxxxxxxxx> wrote:
>
>> Hi
>>
>> Today I've got this ugly oops - my machine T61, 4GB of memory (checked
>> with memtest), SMP, C2D
>> kernel commit: 33bfad54b58cf05cfe6678c3ec9235d4bc8db4c2
>>
>> The only 'strange' thing I've been doing today is testing ext4 and its
>> online resize functionality.
>> But this oops happened somewhat later - so I'm not really sure whether
>> there is some correlation.
>>
>> (Full kernel log follows)
>
> if you have CONFIG_DEBUG_INFO enabled, you can run the oops through
> http://www.kerneloops.org/download/markup_oops.pl (or
> scripts/markup_oops.pl, but the 64 bit support is pending in a
> maintainer tree) to turn this into an even better bug report...
> ... it will show exactly where in the code the oops was.
>

Yep ok - I'm using a script called disasfun.sh - but both gives the same output:

--------------
Here is markup_oops.pl:
---------------

No vmlinux specified, assuming /lib/modules/2.6.29-rc3/build/vmlinux
goto next;
} else {
if (qstr->len != len)
goto next;
if (memcmp(qstr->name, str, len))
ffffffff802f821b: 44 8b 75 c4 mov -0x3c(%rbp),%r14d | %r14 => 5
struct hlist_node *node;
struct dentry *dentry;

rcu_read_lock();

hlist_for_each_entry_rcu(dentry, node, head, d_hash) {
ffffffff802f821f: 4c 31 eb xor %r13,%rbx | %r13 =
18721e0036d5fe5
ffffffff802f8222: 44 8b 55 b8 mov -0x48(%rbp),%r10d |
%r10 => 85a6ed9
ffffffff802f8226: 41 21 dc and %ebx,%r12d
ffffffff802f8229: 4c 8b 5d b0 mov -0x50(%rbp),%r11 |
%r11 => ffff88013b404300
ffffffff802f822d: 4e 8d 24 e0 lea (%rax,%r12,8),%r12 |
%r12 => ffff8800028b0000
ffffffff802f8231: 49 8b 04 24 mov (%r12),%rax | %r12 =
ffff8800028b0000
ffffffff802f8235: 48 89 c3 mov %rax,%rbx
ffffffff802f8238: 48 85 c0 test %rax,%rax | %eax => 2328
ffffffff802f823b: 75 0b jne ffffffff802f8248
<__d_lookup+0xc8>
ffffffff802f823d: eb 69 jmp ffffffff802f82a8
<__d_lookup+0x128>
ffffffff802f823f: 90 nop
ffffffff802f8240: 48 8b 1b mov (%rbx),%rbx
ffffffff802f8243: 48 85 db test %rbx,%rbx | %ebx => 2328
ffffffff802f8246: 74 60 je ffffffff802f82a8
<__d_lookup+0x128>
*ffffffff802f8248: 48 8b 03 mov (%rbx),%rax | %ebx =
2328 <--- faulting instruction
ffffffff802f824b: 4c 8d 63 a8 lea -0x58(%rbx),%r12
ffffffff802f824f: 0f 18 08 prefetcht0 (%rax)
struct qstr *qstr;

if (dentry->d_name.hash != hash)
ffffffff802f8252: 45 39 54 24 70 cmp %r10d,0x70(%r12)
ffffffff802f8257: 75 e7 jne ffffffff802f8240
<__d_lookup+0xc0>
continue;
if (dentry->d_parent != parent)
ffffffff802f8259: 4d 39 5c 24 68 cmp %r11,0x68(%r12)
ffffffff802f825e: 75 e0 jne ffffffff802f8240
<__d_lookup+0xc0>
continue;

spin_lock(&dentry->d_lock);
ffffffff802f8260: 44 89 55 b8 mov %r10d,-0x48(%rbp)
ffffffff802f8264: 4c 89 5d b0 mov %r11,-0x50(%rbp)
ffffffff802f8268: 4d 8d 6c 24 08 lea 0x8(%r12),%r13
ffffffff802f826d: 4c 89 ef mov %r13,%rdi
ffffffff802f8270: e8 3b df 25 00 callq ffffffff805561b0 <_spin_lock>
/*
* Recheck the dentry after taking the lock - d_move may have


--------------------------
and here is disasfun.sh - fault is at 0x2100 + 0xc8 -> 0x21c8
---------------------------



2191: 44 89 f1 mov %r14d,%ecx
struct hlist_node *node;
struct dentry *dentry;

rcu_read_lock();

hlist_for_each_entry_rcu(dentry, node, head, d_hash) {
2194: 48 8b 45 d0 mov -0x30(%rbp),%rax

static inline struct hlist_head *d_hash(struct dentry *parent,
unsigned long hash)
{
hash += ((unsigned long) parent ^ GOLDEN_RATIO_PRIME) / L1_CACHE_BYTES;
hash = hash ^ ((hash ^ GOLDEN_RATIO_PRIME) >> D_HASHBITS);
2198: 48 d3 eb shr %cl,%rbx
if (parent->d_op->d_compare(parent, qstr, name))
goto next;
} else {
if (qstr->len != len)
goto next;
if (memcmp(qstr->name, str, len))
219b: 44 8b 75 c4 mov -0x3c(%rbp),%r14d
struct hlist_node *node;
struct dentry *dentry;

rcu_read_lock();

hlist_for_each_entry_rcu(dentry, node, head, d_hash) {
219f: 4c 31 eb xor %r13,%rbx
21a2: 44 8b 55 b8 mov -0x48(%rbp),%r10d
21a6: 41 21 dc and %ebx,%r12d
21a9: 4c 8b 5d b0 mov -0x50(%rbp),%r11
21ad: 4e 8d 24 e0 lea (%rax,%r12,8),%r12
21b1: 49 8b 04 24 mov (%r12),%rax
21b5: 48 89 c3 mov %rax,%rbx
21b8: 48 85 c0 test %rax,%rax
21bb: 75 0b jne 21c8 <__d_lookup+0xc8>
21bd: eb 69 jmp 2228 <__d_lookup+0x128>
21bf: 90 nop
21c0: 48 8b 1b mov (%rbx),%rbx
21c3: 48 85 db test %rbx,%rbx
21c6: 74 60 je 2228 <__d_lookup+0x128>
21c8: 48 8b 03 mov (%rbx),%rax
21cb: 4c 8d 63 a8 lea -0x58(%rbx),%r12
21cf: 0f 18 08 prefetcht0 (%rax)
struct qstr *qstr;

if (dentry->d_name.hash != hash)
21d2: 45 39 54 24 70 cmp %r10d,0x70(%r12)
21d7: 75 e7 jne 21c0 <__d_lookup+0xc0>
continue;
if (dentry->d_parent != parent)
21d9: 4d 39 5c 24 68 cmp %r11,0x68(%r12)
21de: 75 e0 jne 21c0 <__d_lookup+0xc0>
continue;

spin_lock(&dentry->d_lock);
21e0: 44 89 55 b8 mov %r10d,-0x48(%rbp)
21e4: 4c 89 5d b0 mov %r11,-0x50(%rbp)
21e8: 4d 8d 6c 24 08 lea 0x8(%r12),%r13
21ed: 4c 89 ef mov %r13,%rdi
21f0: e8 00 00 00 00 callq 21f5 <__d_lookup+0xf5>
/*
* Recheck the dentry after taking the lock - d_move may have
* changed things. Don't bother checking the hash because we're
* about to compare the whole name anyway.
*/
if (dentry->d_parent != parent)


Zdenek
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/