diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2013-11-22 22:29:31 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2013-11-22 22:29:31 +0100 |
commit | 55d31f2cab0101dfbdeb2857e2fce2629080cf02 (patch) | |
tree | 90a653927ee803495d55ca049e45157cb0bf5339 | |
parent | df6b68092cf2806d7c517e15d2db57b0b19a9788 (diff) | |
download | plan9front-55d31f2cab0101dfbdeb2857e2fce2629080cf02.tar.xz |
pc kernel: kproc error and exit
catch the error() that can be thrown by sleep() and tsleep()
in kprocs.
add missing pexit() calls.
always set the freemem argument to pexit() from kproc otherwise
the process gets added to the broken list.
-rw-r--r-- | sys/src/9/pc/devpccard.c | 9 | ||||
-rw-r--r-- | sys/src/9/pc/ether82543gc.c | 11 | ||||
-rw-r--r-- | sys/src/9/pc/ether82557.c | 10 | ||||
-rw-r--r-- | sys/src/9/pc/ether82563.c | 25 | ||||
-rw-r--r-- | sys/src/9/pc/ether82598.c | 6 | ||||
-rw-r--r-- | sys/src/9/pc/etherigbe.c | 5 | ||||
-rw-r--r-- | sys/src/9/pc/etheriwl.c | 5 | ||||
-rw-r--r-- | sys/src/9/pc/etherm10g.c | 4 | ||||
-rw-r--r-- | sys/src/9/pc/ethervt6102.c | 2 | ||||
-rw-r--r-- | sys/src/9/pc/ethervt6105m.c | 2 | ||||
-rw-r--r-- | sys/src/9/pc/etheryuk.c | 7 | ||||
-rw-r--r-- | sys/src/9/pc/pcrandom.c | 7 | ||||
-rw-r--r-- | sys/src/9/pc/sdiahci.c | 2 | ||||
-rw-r--r-- | sys/src/9/pc/sdmv50xx.c | 2 | ||||
-rw-r--r-- | sys/src/9/pc/sdodin.c | 2 | ||||
-rw-r--r-- | sys/src/9/pc/wavelan.c | 4 | ||||
-rw-r--r-- | sys/src/9/pc/wifi.c | 13 |
17 files changed, 89 insertions, 27 deletions
diff --git a/sys/src/9/pc/devpccard.c b/sys/src/9/pc/devpccard.c index 8055cf9bc..5f884c63d 100644 --- a/sys/src/9/pc/devpccard.c +++ b/sys/src/9/pc/devpccard.c @@ -449,10 +449,13 @@ eventoccured(void) static void processevents(void *) { - while (1) { - int message; - Cardbus *cb; + int message; + Cardbus *cb; + while(waserror()) + ; + + for(;;){ sleep(&revents, (int (*)(void *))eventoccured, nil); cb = nil; diff --git a/sys/src/9/pc/ether82543gc.c b/sys/src/9/pc/ether82543gc.c index e90b84845..db9aaa6e0 100644 --- a/sys/src/9/pc/ether82543gc.c +++ b/sys/src/9/pc/ether82543gc.c @@ -1228,18 +1228,19 @@ gc82543watchdog(void* arg) Ctlr *ctlr; edev = arg; + while(waserror()) + ; for(;;){ tsleep(&up->sleep, return0, 0, 1000); - ctlr = edev->ctlr; - if(ctlr == nil){ - print("%s: exiting\n", up->text); - pexit("disabled", 0); - } + if(ctlr == nil) + break; gc82543checklink(ctlr); gc82543replenish(ctlr); } + print("%s: exiting\n", up->text); + pexit("disabled", 1); } static void diff --git a/sys/src/9/pc/ether82557.c b/sys/src/9/pc/ether82557.c index be7971d67..7194d39c8 100644 --- a/sys/src/9/pc/ether82557.c +++ b/sys/src/9/pc/ether82557.c @@ -348,6 +348,8 @@ watchdog(void* arg) static void txstart(Ether*); ether = arg; + while(waserror()) + ; for(;;){ tsleep(&up->sleep, return0, 0, 4000); @@ -357,10 +359,8 @@ watchdog(void* arg) * the future. */ ctlr = ether->ctlr; - if(ctlr == nil || ctlr->state == 0){ - print("%s: exiting\n", up->text); - pexit("disabled", 0); - } + if(ctlr == nil || ctlr->state == 0) + break; ilock(&ctlr->cblock); if(ctlr->tick++){ @@ -369,6 +369,8 @@ watchdog(void* arg) } iunlock(&ctlr->cblock); } + print("%s: exiting\n", up->text); + pexit("disabled", 1); } static void diff --git a/sys/src/9/pc/ether82563.c b/sys/src/9/pc/ether82563.c index 1d7e28496..34a18d97f 100644 --- a/sys/src/9/pc/ether82563.c +++ b/sys/src/9/pc/ether82563.c @@ -853,6 +853,8 @@ i82563tproc(void *v) i82563txinit(ctlr); tdt = ctlr->tdt; + while(waserror()) + ; for(;;){ n = NEXT(tdt, ctlr->ntd); if(n == i82563cleanup(ctlr)){ @@ -986,6 +988,8 @@ i82563rproc(void *arg) }else im = Rxt0|Rxo|Rxdmt0|Rxseq|Ack; + while(waserror()) + ; for(;;){ i82563im(ctlr, im); ctlr->rsleep++; @@ -1163,9 +1167,13 @@ phyl79proc(void *v) c = e->ctlr; phyno = phyprobe(c, 3<<1); - if(phyno == ~0) - return; + if(phyno == ~0){ + print("%s: no phy, exiting\n", up->text); + pexit("no phy", 1); + } + while(waserror()) + ; for(;;){ phy = phyread(c, phyno, Phystat); if(phy == ~0){ @@ -1203,11 +1211,16 @@ phylproc(void *v) c = e->ctlr; phyno = phyprobe(c, 3<<1); - if(phyno == ~0) - return; + if(phyno == ~0){ + print("%s: no phy, exiting\n", up->text); + pexit("no phy", 1); + } if(c->type == i82573 && (phy = phyread(c, phyno, Phyier)) != ~0) phywrite(c, phyno, Phyier, phy | Lscie | Ancie | Spdie | Panie); + + while(waserror()) + ; for(;;){ phy = phyread(c, phyno, Physsr); if(phy == ~0){ @@ -1263,6 +1276,8 @@ pcslproc(void *v) if(c->type == i82575 || c->type == i82576) csr32w(c, Connsw, Enrgirq); + while(waserror()) + ; for(;;){ phy = csr32r(c, Pcsstat); e->link = phy & Linkok; @@ -1290,6 +1305,8 @@ serdeslproc(void *v) e = v; c = e->ctlr; + while(waserror()) + ; for(;;){ rx = csr32r(c, Rxcw); tx = csr32r(c, Txcw); diff --git a/sys/src/9/pc/ether82598.c b/sys/src/9/pc/ether82598.c index eaba15e82..b786eced7 100644 --- a/sys/src/9/pc/ether82598.c +++ b/sys/src/9/pc/ether82598.c @@ -375,6 +375,8 @@ lproc(void *v) e = v; c = e->ctlr; + while(waserror()) + ; for (;;) { r = c->reg[Links]; e->link = (r & Lnkup) != 0; @@ -467,6 +469,8 @@ tproc(void *v) e = v; c = e->ctlr; + while(waserror()) + ; for (;;) { sleep(&c->trendez, tim, c); /* transmit kicks us */ c->tim = 0; @@ -551,6 +555,8 @@ rproc(void *v) c = e->ctlr; m = c->nrd - 1; rdh = 0; + while(waserror()) + ; loop: replenish(c, rdh); im(c, Irx0); diff --git a/sys/src/9/pc/etherigbe.c b/sys/src/9/pc/etherigbe.c index 0b82aad14..059287ec6 100644 --- a/sys/src/9/pc/etherigbe.c +++ b/sys/src/9/pc/etherigbe.c @@ -782,6 +782,8 @@ igbelproc(void* arg) edev = arg; ctlr = edev->ctlr; + while(waserror()) + ; for(;;){ if(ctlr->mii == nil || ctlr->mii->curphy == nil) continue; @@ -1091,6 +1093,9 @@ igberproc(void* arg) r |= Ren; csr32w(ctlr, Rctl, r); + while(waserror()) + ; + for(;;){ ctlr->rim = 0; igbeim(ctlr, Rxt0|Rxo|Rxdmt0|Rxseq); diff --git a/sys/src/9/pc/etheriwl.c b/sys/src/9/pc/etheriwl.c index 777de1512..c6eece284 100644 --- a/sys/src/9/pc/etheriwl.c +++ b/sys/src/9/pc/etheriwl.c @@ -1997,11 +1997,10 @@ iwlrecover(void *arg) edev = arg; ctlr = edev->ctlr; + while(waserror()) + ; for(;;){ - while(waserror()) - ; tsleep(&up->sleep, return0, 0, 4000); - poperror(); qlock(ctlr); for(;;){ diff --git a/sys/src/9/pc/etherm10g.c b/sys/src/9/pc/etherm10g.c index 69a1245aa..a27768ab0 100644 --- a/sys/src/9/pc/etherm10g.c +++ b/sys/src/9/pc/etherm10g.c @@ -1082,6 +1082,8 @@ m10rx(void *v) e = v; c = e->ctlr; + while(waserror()) + ; for(;;){ replenish(&c->sm); replenish(&c->bg); @@ -1144,6 +1146,8 @@ txproc(void *v) e = v; c = e->ctlr; tx = &c->tx; + while(waserror()) + ; for(;;){ sleep(&c->txrendez, txcansleep, c); txcleanup(tx, gbit32(c->stats->txcnt)); diff --git a/sys/src/9/pc/ethervt6102.c b/sys/src/9/pc/ethervt6102.c index 7b5fe980b..2e7b65c0a 100644 --- a/sys/src/9/pc/ethervt6102.c +++ b/sys/src/9/pc/ethervt6102.c @@ -440,6 +440,8 @@ vt6102lproc(void* arg) edev = arg; ctlr = edev->ctlr; + while(waserror()) + ; for(;;){ if(ctlr->mii == nil || ctlr->mii->curphy == nil) break; diff --git a/sys/src/9/pc/ethervt6105m.c b/sys/src/9/pc/ethervt6105m.c index 9b608c422..888edcc2a 100644 --- a/sys/src/9/pc/ethervt6105m.c +++ b/sys/src/9/pc/ethervt6105m.c @@ -547,6 +547,8 @@ vt6105Mlproc(void* arg) edev = arg; ctlr = edev->ctlr; + while(waserror()) + ; for(;;){ if(ctlr->mii == nil || ctlr->mii->curphy == nil) break; diff --git a/sys/src/9/pc/etheryuk.c b/sys/src/9/pc/etheryuk.c index 0ca3dfb94..e4c5ba548 100644 --- a/sys/src/9/pc/etheryuk.c +++ b/sys/src/9/pc/etheryuk.c @@ -1243,6 +1243,8 @@ tproc(void *v) txinit(e); linkup(c, Txen); + while(waserror()) + ; for(;;){ if((b = qbread(e->oq, 100000)) == nil) break; @@ -1381,6 +1383,8 @@ rproc(void *v) rxinit(e); linkup(c, Rxen); + while(waserror()) + ; for(;;) if(replenish(e, c) == 0){ starve(k); @@ -1750,7 +1754,8 @@ iproc(void *v) e = v; c = e->ctlr; k = &c->iproc; - + while(waserror()) + ; for(;;){ starve(k); cause = c->reg[Eisr]; diff --git a/sys/src/9/pc/pcrandom.c b/sys/src/9/pc/pcrandom.c index db77fbbdd..386d7bf8e 100644 --- a/sys/src/9/pc/pcrandom.c +++ b/sys/src/9/pc/pcrandom.c @@ -44,10 +44,11 @@ genrandom(void*) up->basepri = PriNormal; up->priority = up->basepri; + while(waserror()) + ; for(;;){ - for(;;) - if(++rb.randomcount > 100000) - break; + if(++rb.randomcount <= 100000) + continue; if(anyhigher()) sched(); if(!rbnotfull(0)) diff --git a/sys/src/9/pc/sdiahci.c b/sys/src/9/pc/sdiahci.c index 4a70c50ae..0c157d7a9 100644 --- a/sys/src/9/pc/sdiahci.c +++ b/sys/src/9/pc/sdiahci.c @@ -1177,6 +1177,8 @@ satakproc(void*) { int i; + while(waserror()) + ; for(;;){ tsleep(&up->sleep, return0, 0, Nms); for(i = 0; i < niadrive; i++) diff --git a/sys/src/9/pc/sdmv50xx.c b/sys/src/9/pc/sdmv50xx.c index eb28df098..5ebb6d6fd 100644 --- a/sys/src/9/pc/sdmv50xx.c +++ b/sys/src/9/pc/sdmv50xx.c @@ -1100,6 +1100,8 @@ satakproc(void*) { int i; + while(waserror()) + ; for(;;){ tsleep(&up->sleep, return0, 0, Nms); for(i = 0; i < nmvsatadrive; i++) diff --git a/sys/src/9/pc/sdodin.c b/sys/src/9/pc/sdodin.c index 3f35d7f51..0153b3db6 100644 --- a/sys/src/9/pc/sdodin.c +++ b/sys/src/9/pc/sdodin.c @@ -2272,6 +2272,8 @@ mskproc(void*) { int i; + while(waserror()) + ; for(;;){ tsleep(&up->sleep, return0, 0, Nms); for(i = 0; i < nmsdrive; i++) diff --git a/sys/src/9/pc/wavelan.c b/sys/src/9/pc/wavelan.c index 27fe622e5..74437194a 100644 --- a/sys/src/9/pc/wavelan.c +++ b/sys/src/9/pc/wavelan.c @@ -682,6 +682,8 @@ w_timer(void* arg) Ctlr* ctlr = (Ctlr*)ether->ctlr; ctlr->timerproc = up; + while(waserror()) + ; for(;;){ tsleep(&up->sleep, return0, 0, MSperTick); ctlr = (Ctlr*)ether->ctlr; @@ -732,7 +734,7 @@ w_timer(void* arg) } iunlock(ctlr); } - pexit("terminated", 0); + pexit("terminated", 1); } void diff --git a/sys/src/9/pc/wifi.c b/sys/src/9/pc/wifi.c index a4e160fa1..39959d9f8 100644 --- a/sys/src/9/pc/wifi.c +++ b/sys/src/9/pc/wifi.c @@ -450,9 +450,14 @@ wifiproc(void *arg) b = nil; wifi = arg; + while(waserror()) + ; for(;;){ - if(b != nil) + if(b != nil){ freeb(b); + b = nil; + continue; + } if((b = qbread(wifi->iq, 100000)) == nil) break; w = (Wifipkt*)b->rp; @@ -526,7 +531,7 @@ wifiproc(void *arg) break; } } - pexit("wifi in queue closed", 0); + pexit("wifi in queue closed", 1); } static void @@ -584,9 +589,11 @@ wifoproc(void *arg) wifi = arg; ether = wifi->ether; + while(waserror()) + ; while((b = qbread(ether->oq, 1000000)) != nil) wifietheroq(wifi, b); - pexit("ether out queue closed", 0); + pexit("ether out queue closed", 1); } static void |