Index: uspace/lib/virtio/virtio.c
===================================================================
--- uspace/lib/virtio/virtio.c	(revision 3f1d4d55f304f9d6a8aa76b3d2265f520f5ab6b0)
+++ uspace/lib/virtio/virtio.c	(revision e3107e20c715f456c231e946671632911d072f7e)
@@ -63,4 +63,5 @@
 	virtq_t *q = &vdev->queues[num];
 
+	fibril_mutex_lock(&q->lock);
 	uint16_t idx = pio_read_le16(&q->avail->idx);
 	pio_write_le16(&q->avail->ring[idx % q->queue_size], descno);
@@ -69,4 +70,5 @@
 	write_barrier();
 	pio_write_le16(q->notify, num);
+	fibril_mutex_unlock(&q->lock);
 }
 
@@ -76,7 +78,10 @@
 	virtq_t *q = &vdev->queues[num];
 
+	fibril_mutex_lock(&q->lock);
 	uint16_t last_idx = q->used_last_idx % q->queue_size;
-	if (last_idx == (pio_read_le16(&q->used->idx) % q->queue_size))
+	if (last_idx == (pio_read_le16(&q->used->idx) % q->queue_size)) {
+		fibril_mutex_unlock(&q->lock);
 		return false;
+	}
 
 	*descno = (uint16_t) pio_read_le32(&q->used->ring[last_idx].id);
@@ -84,4 +89,5 @@
 
 	q->used_last_idx++;
+	fibril_mutex_unlock(&q->lock);
 
 	return true;
@@ -132,4 +138,6 @@
 	}
 
+	fibril_mutex_initialize(&q->lock);
+
 	q->size = mem_size;
 	q->queue_size = size;
