From nobody Mon May 6 19:24:29 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1565812922; cv=none; d=zoho.com; s=zohoarc; b=cvSmwNd+yjcpY7BaLsJBAQzQ+vx8OMjAFVBpUwQ11Ax8cNkPZV2ZGnLiOjWwNtCub6o1O5xTySGmXh2p3OIHeFpLn5F5ebYUV+KYZH5YXPPi1HlVdY9YXyvsvIO/ATOlQJUDG19MXYgL253OGv/rXymG1dwzQGzt78SRrtYp52A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1565812922; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=HlOak8C+Q58CP8dQ0XexkqkBJFvUwZf4KV638ovdzdg=; b=TJJh4LemFATdPp+SdcDHPHor2TcmGeTRWYa2XYaoIf8bvJhWYHNhTB9xLi6/4pYhSciYWxoIYtdS+QHaCLvWaZmMBDy/6VKUD4lRkZGLLuJbPRzjUI8YNBbjAOspAo6Lm9QlhVY9mbdPXevpOoH7bYt+Gmcf2tvId4RxH34oYPw= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 156581292222551.7316478451653; Wed, 14 Aug 2019 13:02:02 -0700 (PDT) Received: from localhost ([::1]:35432 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1hxzT2-000862-KH for importer@patchew.org; Wed, 14 Aug 2019 16:01:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57761) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1hxzQm-000701-07 for qemu-devel@nongnu.org; Wed, 14 Aug 2019 15:59:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hxzQg-0007uW-MV for qemu-devel@nongnu.org; Wed, 14 Aug 2019 15:59:34 -0400 Received: from mx1.redhat.com ([209.132.183.28]:23699) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hxzQf-0007rO-5v for qemu-devel@nongnu.org; Wed, 14 Aug 2019 15:59:29 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 295A32F3677 for ; Wed, 14 Aug 2019 19:59:28 +0000 (UTC) Received: from thuth.com (ovpn-116-85.ams2.redhat.com [10.36.116.85]) by smtp.corp.redhat.com (Postfix) with ESMTP id C9D0610002B9; Wed, 14 Aug 2019 19:59:23 +0000 (UTC) From: Thomas Huth To: qemu-devel@nongnu.org Date: Wed, 14 Aug 2019 21:59:20 +0200 Message-Id: <20190814195920.32023-1-thuth@redhat.com> In-Reply-To: <04a21d67-7a8b-20bf-2d8c-56d714ebb07d@redhat.com> References: <04a21d67-7a8b-20bf-2d8c-56d714ebb07d@redhat.com> X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Wed, 14 Aug 2019 19:59:28 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2] tests/libqos: Make generic virtio code independent from global_qtest X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier , Paolo Bonzini , Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The libqos library functions should never depend on global_qtest, since these functions might be used in tests that track multiple test states. Pass around a pointer to the QTestState instead. Signed-off-by: Thomas Huth --- v2: Adjust indentations as suggested by Eric tests/libqos/virtio.c | 81 +++++++++++---------- tests/libqos/virtio.h | 30 ++++---- tests/virtio-9p-test.c | 16 +++-- tests/virtio-blk-test.c | 151 ++++++++++++++++++++------------------- tests/virtio-net-test.c | 33 +++++---- tests/virtio-scsi-test.c | 13 ++-- 6 files changed, 176 insertions(+), 148 deletions(-) diff --git a/tests/libqos/virtio.c b/tests/libqos/virtio.c index b4c01dc0c1..91ce06954b 100644 --- a/tests/libqos/virtio.c +++ b/tests/libqos/virtio.c @@ -101,7 +101,7 @@ void qvirtio_wait_queue_isr(QVirtioDevice *d, * The virtqueue interrupt must not be raised, making this useful for test= ing * event_index functionality. */ -uint8_t qvirtio_wait_status_byte_no_isr(QVirtioDevice *d, +uint8_t qvirtio_wait_status_byte_no_isr(QTestState *qts, QVirtioDevice *d, QVirtQueue *vq, uint64_t addr, gint64 timeout_us) @@ -126,7 +126,7 @@ uint8_t qvirtio_wait_status_byte_no_isr(QVirtioDevice *= d, * * This function waits for the next completed request on the used ring. */ -void qvirtio_wait_used_elem(QVirtioDevice *d, +void qvirtio_wait_used_elem(QTestState *qts, QVirtioDevice *d, QVirtQueue *vq, uint32_t desc_idx, uint32_t *len, @@ -140,7 +140,7 @@ void qvirtio_wait_used_elem(QVirtioDevice *d, clock_step(100); =20 if (d->bus->get_queue_isr_status(d, vq) && - qvirtqueue_get_buf(vq, &got_desc_idx, len)) { + qvirtqueue_get_buf(qts, vq, &got_desc_idx, len)) { g_assert_cmpint(got_desc_idx, =3D=3D, desc_idx); return; } @@ -193,8 +193,9 @@ void qvring_init(QTestState *qts, const QGuestAllocator= *alloc, QVirtQueue *vq, 0); } =20 -QVRingIndirectDesc *qvring_indirect_desc_setup(QVirtioDevice *d, - QGuestAllocator *alloc, uint16_t e= lem) +QVRingIndirectDesc *qvring_indirect_desc_setup(QTestState *qs, QVirtioDevi= ce *d, + QGuestAllocator *alloc, + uint16_t elem) { int i; QVRingIndirectDesc *indirect =3D g_malloc(sizeof(*indirect)); @@ -205,41 +206,41 @@ QVRingIndirectDesc *qvring_indirect_desc_setup(QVirti= oDevice *d, =20 for (i =3D 0; i < elem - 1; ++i) { /* indirect->desc[i].addr */ - writeq(indirect->desc + (16 * i), 0); + qtest_writeq(qs, indirect->desc + (16 * i), 0); /* indirect->desc[i].flags */ - writew(indirect->desc + (16 * i) + 12, VRING_DESC_F_NEXT); + qtest_writew(qs, indirect->desc + (16 * i) + 12, VRING_DESC_F_NEXT= ); /* indirect->desc[i].next */ - writew(indirect->desc + (16 * i) + 14, i + 1); + qtest_writew(qs, indirect->desc + (16 * i) + 14, i + 1); } =20 return indirect; } =20 -void qvring_indirect_desc_add(QVRingIndirectDesc *indirect, uint64_t data, - uint32_t len, bool wri= te) +void qvring_indirect_desc_add(QTestState *qts, QVRingIndirectDesc *indirec= t, + uint64_t data, uint32_t len, bool write) { uint16_t flags; =20 g_assert_cmpint(indirect->index, <, indirect->elem); =20 - flags =3D readw(indirect->desc + (16 * indirect->index) + 12); + flags =3D qtest_readw(qts, indirect->desc + (16 * indirect->index) + 1= 2); =20 if (write) { flags |=3D VRING_DESC_F_WRITE; } =20 /* indirect->desc[indirect->index].addr */ - writeq(indirect->desc + (16 * indirect->index), data); + qtest_writeq(qts, indirect->desc + (16 * indirect->index), data); /* indirect->desc[indirect->index].len */ - writel(indirect->desc + (16 * indirect->index) + 8, len); + qtest_writel(qts, indirect->desc + (16 * indirect->index) + 8, len); /* indirect->desc[indirect->index].flags */ - writew(indirect->desc + (16 * indirect->index) + 12, flags); + qtest_writew(qts, indirect->desc + (16 * indirect->index) + 12, flags); =20 indirect->index++; } =20 -uint32_t qvirtqueue_add(QVirtQueue *vq, uint64_t data, uint32_t len, bool = write, - bool n= ext) +uint32_t qvirtqueue_add(QTestState *qts, QVirtQueue *vq, uint64_t data, + uint32_t len, bool write, bool next) { uint16_t flags =3D 0; vq->num_free--; @@ -253,16 +254,17 @@ uint32_t qvirtqueue_add(QVirtQueue *vq, uint64_t data= , uint32_t len, bool write, } =20 /* vq->desc[vq->free_head].addr */ - writeq(vq->desc + (16 * vq->free_head), data); + qtest_writeq(qts, vq->desc + (16 * vq->free_head), data); /* vq->desc[vq->free_head].len */ - writel(vq->desc + (16 * vq->free_head) + 8, len); + qtest_writel(qts, vq->desc + (16 * vq->free_head) + 8, len); /* vq->desc[vq->free_head].flags */ - writew(vq->desc + (16 * vq->free_head) + 12, flags); + qtest_writew(qts, vq->desc + (16 * vq->free_head) + 12, flags); =20 return vq->free_head++; /* Return and increase, in this order */ } =20 -uint32_t qvirtqueue_add_indirect(QVirtQueue *vq, QVRingIndirectDesc *indir= ect) +uint32_t qvirtqueue_add_indirect(QTestState *qts, QVirtQueue *vq, + QVRingIndirectDesc *indirect) { g_assert(vq->indirect); g_assert_cmpint(vq->size, >=3D, indirect->elem); @@ -271,34 +273,36 @@ uint32_t qvirtqueue_add_indirect(QVirtQueue *vq, QVRi= ngIndirectDesc *indirect) vq->num_free--; =20 /* vq->desc[vq->free_head].addr */ - writeq(vq->desc + (16 * vq->free_head), indirect->desc); + qtest_writeq(qts, vq->desc + (16 * vq->free_head), indirect->desc); /* vq->desc[vq->free_head].len */ - writel(vq->desc + (16 * vq->free_head) + 8, + qtest_writel(qts, vq->desc + (16 * vq->free_head) + 8, sizeof(struct vring_desc) * indirect->elem); /* vq->desc[vq->free_head].flags */ - writew(vq->desc + (16 * vq->free_head) + 12, VRING_DESC_F_INDIRECT); + qtest_writew(qts, vq->desc + (16 * vq->free_head) + 12, + VRING_DESC_F_INDIRECT); =20 return vq->free_head++; /* Return and increase, in this order */ } =20 -void qvirtqueue_kick(QVirtioDevice *d, QVirtQueue *vq, uint32_t free_head) +void qvirtqueue_kick(QTestState *qts, QVirtioDevice *d, QVirtQueue *vq, + uint32_t free_head) { /* vq->avail->idx */ - uint16_t idx =3D readw(vq->avail + 2); + uint16_t idx =3D qtest_readw(qts, vq->avail + 2); /* vq->used->flags */ uint16_t flags; /* vq->used->avail_event */ uint16_t avail_event; =20 /* vq->avail->ring[idx % vq->size] */ - writew(vq->avail + 4 + (2 * (idx % vq->size)), free_head); + qtest_writew(qts, vq->avail + 4 + (2 * (idx % vq->size)), free_head); /* vq->avail->idx */ - writew(vq->avail + 2, idx + 1); + qtest_writew(qts, vq->avail + 2, idx + 1); =20 /* Must read after idx is updated */ - flags =3D readw(vq->avail); - avail_event =3D readw(vq->used + 4 + - sizeof(struct vring_used_elem) * vq->size); + flags =3D qtest_readw(qts, vq->avail); + avail_event =3D qtest_readw(qts, vq->used + 4 + + sizeof(struct vring_used_elem) * vq->si= ze); =20 /* < 1 because we add elements to avail queue one by one */ if ((flags & VRING_USED_F_NO_NOTIFY) =3D=3D 0 && @@ -317,12 +321,13 @@ void qvirtqueue_kick(QVirtioDevice *d, QVirtQueue *vq= , uint32_t free_head) * * Returns: true if an element was ready, false otherwise */ -bool qvirtqueue_get_buf(QVirtQueue *vq, uint32_t *desc_idx, uint32_t *len) +bool qvirtqueue_get_buf(QTestState *qts, QVirtQueue *vq, uint32_t *desc_id= x, + uint32_t *len) { uint16_t idx; - uint64_t elem_addr; + uint64_t elem_addr, addr; =20 - idx =3D readw(vq->used + offsetof(struct vring_used, idx)); + idx =3D qtest_readw(qts, vq->used + offsetof(struct vring_used, idx)); if (idx =3D=3D vq->last_used_idx) { return false; } @@ -333,23 +338,25 @@ bool qvirtqueue_get_buf(QVirtQueue *vq, uint32_t *des= c_idx, uint32_t *len) sizeof(struct vring_used_elem); =20 if (desc_idx) { - *desc_idx =3D readl(elem_addr + offsetof(struct vring_used_elem, i= d)); + addr =3D elem_addr + offsetof(struct vring_used_elem, id); + *desc_idx =3D qtest_readl(qts, addr); } =20 if (len) { - *len =3D readw(elem_addr + offsetof(struct vring_used_elem, len)); + addr =3D elem_addr + offsetof(struct vring_used_elem, len); + *len =3D qtest_readw(qts, addr); } =20 vq->last_used_idx++; return true; } =20 -void qvirtqueue_set_used_event(QVirtQueue *vq, uint16_t idx) +void qvirtqueue_set_used_event(QTestState *qts, QVirtQueue *vq, uint16_t i= dx) { g_assert(vq->event); =20 /* vq->avail->used_event */ - writew(vq->avail + 4 + (2 * vq->size), idx); + qtest_writew(qts, vq->avail + 4 + (2 * vq->size), idx); } =20 void qvirtio_start_device(QVirtioDevice *vdev) diff --git a/tests/libqos/virtio.h b/tests/libqos/virtio.h index 7b97f5e567..037176dbd8 100644 --- a/tests/libqos/virtio.h +++ b/tests/libqos/virtio.h @@ -114,11 +114,11 @@ void qvirtio_set_driver_ok(QVirtioDevice *d); =20 void qvirtio_wait_queue_isr(QVirtioDevice *d, QVirtQueue *vq, gint64 timeout_us); -uint8_t qvirtio_wait_status_byte_no_isr(QVirtioDevice *d, +uint8_t qvirtio_wait_status_byte_no_isr(QTestState *qts, QVirtioDevice *d, QVirtQueue *vq, uint64_t addr, gint64 timeout_us); -void qvirtio_wait_used_elem(QVirtioDevice *d, +void qvirtio_wait_used_elem(QTestState *qts, QVirtioDevice *d, QVirtQueue *vq, uint32_t desc_idx, uint32_t *len, @@ -131,17 +131,21 @@ void qvirtqueue_cleanup(const QVirtioBus *bus, QVirtQ= ueue *vq, =20 void qvring_init(QTestState *qts, const QGuestAllocator *alloc, QVirtQueue= *vq, uint64_t addr); -QVRingIndirectDesc *qvring_indirect_desc_setup(QVirtioDevice *d, - QGuestAllocator *alloc, uint16_t e= lem); -void qvring_indirect_desc_add(QVRingIndirectDesc *indirect, uint64_t data, - uint32_t len, bool wri= te); -uint32_t qvirtqueue_add(QVirtQueue *vq, uint64_t data, uint32_t len, bool = write, - bool n= ext); -uint32_t qvirtqueue_add_indirect(QVirtQueue *vq, QVRingIndirectDesc *indir= ect); -void qvirtqueue_kick(QVirtioDevice *d, QVirtQueue *vq, uint32_t free_head); -bool qvirtqueue_get_buf(QVirtQueue *vq, uint32_t *desc_idx, uint32_t *len); - -void qvirtqueue_set_used_event(QVirtQueue *vq, uint16_t idx); +QVRingIndirectDesc *qvring_indirect_desc_setup(QTestState *qs, QVirtioDevi= ce *d, + QGuestAllocator *alloc, + uint16_t elem); +void qvring_indirect_desc_add(QTestState *qts, QVRingIndirectDesc *indirec= t, + uint64_t data, uint32_t len, bool write); +uint32_t qvirtqueue_add(QTestState *qts, QVirtQueue *vq, uint64_t data, + uint32_t len, bool write, bool next); +uint32_t qvirtqueue_add_indirect(QTestState *qts, QVirtQueue *vq, + QVRingIndirectDesc *indirect); +void qvirtqueue_kick(QTestState *qts, QVirtioDevice *d, QVirtQueue *vq, + uint32_t free_head); +bool qvirtqueue_get_buf(QTestState *qts, QVirtQueue *vq, uint32_t *desc_id= x, + uint32_t *len); + +void qvirtqueue_set_used_event(QTestState *qts, QVirtQueue *vq, uint16_t i= dx); =20 void qvirtio_start_device(QVirtioDevice *vdev); =20 diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c index ac49bca991..30e6cf3e63 100644 --- a/tests/virtio-9p-test.c +++ b/tests/virtio-9p-test.c @@ -39,6 +39,7 @@ static void pci_config(void *obj, void *data, QGuestAlloc= ator *t_alloc) #define P9_MAX_SIZE 4096 /* Max size of a T-message or R-message */ =20 typedef struct { + QTestState *qts; QVirtio9P *v9p; uint16_t tag; uint64_t t_msg; @@ -52,7 +53,7 @@ typedef struct { =20 static void v9fs_memwrite(P9Req *req, const void *addr, size_t len) { - memwrite(req->t_msg + req->t_off, addr, len); + qtest_memwrite(req->qts, req->t_msg + req->t_off, addr, len); req->t_off +=3D len; } =20 @@ -63,7 +64,7 @@ static void v9fs_memskip(P9Req *req, size_t len) =20 static void v9fs_memread(P9Req *req, void *addr, size_t len) { - memread(req->r_msg + req->r_off, addr, len); + qtest_memread(req->qts, req->r_msg + req->r_off, addr, len); req->r_off +=3D len; } =20 @@ -158,6 +159,7 @@ static P9Req *v9fs_req_init(QVirtio9P *v9p, uint32_t si= ze, uint8_t id, =20 g_assert_cmpint(total_size, <=3D, P9_MAX_SIZE); =20 + req->qts =3D global_qtest; req->v9p =3D v9p; req->t_size =3D total_size; req->t_msg =3D guest_alloc(alloc, req->t_size); @@ -171,10 +173,10 @@ static void v9fs_req_send(P9Req *req) QVirtio9P *v9p =3D req->v9p; =20 req->r_msg =3D guest_alloc(alloc, P9_MAX_SIZE); - req->free_head =3D qvirtqueue_add(v9p->vq, req->t_msg, req->t_size, fa= lse, - true); - qvirtqueue_add(v9p->vq, req->r_msg, P9_MAX_SIZE, true, false); - qvirtqueue_kick(v9p->vdev, v9p->vq, req->free_head); + req->free_head =3D qvirtqueue_add(req->qts, v9p->vq, req->t_msg, req->= t_size, + false, true); + qvirtqueue_add(req->qts, v9p->vq, req->r_msg, P9_MAX_SIZE, true, false= ); + qvirtqueue_kick(req->qts, v9p->vdev, v9p->vq, req->free_head); req->t_off =3D 0; } =20 @@ -195,7 +197,7 @@ static void v9fs_req_wait_for_reply(P9Req *req, uint32_= t *len) { QVirtio9P *v9p =3D req->v9p; =20 - qvirtio_wait_used_elem(v9p->vdev, v9p->vq, req->free_head, len, + qvirtio_wait_used_elem(req->qts, v9p->vdev, v9p->vq, req->free_head, l= en, QVIRTIO_9P_TIMEOUT_US); } =20 diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index 1b02714bc7..ff365c8035 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -123,6 +123,7 @@ static void test_basic(QVirtioDevice *dev, QGuestAlloca= tor *alloc, uint32_t free_head; uint8_t status; char *data; + QTestState *qts =3D global_qtest; =20 capacity =3D qvirtio_config_readq(dev, 0); =20 @@ -149,13 +150,14 @@ static void test_basic(QVirtioDevice *dev, QGuestAllo= cator *alloc, =20 g_free(req.data); =20 - 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); + free_head =3D qvirtqueue_add(qts, vq, req_addr, 16, false, true); + qvirtqueue_add(qts, vq, req_addr + 16, 512, false, true); + qvirtqueue_add(qts, vq, req_addr + 528, 1, true, false); =20 - qvirtqueue_kick(dev, vq, free_head); + qvirtqueue_kick(qts, dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_U= S); + qvirtio_wait_used_elem(qts, dev, vq, free_head, NULL, + QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); =20 @@ -171,13 +173,14 @@ static void test_basic(QVirtioDevice *dev, QGuestAllo= cator *alloc, =20 g_free(req.data); =20 - 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); + free_head =3D qvirtqueue_add(qts, vq, req_addr, 16, false, true); + qvirtqueue_add(qts, vq, req_addr + 16, 512, true, true); + qvirtqueue_add(qts, vq, req_addr + 528, 1, true, false); =20 - qvirtqueue_kick(dev, vq, free_head); + qvirtqueue_kick(qts, dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_U= S); + qvirtio_wait_used_elem(qts, dev, vq, free_head, NULL, + QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); =20 @@ -206,13 +209,14 @@ static void test_basic(QVirtioDevice *dev, QGuestAllo= cator *alloc, =20 req_addr =3D virtio_blk_request(alloc, dev, &req, sizeof(dwz_hdr)); =20 - free_head =3D qvirtqueue_add(vq, req_addr, 16, false, true); - qvirtqueue_add(vq, req_addr + 16, sizeof(dwz_hdr), false, true); - qvirtqueue_add(vq, req_addr + 16 + sizeof(dwz_hdr), 1, true, false= ); + free_head =3D qvirtqueue_add(qts, vq, req_addr, 16, false, true); + qvirtqueue_add(qts, vq, req_addr + 16, sizeof(dwz_hdr), false, tru= e); + qvirtqueue_add(qts, vq, req_addr + 16 + sizeof(dwz_hdr), 1, true, + false); =20 - qvirtqueue_kick(dev, vq, free_head); + qvirtqueue_kick(qts, dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, NULL, + qvirtio_wait_used_elem(qts, dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 16 + sizeof(dwz_hdr)); g_assert_cmpint(status, =3D=3D, 0); @@ -229,13 +233,13 @@ static void test_basic(QVirtioDevice *dev, QGuestAllo= cator *alloc, =20 g_free(req.data); =20 - 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); + free_head =3D qvirtqueue_add(qts, vq, req_addr, 16, false, true); + qvirtqueue_add(qts, vq, req_addr + 16, 512, true, true); + qvirtqueue_add(qts, vq, req_addr + 528, 1, true, false); =20 - qvirtqueue_kick(dev, vq, free_head); + qvirtqueue_kick(qts, dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, NULL, + qvirtio_wait_used_elem(qts, dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); @@ -263,13 +267,13 @@ static void test_basic(QVirtioDevice *dev, QGuestAllo= cator *alloc, =20 req_addr =3D virtio_blk_request(alloc, dev, &req, sizeof(dwz_hdr)); =20 - free_head =3D qvirtqueue_add(vq, req_addr, 16, false, true); - qvirtqueue_add(vq, req_addr + 16, sizeof(dwz_hdr), false, true); - qvirtqueue_add(vq, req_addr + 16 + sizeof(dwz_hdr), 1, true, false= ); + free_head =3D qvirtqueue_add(qts, vq, req_addr, 16, false, true); + qvirtqueue_add(qts, vq, req_addr + 16, sizeof(dwz_hdr), false, tru= e); + qvirtqueue_add(qts, vq, req_addr + 16 + sizeof(dwz_hdr), 1, true, = false); =20 - qvirtqueue_kick(dev, vq, free_head); + qvirtqueue_kick(qts, dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, NULL, + qvirtio_wait_used_elem(qts, dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 16 + sizeof(dwz_hdr)); g_assert_cmpint(status, =3D=3D, 0); @@ -290,11 +294,11 @@ static void test_basic(QVirtioDevice *dev, QGuestAllo= cator *alloc, =20 g_free(req.data); =20 - free_head =3D qvirtqueue_add(vq, req_addr, 528, false, true); - qvirtqueue_add(vq, req_addr + 528, 1, true, false); - qvirtqueue_kick(dev, vq, free_head); + free_head =3D qvirtqueue_add(qts, vq, req_addr, 528, false, true); + qvirtqueue_add(qts, vq, req_addr + 528, 1, true, false); + qvirtqueue_kick(qts, dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, NULL, + qvirtio_wait_used_elem(qts, dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); @@ -311,12 +315,12 @@ static void test_basic(QVirtioDevice *dev, QGuestAllo= cator *alloc, =20 g_free(req.data); =20 - free_head =3D qvirtqueue_add(vq, req_addr, 16, false, true); - qvirtqueue_add(vq, req_addr + 16, 513, true, false); + free_head =3D qvirtqueue_add(qts, vq, req_addr, 16, false, true); + qvirtqueue_add(qts, vq, req_addr + 16, 513, true, false); =20 - qvirtqueue_kick(dev, vq, free_head); + qvirtqueue_kick(qts, dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, NULL, + qvirtio_wait_used_elem(qts, dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); @@ -353,6 +357,7 @@ static void indirect(void *obj, void *u_data, QGuestAll= ocator *t_alloc) uint32_t free_head; uint8_t status; char *data; + QTestState *qts =3D global_qtest; =20 capacity =3D qvirtio_config_readq(dev, 0); g_assert_cmpint(capacity, =3D=3D, TEST_IMAGE_SIZE / 512); @@ -378,13 +383,13 @@ static void indirect(void *obj, void *u_data, QGuestA= llocator *t_alloc) =20 g_free(req.data); =20 - indirect =3D qvring_indirect_desc_setup(dev, t_alloc, 2); - qvring_indirect_desc_add(indirect, req_addr, 528, false); - qvring_indirect_desc_add(indirect, req_addr + 528, 1, true); - free_head =3D qvirtqueue_add_indirect(vq, indirect); - qvirtqueue_kick(dev, vq, free_head); + indirect =3D qvring_indirect_desc_setup(qts, dev, t_alloc, 2); + qvring_indirect_desc_add(qts, indirect, req_addr, 528, false); + qvring_indirect_desc_add(qts, indirect, req_addr + 528, 1, true); + free_head =3D qvirtqueue_add_indirect(qts, vq, indirect); + qvirtqueue_kick(qts, dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, NULL, + qvirtio_wait_used_elem(qts, dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); @@ -403,13 +408,13 @@ static void indirect(void *obj, void *u_data, QGuestA= llocator *t_alloc) =20 g_free(req.data); =20 - indirect =3D qvring_indirect_desc_setup(dev, t_alloc, 2); - qvring_indirect_desc_add(indirect, req_addr, 16, false); - qvring_indirect_desc_add(indirect, req_addr + 16, 513, true); - free_head =3D qvirtqueue_add_indirect(vq, indirect); - qvirtqueue_kick(dev, vq, free_head); + indirect =3D qvring_indirect_desc_setup(qts, dev, t_alloc, 2); + qvring_indirect_desc_add(qts, indirect, req_addr, 16, false); + qvring_indirect_desc_add(qts, indirect, req_addr + 16, 513, true); + free_head =3D qvirtqueue_add_indirect(qts, vq, indirect); + qvirtqueue_kick(qts, dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, NULL, + qvirtio_wait_used_elem(qts, dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); @@ -461,6 +466,7 @@ static void msix(void *obj, void *u_data, QGuestAllocat= or *t_alloc) char *data; QOSGraphObject *blk_object =3D obj; QPCIDevice *pci_dev =3D blk_object->get_driver(blk_object, "pci-device= "); + QTestState *qts =3D global_qtest; =20 if (qpci_check_buggy_msi(pci_dev)) { return; @@ -504,12 +510,12 @@ static void msix(void *obj, void *u_data, QGuestAlloc= ator *t_alloc) =20 g_free(req.data); =20 - 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); - qvirtqueue_kick(dev, vq, free_head); + free_head =3D qvirtqueue_add(qts, vq, req_addr, 16, false, true); + qvirtqueue_add(qts, vq, req_addr + 16, 512, false, true); + qvirtqueue_add(qts, vq, req_addr + 528, 1, true, false); + qvirtqueue_kick(qts, dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, NULL, + qvirtio_wait_used_elem(qts, dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US); =20 status =3D readb(req_addr + 528); @@ -527,14 +533,14 @@ static void msix(void *obj, void *u_data, QGuestAlloc= ator *t_alloc) =20 g_free(req.data); =20 - 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); + free_head =3D qvirtqueue_add(qts, vq, req_addr, 16, false, true); + qvirtqueue_add(qts, vq, req_addr + 16, 512, true, true); + qvirtqueue_add(qts, vq, req_addr + 528, 1, true, false); =20 - qvirtqueue_kick(dev, vq, free_head); + qvirtqueue_kick(qts, dev, vq, free_head); =20 =20 - qvirtio_wait_used_elem(dev, vq, free_head, NULL, + qvirtio_wait_used_elem(qts, dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US); =20 status =3D readb(req_addr + 528); @@ -569,6 +575,7 @@ static void idx(void *obj, void *u_data, QGuestAllocato= r *t_alloc) char *data; QOSGraphObject *blk_object =3D obj; QPCIDevice *pci_dev =3D blk_object->get_driver(blk_object, "pci-device= "); + QTestState *qts =3D global_qtest; =20 if (qpci_check_buggy_msi(pci_dev)) { return; @@ -603,12 +610,12 @@ static void idx(void *obj, void *u_data, QGuestAlloca= tor *t_alloc) =20 g_free(req.data); =20 - 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); - qvirtqueue_kick(dev, vq, free_head); + free_head =3D qvirtqueue_add(qts, vq, req_addr, 16, false, true); + qvirtqueue_add(qts, vq, req_addr + 16, 512, false, true); + qvirtqueue_add(qts, vq, req_addr + 528, 1, true, false); + qvirtqueue_kick(qts, dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, NULL, + qvirtio_wait_used_elem(qts, dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US); =20 /* Write request */ @@ -623,15 +630,15 @@ static void idx(void *obj, void *u_data, QGuestAlloca= tor *t_alloc) g_free(req.data); =20 /* Notify after processing the third request */ - qvirtqueue_set_used_event(vq, 2); - 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); - qvirtqueue_kick(dev, vq, free_head); + qvirtqueue_set_used_event(qts, vq, 2); + free_head =3D qvirtqueue_add(qts, vq, req_addr, 16, false, true); + qvirtqueue_add(qts, vq, req_addr + 16, 512, false, true); + qvirtqueue_add(qts, vq, req_addr + 528, 1, true, false); + qvirtqueue_kick(qts, dev, vq, free_head); write_head =3D free_head; =20 /* No notification expected */ - status =3D qvirtio_wait_status_byte_no_isr(dev, + status =3D qvirtio_wait_status_byte_no_isr(qts, dev, vq, req_addr + 528, QVIRTIO_BLK_TIMEOUT_US); g_assert_cmpint(status, =3D=3D, 0); @@ -648,16 +655,16 @@ static void idx(void *obj, void *u_data, QGuestAlloca= tor *t_alloc) =20 g_free(req.data); =20 - 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); + free_head =3D qvirtqueue_add(qts, vq, req_addr, 16, false, true); + qvirtqueue_add(qts, vq, req_addr + 16, 512, true, true); + qvirtqueue_add(qts, vq, req_addr + 528, 1, true, false); =20 - qvirtqueue_kick(dev, vq, free_head); + qvirtqueue_kick(qts, dev, vq, free_head); =20 /* We get just one notification for both requests */ - qvirtio_wait_used_elem(dev, vq, write_head, NULL, + qvirtio_wait_used_elem(qts, dev, vq, write_head, NULL, QVIRTIO_BLK_TIMEOUT_US); - g_assert(qvirtqueue_get_buf(vq, &desc_idx, NULL)); + g_assert(qvirtqueue_get_buf(qts, vq, &desc_idx, NULL)); g_assert_cmpint(desc_idx, =3D=3D, free_head); =20 status =3D readb(req_addr + 528); diff --git a/tests/virtio-net-test.c b/tests/virtio-net-test.c index 7aa9622f30..1071dd82c9 100644 --- a/tests/virtio-net-test.c +++ b/tests/virtio-net-test.c @@ -33,6 +33,7 @@ static void rx_test(QVirtioDevice *dev, QGuestAllocator *alloc, QVirtQueue *vq, int socket) { + QTestState *qts =3D global_qtest; uint64_t req_addr; uint32_t free_head; char test[] =3D "TEST"; @@ -51,13 +52,14 @@ static void rx_test(QVirtioDevice *dev, =20 req_addr =3D guest_alloc(alloc, 64); =20 - free_head =3D qvirtqueue_add(vq, req_addr, 64, true, false); - qvirtqueue_kick(dev, vq, free_head); + free_head =3D qvirtqueue_add(qts, vq, req_addr, 64, true, false); + qvirtqueue_kick(qts, dev, vq, free_head); =20 ret =3D iov_send(socket, iov, 2, 0, sizeof(len) + sizeof(test)); g_assert_cmpint(ret, =3D=3D, sizeof(test) + sizeof(len)); =20 - qvirtio_wait_used_elem(dev, vq, free_head, NULL, QVIRTIO_NET_TIMEOUT_U= S); + qvirtio_wait_used_elem(qts, dev, vq, free_head, NULL, + QVIRTIO_NET_TIMEOUT_US); memread(req_addr + VNET_HDR_SIZE, buffer, sizeof(test)); g_assert_cmpstr(buffer, =3D=3D, "TEST"); =20 @@ -68,6 +70,7 @@ static void tx_test(QVirtioDevice *dev, QGuestAllocator *alloc, QVirtQueue *vq, int socket) { + QTestState *qts =3D global_qtest; uint64_t req_addr; uint32_t free_head; uint32_t len; @@ -77,10 +80,11 @@ static void tx_test(QVirtioDevice *dev, req_addr =3D guest_alloc(alloc, 64); memwrite(req_addr + VNET_HDR_SIZE, "TEST", 4); =20 - free_head =3D qvirtqueue_add(vq, req_addr, 64, false, false); - qvirtqueue_kick(dev, vq, free_head); + free_head =3D qvirtqueue_add(qts, vq, req_addr, 64, false, false); + qvirtqueue_kick(qts, dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, NULL, QVIRTIO_NET_TIMEOUT_U= S); + qvirtio_wait_used_elem(qts, dev, vq, free_head, NULL, + QVIRTIO_NET_TIMEOUT_US); guest_free(alloc, req_addr); =20 ret =3D qemu_recv(socket, &len, sizeof(len), 0); @@ -95,6 +99,7 @@ static void rx_stop_cont_test(QVirtioDevice *dev, QGuestAllocator *alloc, QVirtQueue *vq, int socket) { + QTestState *qts =3D global_qtest; uint64_t req_addr; uint32_t free_head; char test[] =3D "TEST"; @@ -114,8 +119,8 @@ static void rx_stop_cont_test(QVirtioDevice *dev, =20 req_addr =3D guest_alloc(alloc, 64); =20 - free_head =3D qvirtqueue_add(vq, req_addr, 64, true, false); - qvirtqueue_kick(dev, vq, free_head); + free_head =3D qvirtqueue_add(qts, vq, req_addr, 64, true, false); + qvirtqueue_kick(qts, dev, vq, free_head); =20 rsp =3D qmp("{ 'execute' : 'stop'}"); qobject_unref(rsp); @@ -131,7 +136,8 @@ static void rx_stop_cont_test(QVirtioDevice *dev, rsp =3D qmp("{ 'execute' : 'cont'}"); qobject_unref(rsp); =20 - qvirtio_wait_used_elem(dev, vq, free_head, NULL, QVIRTIO_NET_TIMEOUT_U= S); + qvirtio_wait_used_elem(qts, dev, vq, free_head, NULL, + QVIRTIO_NET_TIMEOUT_US); memread(req_addr + VNET_HDR_SIZE, buffer, sizeof(test)); g_assert_cmpstr(buffer, =3D=3D, "TEST"); =20 @@ -283,19 +289,20 @@ static void large_tx(void *obj, void *data, QGuestAll= ocator *t_alloc) uint64_t req_addr; uint32_t free_head; size_t alloc_size =3D (size_t)data / 64; + QTestState *qts =3D global_qtest; int i; =20 /* Bypass the limitation by pointing several descriptors to a single * smaller area */ req_addr =3D guest_alloc(t_alloc, alloc_size); - free_head =3D qvirtqueue_add(vq, req_addr, alloc_size, false, true); + free_head =3D qvirtqueue_add(qts, vq, req_addr, alloc_size, false, tru= e); =20 for (i =3D 0; i < 64; i++) { - qvirtqueue_add(vq, req_addr, alloc_size, false, i !=3D 63); + qvirtqueue_add(qts, vq, req_addr, alloc_size, false, i !=3D 63); } - qvirtqueue_kick(dev->vdev, vq, free_head); + qvirtqueue_kick(qts, dev->vdev, vq, free_head); =20 - qvirtio_wait_used_elem(dev->vdev, vq, free_head, NULL, + qvirtio_wait_used_elem(qts, dev->vdev, vq, free_head, NULL, QVIRTIO_NET_TIMEOUT_US); guest_free(t_alloc, req_addr); } diff --git a/tests/virtio-scsi-test.c b/tests/virtio-scsi-test.c index 1ad9f75d74..6f8b310cf8 100644 --- a/tests/virtio-scsi-test.c +++ b/tests/virtio-scsi-test.c @@ -72,6 +72,7 @@ static uint8_t virtio_scsi_do_command(QVirtioSCSIQueues *= vs, uint64_t req_addr, resp_addr, data_in_addr =3D 0, data_out_addr =3D 0; uint8_t response; uint32_t free_head; + QTestState *qts =3D global_qtest; =20 vq =3D vs->vq[2]; =20 @@ -83,24 +84,24 @@ static uint8_t virtio_scsi_do_command(QVirtioSCSIQueues= *vs, =20 /* Add request header */ req_addr =3D qvirtio_scsi_alloc(vs, sizeof(req), &req); - free_head =3D qvirtqueue_add(vq, req_addr, sizeof(req), false, true); + free_head =3D qvirtqueue_add(qts, vq, req_addr, sizeof(req), false, tr= ue); =20 if (data_out_len) { data_out_addr =3D qvirtio_scsi_alloc(vs, data_out_len, data_out); - qvirtqueue_add(vq, data_out_addr, data_out_len, false, true); + qvirtqueue_add(qts, vq, data_out_addr, data_out_len, false, true); } =20 /* Add response header */ resp_addr =3D qvirtio_scsi_alloc(vs, sizeof(resp), &resp); - qvirtqueue_add(vq, resp_addr, sizeof(resp), true, !!data_in_len); + qvirtqueue_add(qts, vq, resp_addr, sizeof(resp), true, !!data_in_len); =20 if (data_in_len) { data_in_addr =3D qvirtio_scsi_alloc(vs, data_in_len, data_in); - qvirtqueue_add(vq, data_in_addr, data_in_len, true, false); + qvirtqueue_add(qts, vq, data_in_addr, data_in_len, true, false); } =20 - qvirtqueue_kick(vs->dev, vq, free_head); - qvirtio_wait_used_elem(vs->dev, vq, free_head, NULL, + qvirtqueue_kick(qts, vs->dev, vq, free_head); + qvirtio_wait_used_elem(qts, vs->dev, vq, free_head, NULL, QVIRTIO_SCSI_TIMEOUT_US); =20 response =3D readb(resp_addr + --=20 2.18.1