NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/46462: Hang trying to run a disklabel on an inserted USB flash drive



The following reply was made to PR kern/46462; it has been noted by GNATS.

From: Mindaugas Rasiukevicius <rmind%netbsd.org@localhost>
To: gnats-bugs%NetBSD.org@localhost, kern-bug-people%netbsd.org@localhost,
 gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost
Cc: cyber%netbsd.org@localhost
Subject: Re: kern/46462: Hang trying to run a disklabel on an inserted USB
 flash drive
Date: Sat, 19 May 2012 20:29:03 +0100

 cyber%netbsd.org@localhost wrote:
 > >Number:         46462
 > >Category:       kern
 > >Synopsis:       Hang trying to run a disklabel on an inserted USB flash
 > >drive Confidential:   no
 > >Severity:       serious
 > >Priority:       medium
 > >Responsible:    kern-bug-people
 > >State:          open
 > >Class:          sw-bug
 > >Submitter-Id:   net
 > >Arrival-Date:   Thu May 17 22:35:00 +0000 2012
 > >Originator:     Erik Berls
 > <...>
 
 OK, this thread is likely a problem:
 
 > db> tr/t 0.59
 > trace: pid 0 lid 59 at 0xffffa00049c1b770
 > sleepq_block() at netbsd:sleepq_block+0xdd
 > cv_wait() at netbsd:cv_wait+0xf1
 > biowait() at netbsd:biowait+0x4f
 > read_sector() at netbsd:read_sector+0x23
 > scan_mbr() at netbsd:scan_mbr+0x40
 > readdisklabel() at netbsd:readdisklabel+0xfb
 > sdopen() at netbsd:sdopen+0x26a
 > spec_open() at netbsd:spec_open+0x29a
 > VOP_OPEN() at netbsd:VOP_OPEN+0x29
 > dkwedge_discover() at netbsd:dkwedge_discover+0xee
 > sdattach() at netbsd:sdattach+0x206
 > config_attach_loc() at netbsd:config_attach_loc+0x15a
 > scsi_probe_bus() at netbsd:scsi_probe_bus+0x4aa
 > scsibus_config() at netbsd:scsibus_config+0x5d
 > scsipi_completion_thread() at netbsd:scsipi_completion_thread+0x23
 
 - scsipi_completion_thread()
        This asynchronous completion thread handles the event, which is
        in this case attaching of a new device.  Callbacks are performed
        under splbio().
 
 -- [skipping] .. sdopen()
        Acquiring sd->sc_dk.dk_openlock here.  We are still at IPL_BIO.
 
 --- [skipping] .. read_sector() -> disk_read_sectors()
        Invoking sdstrategy() and entering biowait().  However, since
        we are still at IPL_BIO, biodone() does not happen - thread has
        deadlocked against interrupt with sd->sc_dk.dk_openlock held.
 
 > db> tr/t 0t3707
 > trace: pid 3707 lid 1 at 0xffffa00048ebc860
 > sleepq_block() at netbsd:sleepq_block+0xdd
 > turnstile_block() at netbsd:turnstile_block+0x2a3
 > mutex_vector_enter() at netbsd:mutex_vector_enter+0xf7
 > sdopen() at netbsd:sdopen+0x99
 > spec_open() at netbsd:spec_open+0x15e
 > VOP_OPEN() at netbsd:VOP_OPEN+0x29
 > vn_open() at netbsd:vn_open+0x13d
 > sys_open() at netbsd:sys_open+0xeb
 > syscall() at netbsd:syscall+0xb4
 > db>
 
 This thread merely tries to acquire sd->sc_dk.dk_openlock and waits in
 the turnstile for deadlocked scsipi_completion_thread().
 
 Fix: rework code to remove top-level splbio() in scsipi_completion_thread().
 Long term fix: make scsipi subsystem MP-safe.
 
 -- 
 Mindaugas
 


Home | Main Index | Thread Index | Old Index