From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41814) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YRPXn-0001ke-V5 for qemu-devel@nongnu.org; Fri, 27 Feb 2015 13:21:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YRPXj-0002Ol-7f for qemu-devel@nongnu.org; Fri, 27 Feb 2015 13:21:47 -0500 Received: from mx1.redhat.com ([209.132.183.28]:37202) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YRPXj-0002Og-0X for qemu-devel@nongnu.org; Fri, 27 Feb 2015 13:21:43 -0500 From: Stefan Hajnoczi Date: Fri, 27 Feb 2015 18:19:07 +0000 Message-Id: <1425061147-1411-70-git-send-email-stefanha@redhat.com> In-Reply-To: <1425061147-1411-1-git-send-email-stefanha@redhat.com> References: <1425061147-1411-1-git-send-email-stefanha@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL 69/69] tests: Check QVIRTIO_F_ANY_LAYOUT flag in virtio-blk test List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Marc=20Mar=C3=AD?= , Peter Maydell , Stefan Hajnoczi From: Marc Mar=C3=AD Check the QVIRTIO_F_ANY_LAYOUT flag before performing operations with 2 descriptor layout. This is to follow the specification strictly. This patch depends on: [PATCH v5 0/5] libqos: Virtio MMIO driver Signed-off-by: Marc Mar=C3=AD Message-id: 1424815154-27243-1-git-send-email-marc.mari.barcelo@gmail.com Signed-off-by: Stefan Hajnoczi --- tests/virtio-blk-test.c | 118 +++++++++++++++++++++++++-----------------= ------ 1 file changed, 62 insertions(+), 56 deletions(-) diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index 3b943fc..4078321 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -191,59 +191,11 @@ static void test_basic(const QVirtioBus *bus, QVirt= ioDevice *dev, =20 qvirtio_set_driver_ok(bus, dev); =20 - /* Write and read with 2 descriptor layout */ - /* Write request */ - req.type =3D QVIRTIO_BLK_T_OUT; - req.ioprio =3D 1; - req.sector =3D 0; - req.data =3D g_malloc0(512); - strcpy(req.data, "TEST"); - - req_addr =3D virtio_blk_request(alloc, &req, 512); - - g_free(req.data); - - free_head =3D qvirtqueue_add(vq, req_addr, 528, false, true); - qvirtqueue_add(vq, req_addr + 528, 1, true, false); - qvirtqueue_kick(bus, dev, vq, free_head); - - qvirtio_wait_queue_isr(bus, dev, vq, QVIRTIO_BLK_TIMEOUT_US); - status =3D readb(req_addr + 528); - g_assert_cmpint(status, =3D=3D, 0); - - guest_free(alloc, req_addr); - - /* Read request */ - req.type =3D QVIRTIO_BLK_T_IN; - req.ioprio =3D 1; - req.sector =3D 0; - req.data =3D g_malloc0(512); - - req_addr =3D virtio_blk_request(alloc, &req, 512); - - g_free(req.data); - - free_head =3D qvirtqueue_add(vq, req_addr, 16, false, true); - qvirtqueue_add(vq, req_addr + 16, 513, true, false); - - qvirtqueue_kick(bus, dev, vq, free_head); - - qvirtio_wait_queue_isr(bus, dev, vq, QVIRTIO_BLK_TIMEOUT_US); - status =3D readb(req_addr + 528); - g_assert_cmpint(status, =3D=3D, 0); - - data =3D g_malloc0(512); - memread(req_addr + 16, data, 512); - g_assert_cmpstr(data, =3D=3D, "TEST"); - g_free(data); - - guest_free(alloc, req_addr); - /* Write and read with 3 descriptor layout */ /* Write request */ req.type =3D QVIRTIO_BLK_T_OUT; req.ioprio =3D 1; - req.sector =3D 1; + req.sector =3D 0; req.data =3D g_malloc0(512); strcpy(req.data, "TEST"); =20 @@ -266,7 +218,7 @@ static void test_basic(const QVirtioBus *bus, QVirtio= Device *dev, /* Read request */ req.type =3D QVIRTIO_BLK_T_IN; req.ioprio =3D 1; - req.sector =3D 1; + req.sector =3D 0; req.data =3D g_malloc0(512); =20 req_addr =3D virtio_blk_request(alloc, &req, 512); @@ -289,6 +241,56 @@ static void test_basic(const QVirtioBus *bus, QVirti= oDevice *dev, g_free(data); =20 guest_free(alloc, req_addr); + + if (features & QVIRTIO_F_ANY_LAYOUT) { + /* Write and read with 2 descriptor layout */ + /* Write request */ + req.type =3D QVIRTIO_BLK_T_OUT; + req.ioprio =3D 1; + req.sector =3D 1; + req.data =3D g_malloc0(512); + strcpy(req.data, "TEST"); + + req_addr =3D virtio_blk_request(alloc, &req, 512); + + g_free(req.data); + + free_head =3D qvirtqueue_add(vq, req_addr, 528, false, true); + qvirtqueue_add(vq, req_addr + 528, 1, true, false); + qvirtqueue_kick(bus, dev, vq, free_head); + + qvirtio_wait_queue_isr(bus, dev, vq, QVIRTIO_BLK_TIMEOUT_US); + status =3D readb(req_addr + 528); + g_assert_cmpint(status, =3D=3D, 0); + + guest_free(alloc, req_addr); + + /* Read request */ + req.type =3D QVIRTIO_BLK_T_IN; + req.ioprio =3D 1; + req.sector =3D 1; + req.data =3D g_malloc0(512); + + req_addr =3D virtio_blk_request(alloc, &req, 512); + + g_free(req.data); + + free_head =3D qvirtqueue_add(vq, req_addr, 16, false, true); + qvirtqueue_add(vq, req_addr + 16, 513, true, false); + + qvirtqueue_kick(bus, dev, vq, free_head); + + qvirtio_wait_queue_isr(bus, dev, vq, QVIRTIO_BLK_TIMEOUT_US); + status =3D readb(req_addr + 528); + g_assert_cmpint(status, =3D=3D, 0); + + data =3D g_malloc0(512); + memread(req_addr + 16, data, 512); + g_assert_cmpstr(data, =3D=3D, "TEST"); + g_free(data); + + guest_free(alloc, req_addr); + } } =20 static void pci_basic(void) @@ -521,7 +523,8 @@ static void pci_msix(void) =20 g_free(req.data); =20 - free_head =3D qvirtqueue_add(&vqpci->vq, req_addr, 528, false, true)= ; + free_head =3D qvirtqueue_add(&vqpci->vq, req_addr, 16, false, true); + qvirtqueue_add(&vqpci->vq, req_addr + 16, 512, false, true); qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false); qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); =20 @@ -544,7 +547,8 @@ static void pci_msix(void) g_free(req.data); =20 free_head =3D qvirtqueue_add(&vqpci->vq, req_addr, 16, false, true); - qvirtqueue_add(&vqpci->vq, req_addr + 16, 513, true, false); + qvirtqueue_add(&vqpci->vq, req_addr + 16, 512, true, true); + qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false); =20 qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); =20 @@ -625,7 +629,8 @@ static void pci_idx(void) =20 g_free(req.data); =20 - free_head =3D qvirtqueue_add(&vqpci->vq, req_addr, 528, false, true)= ; + free_head =3D qvirtqueue_add(&vqpci->vq, req_addr, 16, false, true); + qvirtqueue_add(&vqpci->vq, req_addr + 16, 512, false, true); qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false); qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); =20 @@ -645,7 +650,8 @@ static void pci_idx(void) =20 /* Notify after processing the third request */ qvirtqueue_set_used_event(&vqpci->vq, 2); - free_head =3D qvirtqueue_add(&vqpci->vq, req_addr, 528, false, true)= ; + free_head =3D qvirtqueue_add(&vqpci->vq, req_addr, 16, false, true); + qvirtqueue_add(&vqpci->vq, req_addr + 16, 512, false, true); qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false); qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); =20 @@ -668,11 +674,11 @@ static void pci_idx(void) g_free(req.data); =20 free_head =3D qvirtqueue_add(&vqpci->vq, req_addr, 16, false, true); - qvirtqueue_add(&vqpci->vq, req_addr + 16, 513, true, false); + qvirtqueue_add(&vqpci->vq, req_addr + 16, 512, true, true); + qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false); =20 qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); =20 - qvirtio_wait_queue_isr(&qvirtio_pci, &dev->vdev, &vqpci->vq, QVIRTIO_BLK_TIMEOUT_US); =20 --=20 2.1.0