diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-05-02 15:32:19 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-05-02 15:32:19 +0200 |
commit | 8e2cfc0464d40972afa1f142f999e53771c34399 (patch) | |
tree | 41754eedcd647c0825c3621623deee0a1331b468 /sys/src/9/pc/ethervirtio.c | |
parent | 39c3fd117ab4988c041800490b23c2aedb1858d3 (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.c | 24 |
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 |