summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/ethervirtio.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2020-05-02 15:32:19 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2020-05-02 15:32:19 +0200
commit8e2cfc0464d40972afa1f142f999e53771c34399 (patch)
tree41754eedcd647c0825c3621623deee0a1331b468 /sys/src/9/pc/ethervirtio.c
parent39c3fd117ab4988c041800490b23c2aedb1858d3 (diff)
ether82543gc, ether82557, ethervirtio: do kproc() call ouside of spinlock
Diffstat (limited to 'sys/src/9/pc/ethervirtio.c')
-rw-r--r--sys/src/9/pc/ethervirtio.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/sys/src/9/pc/ethervirtio.c b/sys/src/9/pc/ethervirtio.c
index eb1fa98c1..92ec308b9 100644
--- a/sys/src/9/pc/ethervirtio.c
+++ b/sys/src/9/pc/ethervirtio.c
@@ -419,19 +419,21 @@ attach(Ether* edev)
ctlr = edev->ctlr;
lock(ctlr);
- if(!ctlr->attached){
- ctlr->attached = 1;
-
- /* ready to go */
- outb(ctlr->port+Qstatus, inb(ctlr->port+Qstatus) | Sdriverok);
-
- /* start kprocs */
- snprint(name, sizeof name, "#l%drx", edev->ctlrno);
- kproc(name, rxproc, edev);
- snprint(name, sizeof name, "#l%dtx", edev->ctlrno);
- kproc(name, txproc, edev);
+ if(ctlr->attached){
+ unlock(ctlr);
+ return;
}
+ ctlr->attached = 1;
unlock(ctlr);
+
+ /* ready to go */
+ outb(ctlr->port+Qstatus, inb(ctlr->port+Qstatus) | Sdriverok);
+
+ /* start kprocs */
+ snprint(name, sizeof name, "#l%drx", edev->ctlrno);
+ kproc(name, rxproc, edev);
+ snprint(name, sizeof name, "#l%dtx", edev->ctlrno);
+ kproc(name, txproc, edev);
}
static long