From nobody Tue Apr 30 00:52:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516750979249312.54572689072734; Tue, 23 Jan 2018 15:42:59 -0800 (PST) Received: from localhost ([::1]:33626 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee8DL-0003sh-7C for importer@patchew.org; Tue, 23 Jan 2018 18:42:51 -0500 Received: from eggs.gnu.org ([208.118.235.92]:60798) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee89Y-0001As-P8 for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ee89U-0005qr-QK for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:38:56 -0500 Received: from 4.mo68.mail-out.ovh.net ([46.105.59.63]:48291) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ee89U-0005oK-FP for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:38:52 -0500 Received: from player698.ha.ovh.net (b7.ovh.net [213.186.33.57]) by mo68.mail-out.ovh.net (Postfix) with ESMTP id C4EFCB82C4 for ; Wed, 24 Jan 2018 00:38:50 +0100 (CET) Received: from bahia.lan (lns-bzn-46-82-253-208-248.adsl.proxad.net [82.253.208.248]) (Authenticated sender: groug@kaod.org) by player698.ha.ovh.net (Postfix) with ESMTPA id 767E0520078; Wed, 24 Jan 2018 00:38:46 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Wed, 24 Jan 2018 00:38:46 +0100 Message-ID: <151675072637.29381.16931412055210340789.stgit@bahia.lan> In-Reply-To: <151675071042.29381.16225631028845063799.stgit@bahia.lan> References: <151675071042.29381.16225631028845063799.stgit@bahia.lan> User-Agent: StGit/0.17.1-46-g6855-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Ovh-Tracer-Id: 14378304763957713358 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedtvddrudehgddugecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 46.105.59.63 Subject: [Qemu-devel] [PATCH 1/7] tests: virtio-9p: move request tag to the test functions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Jason Wang , Fam Zheng , Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 It doesn't really makes sense to hide the request tag from the test functions. It prevents to test the 9p server behavior when passed a wrong tag (ie, still in use or different from P9_NOTAG for a version request). Also the spec says that a tag is reusable as soon as the corresponding request was replied or flushed: no need to always increment tags like we do now. And finaly, an upcoming test of the flush command will need to manipulate tags explicitely. This simply changes all request functions to have a tag argument. Except for the version request which needs P9_NOTAG, all other tests can pass 0 since they wait for the reply before sending another request. Signed-off-by: Greg Kurz Reviewed-by: Stefan Hajnoczi --- tests/virtio-9p-test.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c index 00f00f7246e9..5ada2839b9ae 100644 --- a/tests/virtio-9p-test.c +++ b/tests/virtio-9p-test.c @@ -27,7 +27,6 @@ typedef struct { QOSState *qs; QVirtQueue *vq; char *test_share; - uint16_t p9_req_tag; } QVirtIO9P; =20 static QVirtIO9P *qvirtio_9p_start(const char *driver) @@ -294,10 +293,11 @@ static void v9fs_rlerror(P9Req *req, uint32_t *err) } =20 /* size[4] Tversion tag[2] msize[4] version[s] */ -static P9Req *v9fs_tversion(QVirtIO9P *v9p, uint32_t msize, const char *ve= rsion) +static P9Req *v9fs_tversion(QVirtIO9P *v9p, uint32_t msize, const char *ve= rsion, + uint16_t tag) { P9Req *req =3D v9fs_req_init(v9p, 4 + v9fs_string_size(version), P9_TV= ERSION, - P9_NOTAG); + tag); =20 v9fs_uint32_write(req, msize); v9fs_string_write(req, version); @@ -323,12 +323,12 @@ static void v9fs_rversion(P9Req *req, uint16_t *len, = char **version) } =20 /* size[4] Tattach tag[2] fid[4] afid[4] uname[s] aname[s] n_uname[4] */ -static P9Req *v9fs_tattach(QVirtIO9P *v9p, uint32_t fid, uint32_t n_uname) +static P9Req *v9fs_tattach(QVirtIO9P *v9p, uint32_t fid, uint32_t n_uname, + uint16_t tag) { const char *uname =3D ""; /* ignored by QEMU */ const char *aname =3D ""; /* ignored by QEMU */ - P9Req *req =3D v9fs_req_init(v9p, 4 + 4 + 2 + 2 + 4, P9_TATTACH, - ++(v9p->p9_req_tag)); + P9Req *req =3D v9fs_req_init(v9p, 4 + 4 + 2 + 2 + 4, P9_TATTACH, tag); =20 v9fs_uint32_write(req, fid); v9fs_uint32_write(req, P9_NOFID); @@ -353,7 +353,7 @@ static void v9fs_rattach(P9Req *req, v9fs_qid *qid) =20 /* size[4] Twalk tag[2] fid[4] newfid[4] nwname[2] nwname*(wname[s]) */ static P9Req *v9fs_twalk(QVirtIO9P *v9p, uint32_t fid, uint32_t newfid, - uint16_t nwname, char *const wnames[]) + uint16_t nwname, char *const wnames[], uint16_t t= ag) { P9Req *req; int i; @@ -362,7 +362,7 @@ static P9Req *v9fs_twalk(QVirtIO9P *v9p, uint32_t fid, = uint32_t newfid, for (i =3D 0; i < nwname; i++) { size +=3D v9fs_string_size(wnames[i]); } - req =3D v9fs_req_init(v9p, size, P9_TWALK, ++(v9p->p9_req_tag)); + req =3D v9fs_req_init(v9p, size, P9_TWALK, tag); v9fs_uint32_write(req, fid); v9fs_uint32_write(req, newfid); v9fs_uint16_write(req, nwname); @@ -397,7 +397,7 @@ static void fs_version(QVirtIO9P *v9p) char *server_version; P9Req *req; =20 - req =3D v9fs_tversion(v9p, P9_MAX_SIZE, version); + req =3D v9fs_tversion(v9p, P9_MAX_SIZE, version, P9_NOTAG); v9fs_rversion(req, &server_len, &server_version); =20 g_assert_cmpmem(server_version, server_len, version, strlen(version)); @@ -410,7 +410,7 @@ static void fs_attach(QVirtIO9P *v9p) P9Req *req; =20 fs_version(v9p); - req =3D v9fs_tattach(v9p, 0, getuid()); + req =3D v9fs_tattach(v9p, 0, getuid(), 0); v9fs_rattach(req, NULL); } =20 @@ -430,7 +430,7 @@ static void fs_walk(QVirtIO9P *v9p) } =20 fs_attach(v9p); - req =3D v9fs_twalk(v9p, 0, 1, P9_MAXWELEM, wnames); + req =3D v9fs_twalk(v9p, 0, 1, P9_MAXWELEM, wnames, 0); v9fs_rwalk(req, &nwqid, &wqid); =20 g_assert_cmpint(nwqid, =3D=3D, P9_MAXWELEM); @@ -451,7 +451,7 @@ static void fs_walk_no_slash(QVirtIO9P *v9p) uint32_t err; =20 fs_attach(v9p); - req =3D v9fs_twalk(v9p, 0, 1, 1, wnames); + req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); v9fs_rlerror(req, &err); =20 g_assert_cmpint(err, =3D=3D, ENOENT); @@ -466,10 +466,10 @@ static void fs_walk_dotdot(QVirtIO9P *v9p) P9Req *req; =20 fs_version(v9p); - req =3D v9fs_tattach(v9p, 0, getuid()); + req =3D v9fs_tattach(v9p, 0, getuid(), 0); v9fs_rattach(req, &root_qid); =20 - req =3D v9fs_twalk(v9p, 0, 1, 1, wnames); + req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); v9fs_rwalk(req, NULL, &wqid); /* We now we'll get one qid */ =20 g_assert_cmpmem(&root_qid, 13, wqid[0], 13); From nobody Tue Apr 30 00:52:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516750859403535.6839218348433; Tue, 23 Jan 2018 15:40:59 -0800 (PST) Received: from localhost ([::1]:33580 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee8BV-0002Ph-Lg for importer@patchew.org; Tue, 23 Jan 2018 18:40:57 -0500 Received: from eggs.gnu.org ([208.118.235.92]:32913) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee89i-0001KX-KR for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:12 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ee89d-00063y-Qj for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:06 -0500 Received: from 9.mo68.mail-out.ovh.net ([46.105.78.111]:56126) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ee89d-00061n-IR for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:01 -0500 Received: from player698.ha.ovh.net (b7.ovh.net [213.186.33.57]) by mo68.mail-out.ovh.net (Postfix) with ESMTP id D1067B9291 for ; Wed, 24 Jan 2018 00:38:59 +0100 (CET) Received: from bahia.lan (lns-bzn-46-82-253-208-248.adsl.proxad.net [82.253.208.248]) (Authenticated sender: groug@kaod.org) by player698.ha.ovh.net (Postfix) with ESMTPA id AF99C520090; Wed, 24 Jan 2018 00:38:55 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Wed, 24 Jan 2018 00:38:55 +0100 Message-ID: <151675073560.29381.3088132885564486565.stgit@bahia.lan> In-Reply-To: <151675071042.29381.16225631028845063799.stgit@bahia.lan> References: <151675071042.29381.16225631028845063799.stgit@bahia.lan> User-Agent: StGit/0.17.1-46-g6855-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Ovh-Tracer-Id: 14380838038033308110 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedtvddrudehgddugecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 46.105.78.111 Subject: [Qemu-devel] [PATCH 2/7] tests: virtio-9p: wait for completion in the test code X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Jason Wang , Fam Zheng , Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 In order to test request cancellation, we will need to send multiple requests and wait for the associated replies. Since we poll the ISR to know if a request completed, we may have several replies to parse when we detect ISR was set to 1. This patch moves the waiting out of the reply parsing path, up into the functional tests. Signed-off-by: Greg Kurz Reviewed-by: Stefan Hajnoczi --- tests/virtio-9p-test.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c index 5ada2839b9ae..cb086315a36e 100644 --- a/tests/virtio-9p-test.c +++ b/tests/virtio-9p-test.c @@ -246,13 +246,17 @@ static const char *rmessage_name(uint8_t id) ""; } =20 -static void v9fs_req_recv(P9Req *req, uint8_t id) +static void v9fs_req_wait_for_reply(P9Req *req) { QVirtIO9P *v9p =3D req->v9p; - P9Hdr hdr; =20 qvirtio_wait_used_elem(v9p->dev, v9p->vq, req->free_head, QVIRTIO_9P_TIMEOUT_US); +} + +static void v9fs_req_recv(P9Req *req, uint8_t id) +{ + P9Hdr hdr; =20 v9fs_memread(req, &hdr, 7); hdr.size =3D ldl_le_p(&hdr.size); @@ -398,6 +402,7 @@ static void fs_version(QVirtIO9P *v9p) P9Req *req; =20 req =3D v9fs_tversion(v9p, P9_MAX_SIZE, version, P9_NOTAG); + v9fs_req_wait_for_reply(req); v9fs_rversion(req, &server_len, &server_version); =20 g_assert_cmpmem(server_version, server_len, version, strlen(version)); @@ -411,6 +416,7 @@ static void fs_attach(QVirtIO9P *v9p) =20 fs_version(v9p); req =3D v9fs_tattach(v9p, 0, getuid(), 0); + v9fs_req_wait_for_reply(req); v9fs_rattach(req, NULL); } =20 @@ -431,6 +437,7 @@ static void fs_walk(QVirtIO9P *v9p) =20 fs_attach(v9p); req =3D v9fs_twalk(v9p, 0, 1, P9_MAXWELEM, wnames, 0); + v9fs_req_wait_for_reply(req); v9fs_rwalk(req, &nwqid, &wqid); =20 g_assert_cmpint(nwqid, =3D=3D, P9_MAXWELEM); @@ -452,6 +459,7 @@ static void fs_walk_no_slash(QVirtIO9P *v9p) =20 fs_attach(v9p); req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); + v9fs_req_wait_for_reply(req); v9fs_rlerror(req, &err); =20 g_assert_cmpint(err, =3D=3D, ENOENT); @@ -467,9 +475,11 @@ static void fs_walk_dotdot(QVirtIO9P *v9p) =20 fs_version(v9p); req =3D v9fs_tattach(v9p, 0, getuid(), 0); + v9fs_req_wait_for_reply(req); v9fs_rattach(req, &root_qid); =20 req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); + v9fs_req_wait_for_reply(req); v9fs_rwalk(req, NULL, &wqid); /* We now we'll get one qid */ =20 g_assert_cmpmem(&root_qid, 13, wqid[0], 13); From nobody Tue Apr 30 00:52:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516750883001269.2060289051742; Tue, 23 Jan 2018 15:41:23 -0800 (PST) Received: from localhost ([::1]:33587 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee8Bs-0002fX-7I for importer@patchew.org; Tue, 23 Jan 2018 18:41:20 -0500 Received: from eggs.gnu.org ([208.118.235.92]:33332) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee89t-0001S9-7m for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ee89n-0006Hk-7S for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:17 -0500 Received: from 5.mo68.mail-out.ovh.net ([46.105.62.179]:50623) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ee89m-0006FQ-Q6 for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:11 -0500 Received: from player698.ha.ovh.net (b7.ovh.net [213.186.33.57]) by mo68.mail-out.ovh.net (Postfix) with ESMTP id 17346B9AB8 for ; Wed, 24 Jan 2018 00:39:09 +0100 (CET) Received: from bahia.lan (lns-bzn-46-82-253-208-248.adsl.proxad.net [82.253.208.248]) (Authenticated sender: groug@kaod.org) by player698.ha.ovh.net (Postfix) with ESMTPA id E87E5520090; Wed, 24 Jan 2018 00:39:04 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Wed, 24 Jan 2018 00:39:04 +0100 Message-ID: <151675074483.29381.10521123038685960593.stgit@bahia.lan> In-Reply-To: <151675071042.29381.16225631028845063799.stgit@bahia.lan> References: <151675071042.29381.16225631028845063799.stgit@bahia.lan> User-Agent: StGit/0.17.1-46-g6855-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Ovh-Tracer-Id: 14383652786209921486 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedtvddrudehgddugecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 46.105.62.179 Subject: [Qemu-devel] [PATCH 3/7] tests: virtio-9p: use the synth backend X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Jason Wang , Fam Zheng , Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 The purpose of virtio-9p-test is to test the virtio-9p device, especially the 9p server state machine. We don't really care what fsdev backend we're using. Moreover, if we want to be able to test the flush request or a device reset with in-flights I/O, it is close to impossible to achieve with a physical backend because we cannot ask it reliably to put an I/O on hold at a specific point in time. Fortunately, we can do that with the synthetic backend, which allows to register callbacks on read/write accesses to a specific file. This will be used by a later patch to test the 9P flush request. The walk request test is converted to using the synth backend. Signed-off-by: Greg Kurz Reviewed-by: Stefan Hajnoczi --- hw/9pfs/9p-synth.c | 16 ++++++++++++++++ hw/9pfs/9p-synth.h | 4 ++++ tests/virtio-9p-test.c | 22 ++++++---------------- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/hw/9pfs/9p-synth.c b/hw/9pfs/9p-synth.c index 8f255e91c00f..dcbd320da17a 100644 --- a/hw/9pfs/9p-synth.c +++ b/hw/9pfs/9p-synth.c @@ -19,6 +19,7 @@ #include "qemu/rcu.h" #include "qemu/rcu_queue.h" #include "qemu/cutils.h" +#include "sysemu/qtest.h" =20 /* Root node for synth file system */ static V9fsSynthNode synth_root =3D { @@ -527,6 +528,21 @@ static int synth_init(FsContext *ctx, Error **errp) =20 /* Mark the subsystem is ready for use */ synth_fs =3D 1; + + if (qtest_enabled()) { + V9fsSynthNode *node =3D NULL; + int i, ret; + + /* Directory hierarchy for WALK test */ + for (i =3D 0; i < P9_MAXWELEM; i++) { + char *name =3D g_strdup_printf(QTEST_V9FS_SYNTH_WALK_FILE, i); + + ret =3D qemu_v9fs_synth_mkdir(node, 0700, name, &node); + assert(!ret); + g_free(name); + } + } + return 0; } =20 diff --git a/hw/9pfs/9p-synth.h b/hw/9pfs/9p-synth.h index 49c2fc7b274e..876b4ef58288 100644 --- a/hw/9pfs/9p-synth.h +++ b/hw/9pfs/9p-synth.h @@ -49,4 +49,8 @@ int qemu_v9fs_synth_add_file(V9fsSynthNode *parent, int m= ode, const char *name, v9fs_synth_read read, v9fs_synth_write write, void *arg); =20 +/* qtest stuff */ + +#define QTEST_V9FS_SYNTH_WALK_FILE "WALK%d" + #endif diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c index cb086315a36e..652198156731 100644 --- a/tests/virtio-9p-test.c +++ b/tests/virtio-9p-test.c @@ -17,6 +17,7 @@ #include "standard-headers/linux/virtio_ids.h" #include "standard-headers/linux/virtio_pci.h" #include "hw/9pfs/9p.h" +#include "hw/9pfs/9p-synth.h" =20 #define QVIRTIO_9P_TIMEOUT_US (10 * 1000 * 1000) =20 @@ -26,23 +27,19 @@ typedef struct { QVirtioDevice *dev; QOSState *qs; QVirtQueue *vq; - char *test_share; } QVirtIO9P; =20 static QVirtIO9P *qvirtio_9p_start(const char *driver) { const char *arch =3D qtest_get_arch(); - const char *cmd =3D "-fsdev local,id=3Dfsdev0,security_model=3Dnone,pa= th=3D%s " + const char *cmd =3D "-fsdev synth,id=3Dfsdev0 " "-device %s,fsdev=3Dfsdev0,mount_tag=3D%s"; QVirtIO9P *v9p =3D g_new0(QVirtIO9P, 1); =20 - v9p->test_share =3D g_strdup("/tmp/qtest.XXXXXX"); - g_assert_nonnull(mkdtemp(v9p->test_share)); - if (strcmp(arch, "i386") =3D=3D 0 || strcmp(arch, "x86_64") =3D=3D 0) { - v9p->qs =3D qtest_pc_boot(cmd, v9p->test_share, driver, mount_tag); + v9p->qs =3D qtest_pc_boot(cmd, driver, mount_tag); } else if (strcmp(arch, "ppc64") =3D=3D 0) { - v9p->qs =3D qtest_spapr_boot(cmd, v9p->test_share, driver, mount_t= ag); + v9p->qs =3D qtest_spapr_boot(cmd, driver, mount_tag); } else { g_printerr("virtio-9p tests are only available on x86 or ppc64\n"); exit(EXIT_FAILURE); @@ -54,8 +51,6 @@ static QVirtIO9P *qvirtio_9p_start(const char *driver) static void qvirtio_9p_stop(QVirtIO9P *v9p) { qtest_shutdown(v9p->qs); - rmdir(v9p->test_share); - g_free(v9p->test_share); g_free(v9p); } =20 @@ -422,17 +417,14 @@ static void fs_attach(QVirtIO9P *v9p) =20 static void fs_walk(QVirtIO9P *v9p) { - char *wnames[P9_MAXWELEM], *paths[P9_MAXWELEM]; - char *last_path =3D v9p->test_share; + char *wnames[P9_MAXWELEM]; uint16_t nwqid; v9fs_qid *wqid; int i; P9Req *req; =20 for (i =3D 0; i < P9_MAXWELEM; i++) { - wnames[i] =3D g_strdup_printf("%s%d", __func__, i); - last_path =3D paths[i] =3D g_strdup_printf("%s/%s", last_path, wna= mes[i]); - g_assert(!mkdir(paths[i], 0700)); + wnames[i] =3D g_strdup_printf(QTEST_V9FS_SYNTH_WALK_FILE, i); } =20 fs_attach(v9p); @@ -443,8 +435,6 @@ static void fs_walk(QVirtIO9P *v9p) g_assert_cmpint(nwqid, =3D=3D, P9_MAXWELEM); =20 for (i =3D 0; i < P9_MAXWELEM; i++) { - rmdir(paths[P9_MAXWELEM - i - 1]); - g_free(paths[P9_MAXWELEM - i - 1]); g_free(wnames[i]); } =20 From nobody Tue Apr 30 00:52:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516751079157431.9295398412985; Tue, 23 Jan 2018 15:44:39 -0800 (PST) Received: from localhost ([::1]:33811 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee8F3-0005I5-DW for importer@patchew.org; Tue, 23 Jan 2018 18:44:37 -0500 Received: from eggs.gnu.org ([208.118.235.92]:33736) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee8A3-0001aP-KL for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:29 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ee89w-0006UW-NN for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:27 -0500 Received: from 7.mo68.mail-out.ovh.net ([46.105.63.230]:58398) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ee89w-0006Sd-AH for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:20 -0500 Received: from player698.ha.ovh.net (b7.ovh.net [213.186.33.57]) by mo68.mail-out.ovh.net (Postfix) with ESMTP id 800ABB9C78 for ; Wed, 24 Jan 2018 00:39:18 +0100 (CET) Received: from bahia.lan (lns-bzn-46-82-253-208-248.adsl.proxad.net [82.253.208.248]) (Authenticated sender: groug@kaod.org) by player698.ha.ovh.net (Postfix) with ESMTPA id 2DE245200A3; Wed, 24 Jan 2018 00:39:14 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Wed, 24 Jan 2018 00:39:14 +0100 Message-ID: <151675075407.29381.15200950476480101972.stgit@bahia.lan> In-Reply-To: <151675071042.29381.16225631028845063799.stgit@bahia.lan> References: <151675071042.29381.16225631028845063799.stgit@bahia.lan> User-Agent: StGit/0.17.1-46-g6855-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Ovh-Tracer-Id: 14386186060419996110 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedtvddrudehgddugecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 46.105.63.230 Subject: [Qemu-devel] [PATCH 4/7] tests: virtio-9p: add LOPEN operation test X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Jason Wang , Fam Zheng , Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Trivial test of a successful open. Signed-off-by: Greg Kurz Reviewed-by: Stefan Hajnoczi --- hw/9pfs/9p-synth.c | 5 +++++ hw/9pfs/9p-synth.h | 1 + tests/virtio-9p-test.c | 47 ++++++++++++++++++++++++++++++++++++++++++++= +++ 3 files changed, 53 insertions(+) diff --git a/hw/9pfs/9p-synth.c b/hw/9pfs/9p-synth.c index dcbd320da17a..f17b74f44461 100644 --- a/hw/9pfs/9p-synth.c +++ b/hw/9pfs/9p-synth.c @@ -541,6 +541,11 @@ static int synth_init(FsContext *ctx, Error **errp) assert(!ret); g_free(name); } + + /* File for LOPEN test */ + ret =3D qemu_v9fs_synth_add_file(NULL, 0, QTEST_V9FS_SYNTH_LOPEN_F= ILE, + NULL, NULL, ctx); + assert(!ret); } =20 return 0; diff --git a/hw/9pfs/9p-synth.h b/hw/9pfs/9p-synth.h index 876b4ef58288..2a8d6fd00d69 100644 --- a/hw/9pfs/9p-synth.h +++ b/hw/9pfs/9p-synth.h @@ -52,5 +52,6 @@ int qemu_v9fs_synth_add_file(V9fsSynthNode *parent, int m= ode, /* qtest stuff */ =20 #define QTEST_V9FS_SYNTH_WALK_FILE "WALK%d" +#define QTEST_V9FS_SYNTH_LOPEN_FILE "LOPEN" =20 #endif diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c index 652198156731..6ba782e24f3a 100644 --- a/tests/virtio-9p-test.c +++ b/tests/virtio-9p-test.c @@ -238,6 +238,7 @@ static const char *rmessage_name(uint8_t id) id =3D=3D P9_RVERSION ? "RVERSION" : id =3D=3D P9_RATTACH ? "RATTACH" : id =3D=3D P9_RWALK ? "RWALK" : + id =3D=3D P9_RLOPEN ? "RLOPEN" : ""; } =20 @@ -389,6 +390,34 @@ static void v9fs_rwalk(P9Req *req, uint16_t *nwqid, v9= fs_qid **wqid) v9fs_req_free(req); } =20 +/* size[4] Tlopen tag[2] fid[4] flags[4] */ +static P9Req *v9fs_tlopen(QVirtIO9P *v9p, uint32_t fid, uint32_t flags, + uint16_t tag) +{ + P9Req *req; + + req =3D v9fs_req_init(v9p, 4 + 4, P9_TLOPEN, tag); + v9fs_uint32_write(req, fid); + v9fs_uint32_write(req, flags); + v9fs_req_send(req); + return req; +} + +/* size[4] Rlopen tag[2] qid[13] iounit[4] */ +static void v9fs_rlopen(P9Req *req, v9fs_qid *qid, uint32_t *iounit) +{ + v9fs_req_recv(req, P9_RLOPEN); + if (qid) { + v9fs_memread(req, qid, 13); + } else { + v9fs_memskip(req, 13); + } + if (iounit) { + v9fs_uint32_read(req, iounit); + } + v9fs_req_free(req); +} + static void fs_version(QVirtIO9P *v9p) { const char *version =3D "9P2000.L"; @@ -478,6 +507,23 @@ static void fs_walk_dotdot(QVirtIO9P *v9p) g_free(wnames[0]); } =20 +static void fs_lopen(QVirtIO9P *v9p) +{ + char *const wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_LOPEN_FILE) }; + P9Req *req; + + fs_attach(v9p); + req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); + v9fs_req_wait_for_reply(req); + v9fs_rwalk(req, NULL, NULL); + + req =3D v9fs_tlopen(v9p, 1, O_WRONLY, 0); + v9fs_req_wait_for_reply(req); + v9fs_rlopen(req, NULL, NULL); + + g_free(wnames[0]); +} + typedef void (*v9fs_test_fn)(QVirtIO9P *v9p); =20 static void v9fs_run_pci_test(gconstpointer data) @@ -507,6 +553,7 @@ int main(int argc, char **argv) v9fs_qtest_pci_add("/virtio/9p/pci/fs/walk/no_slash", fs_walk_no_slash= ); v9fs_qtest_pci_add("/virtio/9p/pci/fs/walk/dotdot_from_root", fs_walk_dotdot); + v9fs_qtest_pci_add("/virtio/9p/pci/fs/lopen/basic", fs_lopen); =20 return g_test_run(); } From nobody Tue Apr 30 00:52:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516751014866840.3758108799296; Tue, 23 Jan 2018 15:43:34 -0800 (PST) Received: from localhost ([::1]:33697 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee8E2-0004SB-3u for importer@patchew.org; Tue, 23 Jan 2018 18:43:34 -0500 Received: from eggs.gnu.org ([208.118.235.92]:33923) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee8A9-0001e2-7d for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:37 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ee8A5-0006f3-Bf for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:33 -0500 Received: from 5.mo68.mail-out.ovh.net ([46.105.62.179]:38688) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ee8A5-0006dD-38 for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:29 -0500 Received: from player698.ha.ovh.net (b7.ovh.net [213.186.33.57]) by mo68.mail-out.ovh.net (Postfix) with ESMTP id A509BB9C85 for ; Wed, 24 Jan 2018 00:39:27 +0100 (CET) Received: from bahia.lan (lns-bzn-46-82-253-208-248.adsl.proxad.net [82.253.208.248]) (Authenticated sender: groug@kaod.org) by player698.ha.ovh.net (Postfix) with ESMTPA id 691DC520092; Wed, 24 Jan 2018 00:39:23 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Wed, 24 Jan 2018 00:39:23 +0100 Message-ID: <151675076332.29381.6289851186190918274.stgit@bahia.lan> In-Reply-To: <151675071042.29381.16225631028845063799.stgit@bahia.lan> References: <151675071042.29381.16225631028845063799.stgit@bahia.lan> User-Agent: StGit/0.17.1-46-g6855-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Ovh-Tracer-Id: 14388719336473795022 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedtvddrudehgddugecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 46.105.62.179 Subject: [Qemu-devel] [PATCH 5/7] tests: virtio-9p: add WRITE operation test X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Jason Wang , Fam Zheng , Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Trivial test of a successful write. Signed-off-by: Greg Kurz Reviewed-by: Stefan Hajnoczi --- hw/9pfs/9p-synth.c | 11 +++++++++ hw/9pfs/9p-synth.h | 1 + tests/virtio-9p-test.c | 59 ++++++++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 71 insertions(+) diff --git a/hw/9pfs/9p-synth.c b/hw/9pfs/9p-synth.c index f17b74f44461..f2d59a90a670 100644 --- a/hw/9pfs/9p-synth.c +++ b/hw/9pfs/9p-synth.c @@ -515,6 +515,12 @@ static int synth_unlinkat(FsContext *ctx, V9fsPath *di= r, return -1; } =20 +static ssize_t v9fs_synth_qtest_write(void *buf, int len, off_t offset, + void *arg) +{ + return len; +} + static int synth_init(FsContext *ctx, Error **errp) { QLIST_INIT(&synth_root.child); @@ -546,6 +552,11 @@ static int synth_init(FsContext *ctx, Error **errp) ret =3D qemu_v9fs_synth_add_file(NULL, 0, QTEST_V9FS_SYNTH_LOPEN_F= ILE, NULL, NULL, ctx); assert(!ret); + + /* File for WRITE test */ + ret =3D qemu_v9fs_synth_add_file(NULL, 0, QTEST_V9FS_SYNTH_WRITE_F= ILE, + NULL, v9fs_synth_qtest_write, ctx); + assert(!ret); } =20 return 0; diff --git a/hw/9pfs/9p-synth.h b/hw/9pfs/9p-synth.h index 2a8d6fd00d69..a74032d7bd9a 100644 --- a/hw/9pfs/9p-synth.h +++ b/hw/9pfs/9p-synth.h @@ -53,5 +53,6 @@ int qemu_v9fs_synth_add_file(V9fsSynthNode *parent, int m= ode, =20 #define QTEST_V9FS_SYNTH_WALK_FILE "WALK%d" #define QTEST_V9FS_SYNTH_LOPEN_FILE "LOPEN" +#define QTEST_V9FS_SYNTH_WRITE_FILE "WRITE" =20 #endif diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c index 6ba782e24f3a..5871a16dac73 100644 --- a/tests/virtio-9p-test.c +++ b/tests/virtio-9p-test.c @@ -150,6 +150,13 @@ static void v9fs_uint32_write(P9Req *req, uint32_t val) v9fs_memwrite(req, &le_val, 4); } =20 +static void v9fs_uint64_write(P9Req *req, uint64_t val) +{ + uint64_t le_val =3D cpu_to_le64(val); + + v9fs_memwrite(req, &le_val, 8); +} + static void v9fs_uint32_read(P9Req *req, uint32_t *val) { v9fs_memread(req, val, 4); @@ -239,6 +246,7 @@ static const char *rmessage_name(uint8_t id) id =3D=3D P9_RATTACH ? "RATTACH" : id =3D=3D P9_RWALK ? "RWALK" : id =3D=3D P9_RLOPEN ? "RLOPEN" : + id =3D=3D P9_RWRITE ? "RWRITE" : ""; } =20 @@ -418,6 +426,31 @@ static void v9fs_rlopen(P9Req *req, v9fs_qid *qid, uin= t32_t *iounit) v9fs_req_free(req); } =20 +/* size[4] Twrite tag[2] fid[4] offset[8] count[4] data[count] */ +static P9Req *v9fs_twrite(QVirtIO9P *v9p, uint32_t fid, uint64_t offset, + uint32_t count, const void *data, uint16_t tag) +{ + P9Req *req; + + req =3D v9fs_req_init(v9p, 4 + 8 + 4 + count, P9_TWRITE, tag); + v9fs_uint32_write(req, fid); + v9fs_uint64_write(req, offset); + v9fs_uint32_write(req, count); + v9fs_memwrite(req, data, count); + v9fs_req_send(req); + return req; +} + +/* size[4] Rwrite tag[2] count[4] */ +static void v9fs_rwrite(P9Req *req, uint32_t *count) +{ + v9fs_req_recv(req, P9_RWRITE); + if (count) { + v9fs_uint32_read(req, count); + } + v9fs_req_free(req); +} + static void fs_version(QVirtIO9P *v9p) { const char *version =3D "9P2000.L"; @@ -524,6 +557,31 @@ static void fs_lopen(QVirtIO9P *v9p) g_free(wnames[0]); } =20 +static void fs_write(QVirtIO9P *v9p) +{ + static const uint32_t write_count =3D P9_MAX_SIZE / 2; + char *const wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_WRITE_FILE) }; + char *buf =3D g_malloc(write_count); + uint32_t count; + P9Req *req; + + fs_attach(v9p); + req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); + v9fs_req_wait_for_reply(req); + v9fs_rwalk(req, NULL, NULL); + + req =3D v9fs_tlopen(v9p, 1, O_WRONLY, 0); + v9fs_req_wait_for_reply(req); + v9fs_rlopen(req, NULL, NULL); + + req =3D v9fs_twrite(v9p, 1, 0, write_count, buf, 0); + v9fs_req_wait_for_reply(req); + v9fs_rwrite(req, &count); + g_assert_cmpint(count, =3D=3D, write_count); + + g_free(wnames[0]); +} + typedef void (*v9fs_test_fn)(QVirtIO9P *v9p); =20 static void v9fs_run_pci_test(gconstpointer data) @@ -554,6 +612,7 @@ int main(int argc, char **argv) v9fs_qtest_pci_add("/virtio/9p/pci/fs/walk/dotdot_from_root", fs_walk_dotdot); v9fs_qtest_pci_add("/virtio/9p/pci/fs/lopen/basic", fs_lopen); + v9fs_qtest_pci_add("/virtio/9p/pci/fs/write/basic", fs_write); =20 return g_test_run(); } From nobody Tue Apr 30 00:52:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 151675116621031.566425797848865; Tue, 23 Jan 2018 15:46:06 -0800 (PST) Received: from localhost ([::1]:33871 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee8GO-00065w-VL for importer@patchew.org; Tue, 23 Jan 2018 18:46:01 -0500 Received: from eggs.gnu.org ([208.118.235.92]:34351) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee8AK-0001nm-7C for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ee8AE-0006tg-PH for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:44 -0500 Received: from 7.mo68.mail-out.ovh.net ([46.105.63.230]:54301) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ee8AE-0006rp-AE for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:38 -0500 Received: from player698.ha.ovh.net (b7.ovh.net [213.186.33.57]) by mo68.mail-out.ovh.net (Postfix) with ESMTP id EF444B9C92 for ; Wed, 24 Jan 2018 00:39:36 +0100 (CET) Received: from bahia.lan (lns-bzn-46-82-253-208-248.adsl.proxad.net [82.253.208.248]) (Authenticated sender: groug@kaod.org) by player698.ha.ovh.net (Postfix) with ESMTPA id A3523520087; Wed, 24 Jan 2018 00:39:32 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Wed, 24 Jan 2018 00:39:32 +0100 Message-ID: <151675077255.29381.3377483535010806275.stgit@bahia.lan> In-Reply-To: <151675071042.29381.16225631028845063799.stgit@bahia.lan> References: <151675071042.29381.16225631028845063799.stgit@bahia.lan> User-Agent: StGit/0.17.1-46-g6855-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Ovh-Tracer-Id: 14391252612684749262 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedtvddrudehgddugecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 46.105.63.230 Subject: [Qemu-devel] [PATCH 6/7] libqos/virtio: return length written into used descriptor X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Jason Wang , Fam Zheng , Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 When a 9p request is flushed (ie, cancelled) by the guest, the device is expected to simply mark the request as used, without sending a 9p reply (ie, without writing anything into the used buffer). To be able to test this, we need access to the length written by the device into the used descriptor. This patch adds a uint32_t * argument to qvirtqueue_get_buf() and qvirtio_wait_used_elem() for this purpose. All existing users are updated accordingly. Signed-off-by: Greg Kurz Reviewed-by: Stefan Hajnoczi --- tests/libqos/virtio.c | 25 +++++++++++++++++-------- tests/libqos/virtio.h | 3 ++- tests/virtio-9p-test.c | 2 +- tests/virtio-blk-test.c | 24 +++++++++++++----------- tests/virtio-net-test.c | 6 +++--- tests/virtio-scsi-test.c | 3 ++- 6 files changed, 38 insertions(+), 25 deletions(-) diff --git a/tests/libqos/virtio.c b/tests/libqos/virtio.c index 0879a621c8af..0dad5c19acde 100644 --- a/tests/libqos/virtio.c +++ b/tests/libqos/virtio.c @@ -119,6 +119,8 @@ uint8_t qvirtio_wait_status_byte_no_isr(QVirtioDevice *= d, /* * qvirtio_wait_used_elem: * @desc_idx: The next expected vq->desc[] index in the used ring + * @len: A pointer that is filled with the length written into the buffer,= may + * be NULL * @timeout_us: How many microseconds to wait before failing * * This function waits for the next completed request on the used ring. @@ -126,6 +128,7 @@ uint8_t qvirtio_wait_status_byte_no_isr(QVirtioDevice *= d, void qvirtio_wait_used_elem(QVirtioDevice *d, QVirtQueue *vq, uint32_t desc_idx, + uint32_t *len, gint64 timeout_us) { gint64 start_time =3D g_get_monotonic_time(); @@ -136,7 +139,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)) { + qvirtqueue_get_buf(vq, &got_desc_idx, len)) { g_assert_cmpint(got_desc_idx, =3D=3D, desc_idx); return; } @@ -304,30 +307,36 @@ void qvirtqueue_kick(QVirtioDevice *d, QVirtQueue *vq= , uint32_t free_head) /* * qvirtqueue_get_buf: * @desc_idx: A pointer that is filled with the vq->desc[] index, may be N= ULL + * @len: A pointer that is filled with the length written into the buffer,= may + * be NULL * * This function gets the next used element if there is one ready. * * Returns: true if an element was ready, false otherwise */ -bool qvirtqueue_get_buf(QVirtQueue *vq, uint32_t *desc_idx) +bool qvirtqueue_get_buf(QVirtQueue *vq, uint32_t *desc_idx, uint32_t *len) { uint16_t idx; + uint64_t elem_addr; =20 idx =3D readw(vq->used + offsetof(struct vring_used, idx)); if (idx =3D=3D vq->last_used_idx) { return false; } =20 - if (desc_idx) { - uint64_t elem_addr; + elem_addr =3D vq->used + + offsetof(struct vring_used, ring) + + (vq->last_used_idx % vq->size) * + sizeof(struct vring_used_elem); =20 - elem_addr =3D vq->used + - offsetof(struct vring_used, ring) + - (vq->last_used_idx % vq->size) * - sizeof(struct vring_used_elem); + if (desc_idx) { *desc_idx =3D readl(elem_addr + offsetof(struct vring_used_elem, i= d)); } =20 + if (len) { + *len =3D readw(elem_addr + offsetof(struct vring_used_elem, len)); + } + vq->last_used_idx++; return true; } diff --git a/tests/libqos/virtio.h b/tests/libqos/virtio.h index 0a04740adfe1..69b5b13840e7 100644 --- a/tests/libqos/virtio.h +++ b/tests/libqos/virtio.h @@ -124,6 +124,7 @@ uint8_t qvirtio_wait_status_byte_no_isr(QVirtioDevice *= d, void qvirtio_wait_used_elem(QVirtioDevice *d, QVirtQueue *vq, uint32_t desc_idx, + uint32_t *len, gint64 timeout_us); void qvirtio_wait_config_isr(QVirtioDevice *d, gint64 timeout_us); QVirtQueue *qvirtqueue_setup(QVirtioDevice *d, @@ -140,7 +141,7 @@ 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); +bool qvirtqueue_get_buf(QVirtQueue *vq, uint32_t *desc_idx, uint32_t *len); =20 void qvirtqueue_set_used_event(QVirtQueue *vq, uint16_t idx); =20 diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c index 5871a16dac73..57ae3a666c61 100644 --- a/tests/virtio-9p-test.c +++ b/tests/virtio-9p-test.c @@ -254,7 +254,7 @@ static void v9fs_req_wait_for_reply(P9Req *req) { QVirtIO9P *v9p =3D req->v9p; =20 - qvirtio_wait_used_elem(v9p->dev, v9p->vq, req->free_head, + qvirtio_wait_used_elem(v9p->dev, v9p->vq, req->free_head, NULL, QVIRTIO_9P_TIMEOUT_US); } =20 diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index 45f368dcd966..2ac64e5e2559 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -193,7 +193,7 @@ static void test_basic(QVirtioDevice *dev, QGuestAlloca= tor *alloc, =20 qvirtqueue_kick(dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, QVIRTIO_BLK_TIMEOUT_US); + qvirtio_wait_used_elem(dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_U= S); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); =20 @@ -215,7 +215,7 @@ static void test_basic(QVirtioDevice *dev, QGuestAlloca= tor *alloc, =20 qvirtqueue_kick(dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, QVIRTIO_BLK_TIMEOUT_US); + qvirtio_wait_used_elem(dev, vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_U= S); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); =20 @@ -243,7 +243,8 @@ static void test_basic(QVirtioDevice *dev, QGuestAlloca= tor *alloc, qvirtqueue_add(vq, req_addr + 528, 1, true, false); qvirtqueue_kick(dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, QVIRTIO_BLK_TIMEOUT_US); + qvirtio_wait_used_elem(dev, vq, free_head, NULL, + QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); =20 @@ -264,7 +265,8 @@ static void test_basic(QVirtioDevice *dev, QGuestAlloca= tor *alloc, =20 qvirtqueue_kick(dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, QVIRTIO_BLK_TIMEOUT_US); + qvirtio_wait_used_elem(dev, vq, free_head, NULL, + QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); =20 @@ -345,7 +347,7 @@ static void pci_indirect(void) free_head =3D qvirtqueue_add_indirect(&vqpci->vq, indirect); qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head); =20 - qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, free_head, + qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); @@ -370,7 +372,7 @@ static void pci_indirect(void) free_head =3D qvirtqueue_add_indirect(&vqpci->vq, indirect); qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head); =20 - qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, free_head, + qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US); status =3D readb(req_addr + 528); g_assert_cmpint(status, =3D=3D, 0); @@ -481,7 +483,7 @@ static void pci_msix(void) qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false); qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head); =20 - qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, free_head, + qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US); =20 status =3D readb(req_addr + 528); @@ -506,7 +508,7 @@ static void pci_msix(void) qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head); =20 =20 - qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, free_head, + qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US); =20 status =3D readb(req_addr + 528); @@ -580,7 +582,7 @@ static void pci_idx(void) qvirtqueue_add(&vqpci->vq, req_addr + 528, 1, true, false); qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head); =20 - qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, free_head, + qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, free_head, NULL, QVIRTIO_BLK_TIMEOUT_US); =20 /* Write request */ @@ -627,9 +629,9 @@ static void pci_idx(void) qvirtqueue_kick(&dev->vdev, &vqpci->vq, free_head); =20 /* We get just one notification for both requests */ - qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, write_head, + qvirtio_wait_used_elem(&dev->vdev, &vqpci->vq, write_head, NULL, QVIRTIO_BLK_TIMEOUT_US); - g_assert(qvirtqueue_get_buf(&vqpci->vq, &desc_idx)); + g_assert(qvirtqueue_get_buf(&vqpci->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 635b942c3601..ea634dc05a60 100644 --- a/tests/virtio-net-test.c +++ b/tests/virtio-net-test.c @@ -108,7 +108,7 @@ static void rx_test(QVirtioDevice *dev, 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, QVIRTIO_NET_TIMEOUT_US); + qvirtio_wait_used_elem(dev, vq, free_head, NULL, QVIRTIO_NET_TIMEOUT_U= S); memread(req_addr + VNET_HDR_SIZE, buffer, sizeof(test)); g_assert_cmpstr(buffer, =3D=3D, "TEST"); =20 @@ -131,7 +131,7 @@ static void tx_test(QVirtioDevice *dev, free_head =3D qvirtqueue_add(vq, req_addr, 64, false, false); qvirtqueue_kick(dev, vq, free_head); =20 - qvirtio_wait_used_elem(dev, vq, free_head, QVIRTIO_NET_TIMEOUT_US); + qvirtio_wait_used_elem(dev, vq, free_head, NULL, QVIRTIO_NET_TIMEOUT_U= S); guest_free(alloc, req_addr); =20 ret =3D qemu_recv(socket, &len, sizeof(len), 0); @@ -182,7 +182,7 @@ static void rx_stop_cont_test(QVirtioDevice *dev, rsp =3D qmp("{ 'execute' : 'cont'}"); QDECREF(rsp); =20 - qvirtio_wait_used_elem(dev, vq, free_head, QVIRTIO_NET_TIMEOUT_US); + qvirtio_wait_used_elem(dev, vq, free_head, NULL, QVIRTIO_NET_TIMEOUT_U= S); memread(req_addr + VNET_HDR_SIZE, buffer, sizeof(test)); g_assert_cmpstr(buffer, =3D=3D, "TEST"); =20 diff --git a/tests/virtio-scsi-test.c b/tests/virtio-scsi-test.c index 2934305b2bff..bcf408fbb637 100644 --- a/tests/virtio-scsi-test.c +++ b/tests/virtio-scsi-test.c @@ -121,7 +121,8 @@ static uint8_t virtio_scsi_do_command(QVirtIOSCSI *vs, = const uint8_t *cdb, } =20 qvirtqueue_kick(vs->dev, vq, free_head); - qvirtio_wait_used_elem(vs->dev, vq, free_head, QVIRTIO_SCSI_TIMEOUT_US= ); + qvirtio_wait_used_elem(vs->dev, vq, free_head, NULL, + QVIRTIO_SCSI_TIMEOUT_US); =20 response =3D readb(resp_addr + offsetof(struct virtio_scsi_cmd_resp, response)); From nobody Tue Apr 30 00:52:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516751249731936.5326733315802; Tue, 23 Jan 2018 15:47:29 -0800 (PST) Received: from localhost ([::1]:33941 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee8Hm-0006qb-W5 for importer@patchew.org; Tue, 23 Jan 2018 18:47:27 -0500 Received: from eggs.gnu.org ([208.118.235.92]:34611) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee8AR-0001sf-PR for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ee8AO-000789-Ac for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:51 -0500 Received: from 1.mo68.mail-out.ovh.net ([46.105.41.146]:56251) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ee8AN-00075k-TH for qemu-devel@nongnu.org; Tue, 23 Jan 2018 18:39:48 -0500 Received: from player698.ha.ovh.net (b7.ovh.net [213.186.33.57]) by mo68.mail-out.ovh.net (Postfix) with ESMTP id 1B684B9C92 for ; Wed, 24 Jan 2018 00:39:46 +0100 (CET) Received: from bahia.lan (lns-bzn-46-82-253-208-248.adsl.proxad.net [82.253.208.248]) (Authenticated sender: groug@kaod.org) by player698.ha.ovh.net (Postfix) with ESMTPA id DBE7B520087; Wed, 24 Jan 2018 00:39:41 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Wed, 24 Jan 2018 00:39:41 +0100 Message-ID: <151675078179.29381.692912942013037690.stgit@bahia.lan> In-Reply-To: <151675071042.29381.16225631028845063799.stgit@bahia.lan> References: <151675071042.29381.16225631028845063799.stgit@bahia.lan> User-Agent: StGit/0.17.1-46-g6855-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Ovh-Tracer-Id: 14393785885126269390 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedtvddrudehgddugecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 46.105.41.146 Subject: [Qemu-devel] [PATCH 7/7] tests: virtio-9p: add FLUSH operation test X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Jason Wang , Fam Zheng , Stefan Hajnoczi Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 The idea is to send a victim request that will possibly block in the server and to send a flush request to cancel the victim request. This patch adds two test to verifiy that: - the server does not reply to a victim request that was actually cancelled - the server replies to the flush request after replying to the victim request if it could not cancel it 9p request cancellation reference: http://man.cat-v.org/plan_9/5/flush Signed-off-by: Greg Kurz Reviewed-by: Stefan Hajnoczi --- hw/9pfs/9p-synth.c | 24 ++++++++++ hw/9pfs/9p-synth.h | 5 ++ hw/9pfs/9p.c | 1=20 tests/virtio-9p-test.c | 117 +++++++++++++++++++++++++++++++++++++++++++-= ---- 4 files changed, 134 insertions(+), 13 deletions(-) diff --git a/hw/9pfs/9p-synth.c b/hw/9pfs/9p-synth.c index f2d59a90a670..0a9940dfa23c 100644 --- a/hw/9pfs/9p-synth.c +++ b/hw/9pfs/9p-synth.c @@ -521,6 +521,24 @@ static ssize_t v9fs_synth_qtest_write(void *buf, int l= en, off_t offset, return len; } =20 +static ssize_t v9fs_synth_qtest_flush_write(void *buf, int len, off_t offs= et, + void *arg) +{ + QtestV9fsSynthFlushData *data =3D buf; + + assert(len =3D=3D sizeof(*data)); + + if (data->usec_timeout) { + usleep(data->usec_timeout); + + /* This will cause the server to call us again until we're cancell= ed */ + errno =3D EINTR; + return -1; + } + + return len; +} + static int synth_init(FsContext *ctx, Error **errp) { QLIST_INIT(&synth_root.child); @@ -557,6 +575,12 @@ static int synth_init(FsContext *ctx, Error **errp) ret =3D qemu_v9fs_synth_add_file(NULL, 0, QTEST_V9FS_SYNTH_WRITE_F= ILE, NULL, v9fs_synth_qtest_write, ctx); assert(!ret); + + /* File for FLUSH test */ + ret =3D qemu_v9fs_synth_add_file(NULL, 0, QTEST_V9FS_SYNTH_FLUSH_F= ILE, + NULL, v9fs_synth_qtest_flush_write, + ctx); + assert(!ret); } =20 return 0; diff --git a/hw/9pfs/9p-synth.h b/hw/9pfs/9p-synth.h index a74032d7bd9a..502ec6309a36 100644 --- a/hw/9pfs/9p-synth.h +++ b/hw/9pfs/9p-synth.h @@ -54,5 +54,10 @@ int qemu_v9fs_synth_add_file(V9fsSynthNode *parent, int = mode, #define QTEST_V9FS_SYNTH_WALK_FILE "WALK%d" #define QTEST_V9FS_SYNTH_LOPEN_FILE "LOPEN" #define QTEST_V9FS_SYNTH_WRITE_FILE "WRITE" +#define QTEST_V9FS_SYNTH_FLUSH_FILE "FLUSH" + +typedef struct { + uint32_t usec_timeout; +} QtestV9fsSynthFlushData; =20 #endif diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c index 73dafffe239f..eae82db4ef60 100644 --- a/hw/9pfs/9p.c +++ b/hw/9pfs/9p.c @@ -24,6 +24,7 @@ #include "coth.h" #include "trace.h" #include "migration/blocker.h" +#include "sysemu/qtest.h" =20 int open_fd_hw; int total_open_fd; diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c index 57ae3a666c61..b234e09e252d 100644 --- a/tests/virtio-9p-test.c +++ b/tests/virtio-9p-test.c @@ -247,14 +247,15 @@ static const char *rmessage_name(uint8_t id) id =3D=3D P9_RWALK ? "RWALK" : id =3D=3D P9_RLOPEN ? "RLOPEN" : id =3D=3D P9_RWRITE ? "RWRITE" : + id =3D=3D P9_RFLUSH ? "RFLUSH" : ""; } =20 -static void v9fs_req_wait_for_reply(P9Req *req) +static void v9fs_req_wait_for_reply(P9Req *req, uint32_t *len) { QVirtIO9P *v9p =3D req->v9p; =20 - qvirtio_wait_used_elem(v9p->dev, v9p->vq, req->free_head, NULL, + qvirtio_wait_used_elem(v9p->dev, v9p->vq, req->free_head, len, QVIRTIO_9P_TIMEOUT_US); } =20 @@ -451,6 +452,24 @@ static void v9fs_rwrite(P9Req *req, uint32_t *count) v9fs_req_free(req); } =20 +/* size[4] Tflush tag[2] oldtag[2] */ +static P9Req *v9fs_tflush(QVirtIO9P *v9p, uint16_t oldtag, uint16_t tag) +{ + P9Req *req; + + req =3D v9fs_req_init(v9p, 2, P9_TFLUSH, tag); + v9fs_uint32_write(req, oldtag); + v9fs_req_send(req); + return req; +} + +/* size[4] Rflush tag[2] */ +static void v9fs_rflush(P9Req *req) +{ + v9fs_req_recv(req, P9_RFLUSH); + v9fs_req_free(req); +} + static void fs_version(QVirtIO9P *v9p) { const char *version =3D "9P2000.L"; @@ -459,7 +478,7 @@ static void fs_version(QVirtIO9P *v9p) P9Req *req; =20 req =3D v9fs_tversion(v9p, P9_MAX_SIZE, version, P9_NOTAG); - v9fs_req_wait_for_reply(req); + v9fs_req_wait_for_reply(req, NULL); v9fs_rversion(req, &server_len, &server_version); =20 g_assert_cmpmem(server_version, server_len, version, strlen(version)); @@ -473,7 +492,7 @@ static void fs_attach(QVirtIO9P *v9p) =20 fs_version(v9p); req =3D v9fs_tattach(v9p, 0, getuid(), 0); - v9fs_req_wait_for_reply(req); + v9fs_req_wait_for_reply(req, NULL); v9fs_rattach(req, NULL); } =20 @@ -491,7 +510,7 @@ static void fs_walk(QVirtIO9P *v9p) =20 fs_attach(v9p); req =3D v9fs_twalk(v9p, 0, 1, P9_MAXWELEM, wnames, 0); - v9fs_req_wait_for_reply(req); + v9fs_req_wait_for_reply(req, NULL); v9fs_rwalk(req, &nwqid, &wqid); =20 g_assert_cmpint(nwqid, =3D=3D, P9_MAXWELEM); @@ -511,7 +530,7 @@ static void fs_walk_no_slash(QVirtIO9P *v9p) =20 fs_attach(v9p); req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); - v9fs_req_wait_for_reply(req); + v9fs_req_wait_for_reply(req, NULL); v9fs_rlerror(req, &err); =20 g_assert_cmpint(err, =3D=3D, ENOENT); @@ -527,11 +546,11 @@ static void fs_walk_dotdot(QVirtIO9P *v9p) =20 fs_version(v9p); req =3D v9fs_tattach(v9p, 0, getuid(), 0); - v9fs_req_wait_for_reply(req); + v9fs_req_wait_for_reply(req, NULL); v9fs_rattach(req, &root_qid); =20 req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); - v9fs_req_wait_for_reply(req); + v9fs_req_wait_for_reply(req, NULL); v9fs_rwalk(req, NULL, &wqid); /* We now we'll get one qid */ =20 g_assert_cmpmem(&root_qid, 13, wqid[0], 13); @@ -547,11 +566,11 @@ static void fs_lopen(QVirtIO9P *v9p) =20 fs_attach(v9p); req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); - v9fs_req_wait_for_reply(req); + v9fs_req_wait_for_reply(req, NULL); v9fs_rwalk(req, NULL, NULL); =20 req =3D v9fs_tlopen(v9p, 1, O_WRONLY, 0); - v9fs_req_wait_for_reply(req); + v9fs_req_wait_for_reply(req, NULL); v9fs_rlopen(req, NULL, NULL); =20 g_free(wnames[0]); @@ -567,21 +586,91 @@ static void fs_write(QVirtIO9P *v9p) =20 fs_attach(v9p); req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); - v9fs_req_wait_for_reply(req); + v9fs_req_wait_for_reply(req, NULL); v9fs_rwalk(req, NULL, NULL); =20 req =3D v9fs_tlopen(v9p, 1, O_WRONLY, 0); - v9fs_req_wait_for_reply(req); + v9fs_req_wait_for_reply(req, NULL); v9fs_rlopen(req, NULL, NULL); =20 req =3D v9fs_twrite(v9p, 1, 0, write_count, buf, 0); - v9fs_req_wait_for_reply(req); + v9fs_req_wait_for_reply(req, NULL); v9fs_rwrite(req, &count); g_assert_cmpint(count, =3D=3D, write_count); =20 g_free(wnames[0]); } =20 +static void fs_flush_success(QVirtIO9P *v9p) +{ + char *const wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_FLUSH_FILE) }; + QtestV9fsSynthFlushData data; + P9Req *req, *flush_req; + uint32_t reply_len; + + fs_attach(v9p); + req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); + v9fs_req_wait_for_reply(req, NULL); + v9fs_rwalk(req, NULL, NULL); + + req =3D v9fs_tlopen(v9p, 1, O_WRONLY, 0); + v9fs_req_wait_for_reply(req, NULL); + v9fs_rlopen(req, NULL, NULL); + + /* This will cause the 9p server to try to write data to the backend, + * until the write request gets cancelled. + */ + data.usec_timeout =3D 10; + req =3D v9fs_twrite(v9p, 1, 0, sizeof(data), &data, 0); + + flush_req =3D v9fs_tflush(v9p, req->tag, 1); + + /* The write request is supposed to be flushed: the server should just + * mark the write request as used and reply to the flush request. + */ + v9fs_req_wait_for_reply(req, &reply_len); + g_assert_cmpint(reply_len, =3D=3D, 0); + v9fs_req_free(req); + v9fs_rflush(flush_req); + + g_free(wnames[0]); +} + +static void fs_flush_ignored(QVirtIO9P *v9p) +{ + char *const wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_FLUSH_FILE) }; + QtestV9fsSynthFlushData data; + P9Req *req, *flush_req; + uint32_t count; + + fs_attach(v9p); + req =3D v9fs_twalk(v9p, 0, 1, 1, wnames, 0); + v9fs_req_wait_for_reply(req, NULL); + v9fs_rwalk(req, NULL, NULL); + + req =3D v9fs_tlopen(v9p, 1, O_WRONLY, 0); + v9fs_req_wait_for_reply(req, NULL); + v9fs_rlopen(req, NULL, NULL); + + /* This will cause the write request to complete right away, before it + * could be actually cancelled. + */ + data.usec_timeout =3D 0; + req =3D v9fs_twrite(v9p, 1, 0, sizeof(data), &data, 0); + + flush_req =3D v9fs_tflush(v9p, req->tag, 1); + + /* The write request is supposed to complete. The server should + * reply to the write request and the flush request. + */ + v9fs_req_wait_for_reply(req, NULL); + v9fs_rwrite(req, &count); + g_assert_cmpint(count, =3D=3D, sizeof(data)); + v9fs_rflush(flush_req); + + g_free(wnames[0]); +} + typedef void (*v9fs_test_fn)(QVirtIO9P *v9p); =20 static void v9fs_run_pci_test(gconstpointer data) @@ -613,6 +702,8 @@ int main(int argc, char **argv) fs_walk_dotdot); v9fs_qtest_pci_add("/virtio/9p/pci/fs/lopen/basic", fs_lopen); v9fs_qtest_pci_add("/virtio/9p/pci/fs/write/basic", fs_write); + v9fs_qtest_pci_add("/virtio/9p/pci/fs/flush/success", fs_flush_success= ); + v9fs_qtest_pci_add("/virtio/9p/pci/fs/flush/ignored", fs_flush_ignored= ); =20 return g_test_run(); }