[resent because it didn't turn up in my mail *after* successfully
having subscribed to lk and another mail of mine already turned up in archive]

Hi,

I'm (still) getting a reproducible crash with PPA ZIP on my
Dell Inspiron 5000e notebook.
AFAIR I already noticed an OOPS upon module removal with disconnected
drive a looong time ago when using 2.2.x.

System: Debian Unstable, stock 2.4.3 kernel, gcc 2.95.3 (problem !!?)

Steps to reproduce:
1. mount zip
2. unmount zip
3. unplug zip with ppa module etc. still loaded
3. close the lid -> APM Suspend-To-RAM
4. resume -> printk("ppa: Parallel port cable is unplugged!!\n");
5. to get rid of this annoying message, I naively tried a rmmod ppa -> OOPS


Unable to handle kernel paging request at virtual address 0xd0a0f434
ip c018bc74 batch_entropy_store()+0x90
ax 00000046 bx 00000c47 cx 0000004e dx d0a0f434
si c027bd80 di b737a624 bp 0000009f sp c575bbd8

Process rmmod
Trace:
add_timer_randomness+0xcb
add_keyboard_randomness+0x22
handle_scancode+0x64
handle_kbd_event+0x111
keyboard_interrupt+0xf
handle_IRQ_event+0x2f
do_IRQ+0x6e
ret_from_intr
panic+0xd0
__switch_to+0xb
die+0x42
do_page_fault+0x323
do_page_fault
load_elf_binary+0x907
load_elf_binary
bread+0x18
do_signal+0xe0
d0a0f434
free_initmem+0x6c
__run_task_queue+0x12
do_timer+0x23
tqueue_bh+0x16
number+0x254
unmap_underlying_metadata+0x18
vsprintf+0x2e
d09c1310
.
.
.

(int handler killed)


Simple analysis of crashing function:

%esp+4 = a
%esp+8 = b
%esp+c = num
0xc027bd64 = batch_head
0xc027bd58 = batch_entropy_pool
0xc027bd5c = batch_entropy_credit
0xc027bd60 = batch_max


void batch_entropy_store(u32 a, u32 b, int num)
{
        int     new;

0xc018bbe4:
        if (!batch_max)
                return;

0xc018bbf1:
        batch_entropy_pool[2*batch_head] = a;

0xc018bc04:
        batch_entropy_pool[(2*batch_head) + 1] = b;

0xc018bc18:
        batch_entropy_credit[batch_head] = num;

0xc018bc2b:
        new = (batch_head+1) & (batch_max-1);

0xc018bc3a:
        if (new != batch_tail) {

0xc018bc42:
                queue_task(&batch_tqueue, &tq_timer);
                batch_head = new;
        } else {
#if 0
                printk(KERN_NOTICE "random: batch entropy buffer full\n");
#endif
        }
}

Complicated (i.e.: better) analysis of crashing function ;-) :

This contains the whole assembler dump, indented to reflect call depth,
comments with C code, etc.

Dump of assembler code for function batch_entropy_store:
if (!batch_max) return;:
0xc018bbe4 <batch_entropy_store>:       cmpl   $0x0,0xc027bd60
0xc018bbeb <batch_entropy_store+7>:
    je     0xc018bc86 <batch_entropy_store+162>

batch_entropy_pool[2*batch_head] = a;:
0xc018bbf1 <batch_entropy_store+13>:    mov    0xc027bd64,%ecx
0xc018bbf7 <batch_entropy_store+19>:    mov    0xc027bd58,%edx
0xc018bbfd <batch_entropy_store+25>:    mov    0x4(%esp,1),%eax
0xc018bc01 <batch_entropy_store+29>:    mov    %eax,(%edx,%ecx,8)

batch_entropy_pool[(2*batch_head) + 1] = b;:
0xc018bc04 <batch_entropy_store+32>:    mov    0xc027bd64,%ecx
0xc018bc0a <batch_entropy_store+38>:    mov    0xc027bd58,%edx
0xc018bc10 <batch_entropy_store+44>:    mov    0x8(%esp,1),%eax
0xc018bc14 <batch_entropy_store+48>:    mov    %eax,0x4(%edx,%ecx,8)

batch_entropy_credit[batch_head] = num;:
0xc018bc18 <batch_entropy_store+52>:    mov    0xc027bd64,%ecx
0xc018bc1e <batch_entropy_store+58>:    mov    0xc027bd5c,%edx
0xc018bc24 <batch_entropy_store+64>:    mov    0xc(%esp,1),%eax
0xc018bc28 <batch_entropy_store+68>:    mov    %eax,(%edx,%ecx,4)

