to read address before selecting the correct vq. At that point, I've added simple prints to the driver. Initially it looked as follows: iowrite16(index, &vp_dev->common->queue_select); switch (ioread64(&vp_dev->common->queue_address)) { [...] }; So I added prints before the iowrite16() and after the ioread64(), and saw that while the driver prints were ordered, the device ones weren't: [ 1.264052] before iowrite index=1 kvmtool: net returning pfn (vq=0): 310706176 kvmtool: queue selected: 1 [ 1.264890] after ioread index=1 Suspecting that something was wrong with ordering, I've added a print between the iowrite and the ioread, and it finally started working well. Which leads me to the question: Are MMIO vs MMIO reads/writes not ordered? -- Sasha.