From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34378) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YAi5j-00030x-MC for qemu-devel@nongnu.org; Mon, 12 Jan 2015 11:43:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YAi5c-00026P-Om for qemu-devel@nongnu.org; Mon, 12 Jan 2015 11:43:47 -0500 Received: from mx1.redhat.com ([209.132.183.28]:42173) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YAi5c-000261-Ds for qemu-devel@nongnu.org; Mon, 12 Jan 2015 11:43:40 -0500 From: Stefan Hajnoczi Date: Mon, 12 Jan 2015 16:40:12 +0000 Message-Id: <1421080834-14724-23-git-send-email-stefanha@redhat.com> In-Reply-To: <1421080834-14724-1-git-send-email-stefanha@redhat.com> References: <1421080834-14724-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 v2 22/44] tests: Prepare virtio-blk-test for multi-arch implementation 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 Modularize functions in virtio-blk-test and add PCI suffix for PCI specif= ic components. Signed-off-by: Marc Mar=C3=AD Signed-off-by: Stefan Hajnoczi --- tests/virtio-blk-test.c | 146 ++++++++++++++++++++++++++++--------------= ------ 1 file changed, 85 insertions(+), 61 deletions(-) diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index 2424c84..c48c058 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -55,11 +55,10 @@ typedef struct QVirtioBlkReq { uint8_t status; } QVirtioBlkReq; =20 -static QPCIBus *test_start(void) +static char *drive_create(void) { - char *cmdline; - char tmp_path[] =3D "/tmp/qtest.XXXXXX"; int fd, ret; + char *tmp_path =3D g_strdup("/tmp/qtest.XXXXXX"); =20 /* Create a temporary raw image */ fd =3D mkstemp(tmp_path); @@ -68,6 +67,16 @@ static QPCIBus *test_start(void) g_assert_cmpint(ret, =3D=3D, 0); close(fd); =20 + return tmp_path; +} + +static QPCIBus *pci_test_start(void) +{ + char *cmdline; + char *tmp_path; + + tmp_path =3D drive_create(); + cmdline =3D g_strdup_printf("-drive if=3Dnone,id=3Ddrive0,file=3D%s,= format=3Draw " "-drive if=3Dnone,id=3Ddrive1,file=3D/dev/= null,format=3Draw " "-device virtio-blk-pci,id=3Ddrv0,drive=3D= drive0," @@ -75,6 +84,7 @@ static QPCIBus *test_start(void) tmp_path, PCI_SLOT, PCI_FN); qtest_start(cmdline); unlink(tmp_path); + g_free(tmp_path); g_free(cmdline); =20 return qpci_init_pc(); @@ -85,7 +95,7 @@ static void test_end(void) qtest_end(); } =20 -static QVirtioPCIDevice *virtio_blk_init(QPCIBus *bus, int slot) +static QVirtioPCIDevice *virtio_blk_pci_init(QPCIBus *bus, int slot) { QVirtioPCIDevice *dev; =20 @@ -135,14 +145,10 @@ static uint64_t virtio_blk_request(QGuestAllocator = *alloc, QVirtioBlkReq *req, return addr; } =20 -static void pci_basic(void) +static void test_basic(const QVirtioBus *bus, QVirtioDevice *dev, + QGuestAllocator *alloc, QVirtQueue *vq, uint64_t device_spec= ific) { - QVirtioPCIDevice *dev; - QPCIBus *bus; - QVirtQueuePCI *vqpci; - QGuestAllocator *alloc; QVirtioBlkReq req; - void *addr; uint64_t req_addr; uint64_t capacity; uint32_t features; @@ -150,28 +156,16 @@ static void pci_basic(void) uint8_t status; char *data; =20 - bus =3D test_start(); - - dev =3D virtio_blk_init(bus, PCI_SLOT); - - /* MSI-X is not enabled */ - addr =3D dev->addr + QVIRTIO_DEVICE_SPECIFIC_NO_MSIX; - - capacity =3D qvirtio_config_readq(&qvirtio_pci, &dev->vdev, - (uint64_t)(uintptr_t= )addr); + capacity =3D qvirtio_config_readq(bus, dev, device_specific); g_assert_cmpint(capacity, =3D=3D, TEST_IMAGE_SIZE / 512); =20 - features =3D qvirtio_get_features(&qvirtio_pci, &dev->vdev); + features =3D qvirtio_get_features(bus, dev); features =3D features & ~(QVIRTIO_F_BAD_FEATURE | QVIRTIO_F_RING_INDIRECT_DESC | QVIRTIO_F_RING_EVENT_= IDX | QVIRTIO_BLK_F_SCSI); - qvirtio_set_features(&qvirtio_pci, &dev->vdev, features); + qvirtio_set_features(bus, dev, features); =20 - alloc =3D pc_alloc_init(); - vqpci =3D (QVirtQueuePCI *)qvirtqueue_setup(&qvirtio_pci, &dev->vdev= , - allo= c, 0); - - qvirtio_set_driver_ok(&qvirtio_pci, &dev->vdev); + qvirtio_set_driver_ok(bus, dev); =20 /* Write and read with 2 descriptor layout */ /* Write request */ @@ -185,12 +179,11 @@ static void pci_basic(void) =20 g_free(req.data); =20 - free_head =3D qvirtqueue_add(&vqpci->vq, req_addr, 528, false, true)= ; - qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false); - qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); + 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); =20 - qvirtio_wait_queue_isr(&qvirtio_pci, &dev->vdev, &vqpci->vq, - QVIRTIO_BLK_TIMEOUT_US); + qvirtio_wait_queue_isr(bus, dev, vq, QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); =20 @@ -206,13 +199,12 @@ static void pci_basic(void) =20 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); + free_head =3D qvirtqueue_add(vq, req_addr, 16, false, true); + qvirtqueue_add(vq, req_addr + 16, 513, true, false); =20 - qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); + qvirtqueue_kick(bus, dev, vq, free_head); =20 - qvirtio_wait_queue_isr(&qvirtio_pci, &dev->vdev, &vqpci->vq, - QVIRTIO_BLK_TIMEOUT_US); + qvirtio_wait_queue_isr(bus, dev, vq, QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); =20 @@ -233,14 +225,15 @@ static void pci_basic(void) =20 req_addr =3D virtio_blk_request(alloc, &req, 512); =20 - 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); + g_free(req.data); =20 - qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); + free_head =3D qvirtqueue_add(vq, req_addr, 16, false, true); + qvirtqueue_add(vq, req_addr + 16, 512, false, true); + qvirtqueue_add(vq, req_addr + 528, 1, true, false); =20 - qvirtio_wait_queue_isr(&qvirtio_pci, &dev->vdev, &vqpci->vq, - QVIRTIO_BLK_TIMEOUT_US); + 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); =20 @@ -256,14 +249,13 @@ static void pci_basic(void) =20 g_free(req.data); =20 - free_head =3D qvirtqueue_add(&vqpci->vq, req_addr, 16, false, true); - qvirtqueue_add(&vqpci->vq, req_addr + 16, 512, true, true); - qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false); + free_head =3D qvirtqueue_add(vq, req_addr, 16, false, true); + qvirtqueue_add(vq, req_addr + 16, 512, true, true); + qvirtqueue_add(vq, req_addr + 528, 1, true, false); =20 - qvirtqueue_kick(&qvirtio_pci, &dev->vdev, &vqpci->vq, free_head); + qvirtqueue_kick(bus, dev, vq, free_head); =20 - qvirtio_wait_queue_isr(&qvirtio_pci, &dev->vdev, &vqpci->vq, - QVIRTIO_BLK_TIMEOUT_US); + qvirtio_wait_queue_isr(bus, dev, vq, QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); =20 @@ -273,11 +265,35 @@ static void pci_basic(void) g_free(data); =20 guest_free(alloc, req_addr); +} + +static void pci_basic(void) +{ + QVirtioPCIDevice *dev; + QPCIBus *bus; + QVirtQueuePCI *vqpci; + QGuestAllocator *alloc; + void *addr; + + bus =3D pci_test_start(); + dev =3D virtio_blk_pci_init(bus, PCI_SLOT); + + alloc =3D pc_alloc_init(); + vqpci =3D (QVirtQueuePCI *)qvirtqueue_setup(&qvirtio_pci, &dev->vdev= , + allo= c, 0); + + /* MSI-X is not enabled */ + addr =3D dev->addr + QVIRTIO_DEVICE_SPECIFIC_NO_MSIX; + + test_basic(&qvirtio_pci, &dev->vdev, alloc, &vqpci->vq, + (uint64_t)(uintptr_t= )addr); =20 /* End test */ guest_free(alloc, vqpci->vq.desc); + pc_alloc_uninit(alloc); qvirtio_pci_device_disable(dev); g_free(dev); + qpci_free_pc(bus); test_end(); } =20 @@ -297,9 +313,9 @@ static void pci_indirect(void) uint8_t status; char *data; =20 - bus =3D test_start(); + bus =3D pci_test_start(); =20 - dev =3D virtio_blk_init(bus, PCI_SLOT); + dev =3D virtio_blk_pci_init(bus, PCI_SLOT); =20 /* MSI-X is not enabled */ addr =3D dev->addr + QVIRTIO_DEVICE_SPECIFIC_NO_MSIX; @@ -376,8 +392,10 @@ static void pci_indirect(void) =20 /* End test */ guest_free(alloc, vqpci->vq.desc); + pc_alloc_uninit(alloc); qvirtio_pci_device_disable(dev); g_free(dev); + qpci_free_pc(bus); test_end(); } =20 @@ -389,9 +407,9 @@ static void pci_config(void) void *addr; uint64_t capacity; =20 - bus =3D test_start(); + bus =3D pci_test_start(); =20 - dev =3D virtio_blk_init(bus, PCI_SLOT); + dev =3D virtio_blk_pci_init(bus, PCI_SLOT); =20 /* MSI-X is not enabled */ addr =3D dev->addr + QVIRTIO_DEVICE_SPECIFIC_NO_MSIX; @@ -412,6 +430,7 @@ static void pci_config(void) =20 qvirtio_pci_device_disable(dev); g_free(dev); + qpci_free_pc(bus); test_end(); } =20 @@ -431,10 +450,10 @@ static void pci_msix(void) uint8_t status; char *data; =20 - bus =3D test_start(); + bus =3D pci_test_start(); alloc =3D pc_alloc_init(); =20 - dev =3D virtio_blk_init(bus, PCI_SLOT); + dev =3D virtio_blk_pci_init(bus, PCI_SLOT); qpci_msix_enable(dev->pdev); =20 qvirtio_pci_set_msix_configuration_vector(dev, alloc, 0); @@ -520,10 +539,12 @@ static void pci_msix(void) guest_free(alloc, req_addr); =20 /* End test */ - guest_free(alloc, (uint64_t)vqpci->vq.desc); + guest_free(alloc, vqpci->vq.desc); + pc_alloc_uninit(alloc); qpci_msix_disable(dev->pdev); qvirtio_pci_device_disable(dev); g_free(dev); + qpci_free_pc(bus); test_end(); } =20 @@ -542,10 +563,10 @@ static void pci_idx(void) uint8_t status; char *data; =20 - bus =3D test_start(); + bus =3D pci_test_start(); alloc =3D pc_alloc_init(); =20 - dev =3D virtio_blk_init(bus, PCI_SLOT); + dev =3D virtio_blk_pci_init(bus, PCI_SLOT); qpci_msix_enable(dev->pdev); =20 qvirtio_pci_set_msix_configuration_vector(dev, alloc, 0); @@ -643,30 +664,33 @@ static void pci_idx(void) =20 /* End test */ guest_free(alloc, vqpci->vq.desc); + pc_alloc_uninit(alloc); qpci_msix_disable(dev->pdev); qvirtio_pci_device_disable(dev); g_free(dev); + qpci_free_pc(bus); test_end(); } =20 -static void hotplug(void) +static void pci_hotplug(void) { QPCIBus *bus; QVirtioPCIDevice *dev; =20 - bus =3D test_start(); + bus =3D pci_test_start(); =20 /* plug secondary disk */ qpci_plug_device_test("virtio-blk-pci", "drv1", PCI_SLOT_HP, "'drive': 'drive1'"); =20 - dev =3D virtio_blk_init(bus, PCI_SLOT_HP); + dev =3D virtio_blk_pci_init(bus, PCI_SLOT_HP); g_assert(dev); qvirtio_pci_device_disable(dev); g_free(dev); =20 /* unplug secondary disk */ qpci_unplug_acpi_device_test("drv1", PCI_SLOT_HP); + qpci_free_pc(bus); test_end(); } =20 @@ -681,7 +705,7 @@ int main(int argc, char **argv) g_test_add_func("/virtio/blk/pci/config", pci_config); g_test_add_func("/virtio/blk/pci/msix", pci_msix); g_test_add_func("/virtio/blk/pci/idx", pci_idx); - g_test_add_func("/virtio/blk/pci/hotplug", hotplug); + g_test_add_func("/virtio/blk/pci/hotplug", pci_hotplug); =20 ret =3D g_test_run(); =20 --=20 2.1.0