new = (batch_head+1) & (batch_max-1);:
0xc018bc2b <batch_entropy_store+71>:    mov    0xc027bd64 [batch_head],%ecx
0xc018bc31 <batch_entropy_store+77>:    mov    0xc027bd60 [batch_max],%eax
0xc018bc36 <batch_entropy_store+82>:    inc    %ecx
0xc018bc37 <batch_entropy_store+83>:    dec    %eax
0xc018bc38 <batch_entropy_store+84>:    and    %eax,%ecx

if (new != batch_tail) {:
0xc018bc3a <batch_entropy_store+86>:    cmp    0xc027bd68 [batch_tail],%ecx
0xc018bc40 <batch_entropy_store+92>:
    je     0xc018bc86 <batch_entropy_store+162>

queue_task(&batch_tqueue, &tq_timer);:
 0xc018bc42 <batch_entropy_store+94>:    xor    %eax,%eax
 0xc018bc44 <batch_entropy_store+96>:    bts    %eax,0xc027bd74 [&batch_tqueue->sync]
 0xc018bc4b <batch_entropy_store+103>:   sbb    %eax,%eax
 0xc018bc4d <batch_entropy_store+105>:   test   %eax,%eax
 0xc018bc4f <batch_entropy_store+107>:
     jne    0xc018bc80 <batch_entropy_store+156>

 spin_lock_irqsave(&tqueue_lock, flags);:
  local_irq_save(flags);:
   0xc018bc51 <batch_entropy_store+109>:   pushf
   0xc018bc52 <batch_entropy_store+110>:   pop    %eax
   0xc018bc53 <batch_entropy_store+111>:   cli
  spin_lock(lock);:
   /* hmm, not much here, maybe because no SMP ?? */

 list_add_tail(&batch_tqueue->list, &tq_timer);:
  __list_add(&batch_tqueue->list, (&tq_timer)->prev, &tq_timer);:
   (&tq_timer)->prev = &batch_tqueue->list;
   (&batch_tqueue->list)->next = &tq_timer;
   (&batch_tqueue->list)->prev = (&tq_timer)->prev;
   (&(&tq_timer)->prev)->next = &batch_tqueue->list;
   0xc018bc54 <batch_entropy_store+112>:   mov    0xc0227e94 [(&tq_timer)->prev],%edx
   0xc018bc5a <batch_entropy_store+118>:   movl   $0xc027bd6c 
[&batch_tqueue->list],0xc0227e94 [(&tq_timer)->prev]
   0xc018bc64 <batch_entropy_store+128>:   movl   $0xc0227e90,0xc027bd6c [batch_tqueue]
   0xc018bc6e <batch_entropy_store+138>:   mov    %edx [(&tq_timer)->prev],0xc027bd70 
[(&batch_tqueue->list)->prev]

**********CRASH**********, EDX == 0xd0a0f434:
   0xc018bc74 <batch_entropy_store+144>:   movl   $0xc027bd6c 
[&batch_tqueue->list],(%edx) [(&(&tq_timer)->prev)->next == (&tq_timer)->prev]

 spin_unlock_irqrestore(&tqueue_lock, flags);:
  spin_unlock(&tqueue_lock);:
  local_irq_restore(flags);:
   0xc018bc7a <batch_entropy_store+150>:   push   %eax
   0xc018bc7b <batch_entropy_store+151>:   popf

what's that ??? gcc problem ?:
0xc018bc7c <batch_entropy_store+152>:   lea    0x0(%esi,1),%esi

batch_head = new;:
0xc018bc80 <batch_entropy_store+156>:   mov    %ecx,0xc027bd64 [batch_head]
0xc018bc86 <batch_entropy_store+162>:   ret
0xc018bc87 <batch_entropy_store+163>:   nop

So can anybody tell me why it crashes at 0xc018bc74 ?

Note that I'm not sure whether the suspend is required for the OOPS;
I don't know any other way of triggering the OOPS, though.

BTW, if I reconnect the cable instead of unloading ppa, I get:
root@note:/root# ppa: Parallel port cable is unplugged!!
ppa: Parallel port cable is unplugged!!
ppa: Parallel port cable is unplugged!!
sda : READ CAPACITY failed.
sda : status = 0, message = 00, host = 1, driver = 00
sda : sense not available.
sda : block size assumed to be 512 bytes, disk size 1GB.
 /dev/scsi/host0/bus0/target6/lun0: I/O error: dev 08:00, sector 0

So it seems to try to do a READ CAPACITY call at this moment upon resume,
which maybe blocks the kernel somehow when no cable is available...

Thank you for any suggestions !

I'm subscribed to the list, so no need to CC.

-- 
Andreas Mohr                        Stauferstr. 6, D-71272 Renningen, Germany
Tel. +49 7159 800604                http://home.germany.net/100-30936/
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to