ref: f0ce9c513f864b7e90de33fe738e0231ca678e63
parent: 986aa1670625558654fbfd6e78a9c5d78d44fbfd
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Tue Apr 24 04:46:23 EDT 2012
sdvirtio: make sure queue sizes are multiple of two
--- a/sys/src/9/pc/sdvirtio.c
+++ b/sys/src/9/pc/sdvirtio.c
@@ -119,7 +119,7 @@
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 @@
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 @@
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;
--
⑨