h...@spg.tu-darmstadt.de (Hauke Fath) writes: >what is the state with NetBSD and hot-swapping disk drives?
>[ 1110.6034409] assert_sleepable() at netbsd:assert_sleepable+0x9c >[ 1110.6367222] pool_cache_get_paddr() at=20 >netbsd:pool_cache_get_paddr+0x176 >[ 1110.6832707] kmem_intr_alloc() at netbsd:kmem_intr_alloc+0x70 >[ 1110.7143071] kern_malloc() at netbsd:kern_malloc+0x4d >[ 1110.7460265] mpii_event_sas() at netbsd:mpii_event_sas+0x91 >[ 1110.7841959] mpii_intr() at netbsd:mpii_intr+0x20d That's a bug in mpii(4). mpii_event_sas() is called from interrupt context and in case of a MPII_EVENT_SAS_TOPO_PS_RC_ADDED ("disk inserted") event may dev = malloc(sizeof(*dev), M_DEVBUF, M_WAITOK | M_ZERO); ... insert new dev into list ... Obviously M_WAITOK is not allowed in an interrupt. A MPII_EVENT_SAS_TOPO_PS_RC_MISSING ("disk removed") event is deferred to a work queue to avoid such issues. A simple fix is to not wait and ignore the event when malloc fails. A better solution is probably to pre-allocate the devices (currently an array of pointers is pre-allocated, but the 16-byte sized device records are allocated/freed on demand).