fix lock inversion between sleep/wakeup and the block pool ilock. Notes: Tue Jul 23 11:10:42: minooka# i82599:0: starve 0 Tue Jul 23 11:10:42: bcbc 0 0 Tue Jul 23 11:10:42: 0800 0 0 Tue Jul 23 11:10:42: 0806 0 0 Tue Jul 23 11:10:42: 86dd 0 0 Tue Jul 23 11:10:42: wakey 0; 1 0 Tue Jul 23 11:10:42: wakey 0; 12 1 Tue Jul 23 11:10:42: wakey 0; 13 2 Tue Jul 23 11:10:42: wakey 0; 20 3 Tue Jul 23 11:10:42: wakey 0; 32 4 Tue Jul 23 11:10:42: wakey 0; 49 5 Tue Jul 23 11:10:42: wakey 0; 50 6 Tue Jul 23 11:10:42: wakey 0; 55 7 Tue Jul 23 11:10:42: wakey 0; 63 8 Tue Jul 23 11:10:42: wakey 0; 68 9 Tue Jul 23 11:10:42: wakey 0; 73 10 Tue Jul 23 11:10:42: wakey 0; 78 11 Tue Jul 23 11:10:42: wakey 0; 87 12 Tue Jul 23 11:10:42: wakey 0; 95 13 Tue Jul 23 11:10:42: wakey 0; 96 14 Tue Jul 23 11:10:42: wakey 0; 101 15 Tue Jul 23 11:10:42: wakey 0; 107 16 Tue Jul 23 11:10:42: wakey 0; 112 17 Tue Jul 23 11:10:42: wakey 0; 118 18 Tue Jul 23 11:10:42: wakey 0; 125 19 Tue Jul 23 11:10:42: wakey 0; 131 20 Tue Jul 23 11:10:42: wakey 0; 140 21 Tue Jul 23 11:10:42: wakey 0; 145 22 Tue Jul 23 11:10:42: wakey 0; 154 23 Tue Jul 23 11:10:42: wakey 0; 161 24 Tue Jul 23 11:10:42: wakey 0; 162 25 Tue Jul 23 11:10:42: wakey 0; 243 26 Tue Jul 23 11:10:42: wakey 0; 244 27 Tue Jul 23 11:10:42: wakey 0; 246 28 Tue Jul 23 11:10:42: i82599:0: starve 0 Tue Jul 23 11:10:42: wa bcbc 0 0 Tue Jul 23 11:10:42: 0800 0 0 Tue Jul 23 11:10:42: k 0806 0 0e Tue Jul 23 11:10:42: 86dd 0 0 Tue Jul 23 11:10:42: 0; 346 29 Tue Jul 23 11:10:43: lock 0xf034d460 loop key 0xdeaddead pc 0xf019d739 held by pc 0xf019d2d2 proc 8 Tue Jul 23 11:10:43: 1891:trampoline pc a122 dbgpc a122 Pread (Running) ut 1 st 99 bss f000 qpc f0198ea6 nl 0 nd 0 lpc f019d739 pri 10 Tue Jul 23 11:10:43: 8: #l0r pc f01b95d8 dbgpc 0 Running (Running) ut 2294 st 0 bss 0 qpc 0 nl 2 nd 0 lpc f019d2e5 pri 13 Tue Jul 23 11:10:43: lock 0xf034d460 loop key 0xdeaddead pc 0xf019d739 held by pc 0xf019d2d2 proc 8 Tue Jul 23 11:10:43: 1891:trampoline pc a122 dbgpc a122 Pread (Running) ut 1 st 99 bss f000 qpc f0198ea6 nl 0 nd 0 lpc f019d739 pri 10 Tue Jul 23 11:10:43: 8: #l0r pc f01b95d8 dbgpc 0 Running (Running) ut 2294 st 0 bss 0 qpc 0 nl 2 nd 0 lpc f019d2e5 pri 13 Tue Jul 23 11:10:43: lock 0xf034d460 loop key 0xdeaddead pc 0xf019d739 held by pc 0xf019d2d2 proc 8 Tue Jul 23 11:10:43: 1891:trampoline pc a122 dbgpc a122 Pread (Running) ut 1 st 99 bss f000 qpc f0198ea6 nl 0 nd 0 lpc f019d739 pri 10 Tue Jul 23 11:10:43: 8: #l0r pc f01b95d8 dbgpc 0 Running (Running) ut 2294 st 0 bss 0 qpc 0 nl 2 nd 0 lpc f019d2e5 pri 13 Tue Jul 23 11:10:43: lock 0xf034d460 loop key 0xdeaddead pc 0xf019d739 held by pc 0xf019d2d2 proc 8 Tue Jul 23 11:10:43: 1891:trampoline pc a122 dbgpc a122 Pread (Running) ut 1 st 99 bss f000 qpc f0198ea6 nl 0 nd 0 lpc f019d739 pri 10 Tue Jul 23 11:10:43: 8: #l0r pc f01b95d8 dbgpc 0 Running (Running) ut 2294 st 0 bss 0 qpc 0 nl 2 nd 0 lpc f019d2e5 pri 13 Tue Jul 23 11:10:44: lock 0xf034d460 loop key 0xdeaddead pc 0xf019d739 held by pc 0xf019d2d2 proc 8 acid; src(0xf019d739) /sys/src/9/port/proc.c:872 867 int s; 868 869 s = splhi(); 870 871 lock(r); >872 p = r->p; 873 874 if(p != nil){ 875 lock(&p->rlock); 876 if(p->state != Wakeme || p->r != r){ 877 iprint("%p %p %d\n", p->r, r, p->state); acid; src(0xf019d2d2) /sys/src/9/port/proc.c:748 743 744 if(up->nlocks.ref) 745 print("process %lud sleeps with %lud locks held, last lock %#p locked at pc %#lux, sleep called from %#p\n", 746 up->pid, up->nlocks.ref, up->lastlock, up->lastlock->pc, getcallerpc(&r)); 747 lock(r); >748 lock(&up->rlock); 749 if(r->p){ 750 print("double sleep called from %#p, %lud %lud\n", getcallerpc(&r), r->p->pid, up->pid); 751 dumpstack(); 752 } 753 Reference: /n/atom/patch/applied2013/etherlkinvert Date: Tue Jul 23 19:12:20 CES 2013 Signed-off-by: quanstro@quanstro.net Reviewed-by: quanstro --- /sys/src/9/pc/ether82598.c Tue Jul 23 19:11:52 2013 +++ /sys/src/9/pc/ether82598.c Tue Jul 23 19:11:52 2013 @@ -532,9 +532,10 @@ iprint("wakey %d; %d %d\n", t, p->nstarve, p->nwakey); p->nwakey++; p->starve = 0; + iunlock(p); wakeup(p); - } - iunlock(p); + }else + iunlock(p); } static void --- /sys/src/9/pcpae/ether82598.c Tue Jul 23 19:11:52 2013 +++ /sys/src/9/pcpae/ether82598.c Tue Jul 23 19:11:52 2013 @@ -532,9 +532,10 @@ iprint("wakey %d; %d %d\n", t, p->nstarve, p->nwakey); p->nwakey++; p->starve = 0; + iunlock(p); wakeup(p); - } - iunlock(p); + }else + iunlock(p); } static void --- /sys/src/9/pc/ether82563.c Tue Jul 23 19:11:52 2013 +++ /sys/src/9/pc/ether82563.c Tue Jul 23 19:11:52 2013 @@ -842,9 +842,10 @@ iprint("wakey %d; %d %d\n", t, p->nstarve, p->nwakey); p->nwakey++; p->starve = 0; + iunlock(p); wakeup(p); - } - iunlock(p); + }else + iunlock(p); } static void --- /sys/src/9/pcpae/ether82563.c Tue Jul 23 19:11:52 2013 +++ /sys/src/9/pcpae/ether82563.c Tue Jul 23 19:11:52 2013 @@ -842,9 +842,10 @@ iprint("wakey %d; %d %d\n", t, p->nstarve, p->nwakey); p->nwakey++; p->starve = 0; + iunlock(p); wakeup(p); - } - iunlock(p); + }else + iunlock(p); } static void --- /sys/src/nix/k10/ether82598.c Tue Jul 23 19:11:52 2013 +++ /sys/src/nix/k10/ether82598.c Tue Jul 23 19:11:52 2013 @@ -537,9 +537,10 @@ iprint("wakey %d; %d %d\n", t, p->nstarve, p->nwakey); p->nwakey++; p->starve = 0; + iunlock(p); wakeup(p); - } - iunlock(p); + }else + iunlock(p); } static void @@ -644,8 +645,8 @@ if(!(b = qget(e->oq))) break; t = c->tdba+tdt; - t->addr[0] = PCIWADDR(b->rp); - t->addr[1] = PCIWADDR(b->rp)>>32; + t->addr[0] = Pciwaddrl(b->rp); + t->addr[1] = Pciwaddrh(b->rp); t->length = BLEN(b); t->cmd = Rs|Ifcs|Teop; c->tb[tdt] = b; --- /sys/src/nix/k10/ether82563.c Tue Jul 23 19:11:52 2013 +++ /sys/src/nix/k10/ether82563.c Tue Jul 23 19:11:52 2013 @@ -842,9 +842,10 @@ iprint("wakey %d; %d %d\n", t, p->nstarve, p->nwakey); p->nwakey++; p->starve = 0; + iunlock(p); wakeup(p); - } - iunlock(p); + }else + iunlock(p); } static void