Now that the SCHED_LOCK() is a mutex I see the following WITNESS report
on arm64.

 witness: lock order reversal:
 1st 0xffffff80012486e8 /usr/src/sys/dev/rnd.c:321 (/usr/src/sys/dev/rnd.c:321)
 2nd 0xffffff800120afb0 /usr/src/sys/kern/kern_timeout.c:57 
(/usr/src/sys/kern/kern_timeout.c:57)
lock order [1] /usr/src/sys/dev/rnd.c:321 (/usr/src/sys/dev/rnd.c:321) -> [2] 
/usr/src/sys/kern/kern_timeout.c:57 (/usr/src/sys/kern/kern_timeout.c:57)
#0  mtx_enter+0x48
#1  timeout_del+0x30
#2  dequeue_randomness+0x3c
#3  extract_entropy+0x94
#4  _rs_stir+0x2c
#5  arc4random_buf+0x108
#6  pool_p_alloc+0x10c
#7  pool_do_get+0x210
#8  pool_get+0x88
#9  amap_alloc1+0xec
#10 amap_alloc+0x3c
#11 amap_copy+0x11c
#12 uvm_fault_check+0x270
#13 uvm_fault+0xd8
#14 udata_abort+0x13c
#15 do_el0_sync+0x134
#16 handle_el0_sync+0x74
lock order [2] /usr/src/sys/kern/kern_timeout.c:57 
(/usr/src/sys/kern/kern_timeout.c:57) -> [3] &sched_lock (&sched_lock)
#0  mtx_enter+0x48
#1  sleep_setup+0x5c
#2  msleep+0x9c
#3  softclock_thread+0xb4
#4  proc_trampoline+0x10
lock order [3] &sched_lock (&sched_lock) -> [4] 
/usr/src/sys/arch/arm64/arm64/pmap.c:221 
(/usr/src/sys/arch/arm64/arm64/pmap.c:221)
#0  mtx_enter+0x48
#1  pmap_allocate_asid+0x20
#2  pmap_setttb+0x4c
#3  $x.2+0x38
#4  sleep_finish+0xf4
#5  main+0x438
#6  virtdone+0x74
lock order [4] /usr/src/sys/arch/arm64/arm64/pmap.c:221 
(/usr/src/sys/arch/arm64/arm64/pmap.c:221) -> [1] /usr/src/sys/dev/rnd.c:321 
(/usr/src/sys/dev/rnd.c:321)
#0  mtx_enter+0x48
#1  arc4random+0x2c
#2  pmap_find_asid+0x70
#3  pmap_allocate_asid+0x28
#4  pmap_setttb+0x4c
#5  $x.2+0x38
#6  sleep_finish+0xf4
#7  main+0x438
#8  virtdone+0x74

Reply via email to