diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-04-24 08:46:23 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-04-24 08:46:23 +0200 |
commit | 23c05d3235153b150fe2e7cafe7ccbfd64c0058f (patch) | |
tree | b105f65a39c6eea25ad2ba02cd6b11d24aeefd79 /sys | |
parent | 43fb53943e4697c7753090d23db88bbf91ab3cec (diff) |
sdvirtio: make sure queue sizes are multiple of two
Diffstat (limited to 'sys')
-rw-r--r-- | sys/src/9/pc/sdvirtio.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/sys/src/9/pc/sdvirtio.c b/sys/src/9/pc/sdvirtio.c index 13311bd80..982ac51e9 100644 --- a/sys/src/9/pc/sdvirtio.c +++ b/sys/src/9/pc/sdvirtio.c @@ -119,7 +119,7 @@ mkvqueue(int size) sizeof(u16int)), BY2PG, 0, 0); if(p == nil || q == nil){ - print("mkvqueue: no memory for Vqueue\n"); + print("virtio: no memory for Vqueue\n"); free(p); free(q); return nil; @@ -169,12 +169,12 @@ viopnpdevs(int typ) if(pcicfgr16(p, 0x2E) != typ) continue; if((vd = malloc(sizeof(*vd))) == nil){ - print("viopnpdevs: cannot allocate memory for Vdev\n"); + print("virtio: no memory for Vdev\n"); break; } vd->port = p->mem[0].bar & ~0x1; if(ioalloc(vd->port, p->mem[0].size, 0, "virtio") < 0){ - print("viopnpdevs: port %lux in use\n", vd->port); + print("virtio: port %lux in use\n", vd->port); free(vd); continue; } @@ -188,7 +188,8 @@ viopnpdevs(int typ) outb(vd->port+Status, Acknowledge|Driver); for(i=0; i<nelem(vd->queue); i++){ outs(vd->port+Qselect, i); - if((n = ins(vd->port+Qsize)) == 0) + n = ins(vd->port+Qsize); + if(n == 0 || (n & (n-1)) != 0) break; if((vd->queue[i] = mkvqueue(n)) == nil) break; |