From nobody Sat May 4 05:22:15 2024 Delivered-To: importer@patchew.org Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) 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=temperror (zoho.com: Error in retrieving data from DNS) 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 1517594133025792.6513285701495; Fri, 2 Feb 2018 09:55:33 -0800 (PST) Received: from localhost ([::1]:43895 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehfYd-0000vj-NZ for importer@patchew.org; Fri, 02 Feb 2018 12:55:27 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51117) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehe5D-0008Ly-DX for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:22:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ehe47-00046C-MF for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:20:58 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:49106) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ehe47-00044D-0F for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:19:51 -0500 Received: from pps.filterd (m0098404.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w12GHqKE016597 for ; Fri, 2 Feb 2018 11:19:49 -0500 Received: from e06smtp12.uk.ibm.com (e06smtp12.uk.ibm.com [195.75.94.108]) by mx0a-001b2d01.pphosted.com with ESMTP id 2fvsncndqx-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 02 Feb 2018 11:19:49 -0500 Received: from localhost by e06smtp12.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 2 Feb 2018 16:19:46 -0000 Received: from b06cxnps4076.portsmouth.uk.ibm.com (9.149.109.198) by e06smtp12.uk.ibm.com (192.168.101.142) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 2 Feb 2018 16:19:44 -0000 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w12GJiLk7667864; Fri, 2 Feb 2018 16:19:44 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A7D5F11C050; Fri, 2 Feb 2018 16:13:11 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 95FF411C04C; Fri, 2 Feb 2018 16:13:11 +0000 (GMT) Received: from smtp.lab.toulouse-stg.fr.ibm.com (unknown [9.101.4.1]) by d06av25.portsmouth.uk.ibm.com (Postfix) with ESMTP; Fri, 2 Feb 2018 16:13:11 +0000 (GMT) Received: from bahia.lan (icon-9-164-151-127.megacenter.de.ibm.com [9.164.151.127]) by smtp.lab.toulouse-stg.fr.ibm.com (Postfix) with ESMTP id 8F64E220408; Fri, 2 Feb 2018 17:19:43 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Fri, 2 Feb 2018 17:19:26 +0100 X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180202161935.20803-1-groug@kaod.org> References: <20180202161935.20803-1-groug@kaod.org> X-TM-AS-GCONF: 00 x-cbid: 18020216-0008-0000-0000-000004C8DBE6 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18020216-0009-0000-0000-00001E5C7EFA Message-Id: <20180202161935.20803-2-groug@kaod.org> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2018-02-02_04:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=13 phishscore=0 bulkscore=0 spamscore=0 clxscore=1034 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802020199 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.156.1 Subject: [Qemu-devel] [PULL v2 01/10] 9pfs: drop v9fs_register_transport() 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: Peter Maydell , Greg Kurz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_6 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" No good reasons to do this outside of v9fs_device_realize_common(). Signed-off-by: Greg Kurz Reviewed-by: Stefano Stabellini --- hw/9pfs/9p.c | 6 +++++- hw/9pfs/9p.h | 10 ++-------- hw/9pfs/virtio-9p-device.c | 8 ++------ hw/9pfs/xen-9p-backend.c | 3 +-- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c index 909a61139405..364c7cb44628 100644 --- a/hw/9pfs/9p.c +++ b/hw/9pfs/9p.c @@ -3485,7 +3485,8 @@ void pdu_submit(V9fsPDU *pdu, P9MsgHeader *hdr) } =20 /* Returns 0 on success, 1 on failure. */ -int v9fs_device_realize_common(V9fsState *s, Error **errp) +int v9fs_device_realize_common(V9fsState *s, const V9fsTransport *t, + Error **errp) { int i, len; struct stat stat; @@ -3493,6 +3494,9 @@ int v9fs_device_realize_common(V9fsState *s, Error **= errp) V9fsPath path; int rc =3D 1; =20 + assert(!s->transport); + s->transport =3D t; + /* initialize pdu allocator */ QLIST_INIT(&s->free_list); QLIST_INIT(&s->active_list); diff --git a/hw/9pfs/9p.h b/hw/9pfs/9p.h index ffe658ab8975..5ced427d861b 100644 --- a/hw/9pfs/9p.h +++ b/hw/9pfs/9p.h @@ -346,7 +346,8 @@ void v9fs_path_sprintf(V9fsPath *path, const char *fmt,= ...); void v9fs_path_copy(V9fsPath *lhs, V9fsPath *rhs); int v9fs_name_to_path(V9fsState *s, V9fsPath *dirpath, const char *name, V9fsPath *path); -int v9fs_device_realize_common(V9fsState *s, Error **errp); +int v9fs_device_realize_common(V9fsState *s, const V9fsTransport *t, + Error **errp); void v9fs_device_unrealize_common(V9fsState *s, Error **errp); =20 V9fsPDU *pdu_alloc(V9fsState *s); @@ -366,11 +367,4 @@ struct V9fsTransport { void (*push_and_notify)(V9fsPDU *pdu); }; =20 -static inline int v9fs_register_transport(V9fsState *s, const V9fsTranspor= t *t) -{ - assert(!s->transport); - s->transport =3D t; - return 0; -} - #endif diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c index 43f4e53f336f..775e8ff76671 100644 --- a/hw/9pfs/virtio-9p-device.c +++ b/hw/9pfs/virtio-9p-device.c @@ -198,17 +198,13 @@ static void virtio_9p_device_realize(DeviceState *dev= , Error **errp) V9fsVirtioState *v =3D VIRTIO_9P(dev); V9fsState *s =3D &v->state; =20 - if (v9fs_device_realize_common(s, errp)) { - goto out; + if (v9fs_device_realize_common(s, &virtio_9p_transport, errp)) { + return; } =20 v->config_size =3D sizeof(struct virtio_9p_config) + strlen(s->fsconf.= tag); virtio_init(vdev, "virtio-9p", VIRTIO_ID_9P, v->config_size); v->vq =3D virtio_add_queue(vdev, MAX_REQ, handle_9p_output); - v9fs_register_transport(s, &virtio_9p_transport); - -out: - return; } =20 static void virtio_9p_device_unrealize(DeviceState *dev, Error **errp) diff --git a/hw/9pfs/xen-9p-backend.c b/hw/9pfs/xen-9p-backend.c index df2a4100bf55..14f0d6a50e75 100644 --- a/hw/9pfs/xen-9p-backend.c +++ b/hw/9pfs/xen-9p-backend.c @@ -446,7 +446,6 @@ static int xen_9pfs_connect(struct XenDevice *xendev) xen_9pdev->id =3D s->fsconf.fsdev_id =3D g_strdup_printf("xen9p%d", xendev->dev); xen_9pdev->tag =3D s->fsconf.tag =3D xenstore_read_fe_str(xendev, "tag= "); - v9fs_register_transport(s, &xen_9p_transport); fsdev =3D qemu_opts_create(qemu_find_opts("fsdev"), s->fsconf.tag, 1, NULL); @@ -455,7 +454,7 @@ static int xen_9pfs_connect(struct XenDevice *xendev) qemu_opt_set(fsdev, "security_model", xen_9pdev->security_model, NULL); qemu_opts_set_id(fsdev, s->fsconf.fsdev_id); qemu_fsdev_add(fsdev); - v9fs_device_realize_common(s, NULL); + v9fs_device_realize_common(s, &xen_9p_transport, NULL); =20 return 0; =20 --=20 2.13.6 From nobody Sat May 4 05:22:15 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 1517591630240916.6442934078057; Fri, 2 Feb 2018 09:13:50 -0800 (PST) Received: from localhost ([::1]:40592 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eheuL-0005Iv-Cs for importer@patchew.org; Fri, 02 Feb 2018 12:13:49 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54067) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehe6l-0001LV-Nw for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:23:43 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ehe4A-000494-5J for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:21:00 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:35998) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ehe48-00047J-SE for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:19:53 -0500 Received: from pps.filterd (m0098394.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w12GBYxk041357 for ; Fri, 2 Feb 2018 11:19:51 -0500 Received: from e06smtp11.uk.ibm.com (e06smtp11.uk.ibm.com [195.75.94.107]) by mx0a-001b2d01.pphosted.com with ESMTP id 2fvtexandb-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 02 Feb 2018 11:19:50 -0500 Received: from localhost by e06smtp11.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 2 Feb 2018 16:19:48 -0000 Received: from b06cxnps3075.portsmouth.uk.ibm.com (9.149.109.195) by e06smtp11.uk.ibm.com (192.168.101.141) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 2 Feb 2018 16:19:45 -0000 Received: from d06av26.portsmouth.uk.ibm.com (d06av26.portsmouth.uk.ibm.com [9.149.105.62]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w12GJifK63701202; Fri, 2 Feb 2018 16:19:44 GMT Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id DC215AE04D; Fri, 2 Feb 2018 16:11:05 +0000 (GMT) Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D429BAE056; Fri, 2 Feb 2018 16:11:05 +0000 (GMT) Received: from smtp.lab.toulouse-stg.fr.ibm.com (unknown [9.101.4.1]) by d06av26.portsmouth.uk.ibm.com (Postfix) with ESMTP; Fri, 2 Feb 2018 16:11:05 +0000 (GMT) Received: from bahia.lan (icon-9-164-151-127.megacenter.de.ibm.com [9.164.151.127]) by smtp.lab.toulouse-stg.fr.ibm.com (Postfix) with ESMTP id 0AD9B22011B; Fri, 2 Feb 2018 17:19:43 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Fri, 2 Feb 2018 17:19:27 +0100 X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180202161935.20803-1-groug@kaod.org> References: <20180202161935.20803-1-groug@kaod.org> X-TM-AS-GCONF: 00 x-cbid: 18020216-0040-0000-0000-0000042BDA2C X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18020216-0041-0000-0000-000020CF7FDD Message-Id: <20180202161935.20803-3-groug@kaod.org> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2018-02-02_04:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=3 phishscore=0 bulkscore=0 spamscore=0 clxscore=1034 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802020199 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.156.1 Subject: [Qemu-devel] [PULL v2 02/10] 9pfs: Correctly handle cancelled requests 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: Peter Maydell , Keno Fischer , Greg Kurz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Keno Fischer # Background I was investigating spurious non-deterministic EINTR returns from various 9p file system operations in a Linux guest served from the qemu 9p server. ## EINTR, ERESTARTSYS and the linux kernel When a signal arrives that the Linux kernel needs to deliver to user-space while a given thread is blocked (in the 9p case waiting for a reply to its request in 9p_client_rpc -> wait_event_interruptible), it asks whatever driver is currently running to abort its current operation (in the 9p case causing the submission of a TFLUSH message) and return to user space. In these situations, the error message reported is generally ERESTARTSYS. If the userspace processes specified SA_RESTART, this means that the system call will get restarted upon completion of the signal handler delivery (assuming the signal handler doesn't modify the process state in complicated ways not relevant here). If SA_RESTART is not specified, ERESTARTSYS gets translated to EINTR and user space is expected to handle the restart itself. ## The 9p TFLUSH command The 9p TFLUSH commands requests that the server abort an ongoing operation. The man page [1] specifies: ``` If it recognizes oldtag as the tag of a pending transaction, it should abort any pending response and discard that tag. [...] When the client sends a Tflush, it must wait to receive the corresponding Rflush before reusing oldtag for subsequent messages. If a response to the flushed request is received before the Rflush, the client must honor the response as if it had not been flushed, since the completed request may signify a state change in the server ``` In particular, this means that the server must not send a reply with the orignal tag in response to the cancellation request, because the client is obligated to interpret such a reply as a coincidental reply to the original request. # The bug When qemu receives a TFlush request, it sets the `cancelled` flag on the relevant pdu. This flag is periodically checked, e.g. in `v9fs_co_name_to_path`, and if set, the operation is aborted and the error is set to EINTR. However, the server then violates the spec, by returning to the client an Rerror response, rather than discarding the message entirely. As a result, the client is required to assume that said Rerror response is a result of the original request, not a result of the cancellation and thus passes the EINTR error back to user space. This is not the worst thing it could do, however as discussed above, the correct error code would have been ERESTARTSYS, such that user space programs with SA_RESTART set get correctly restarted upon completion of the signal handler. Instead, such programs get spurious EINTR results that they were not expecting to handle. It should be noted that there are plenty of user space programs that do not set SA_RESTART and do not correctly handle EINTR either. However, that is then a userspace bug. It should also be noted that this bug has been mitigated by a recent commit to the Linux kernel [2], which essentially prevents the kernel from sending Tflush requests unless the process is about to die (in which case the process likely doesn't care about the response). Nevertheless, for older kernels and to comply with the spec, I believe this change is beneficial. # Implementation The fix is fairly simple, just skipping notification of a reply if the pdu was previously cancelled. We do however, also notify the transport layer that we're doing this, so it can clean up any resources it may be holding. I also added a new trace event to distinguish operations that caused an error reply from those that were cancelled. One complication is that we only omit sending the message on EINTR errors in order to avoid confusing the rest of the code (which may assume that a client knows about a fid if it sucessfully passed it off to pud_complete without checking for cancellation status). This does mean that if the server acts upon the cancellation flag, it always needs to set err to EINTR. I believe this is true of the current code. [1] https://9fans.github.io/plan9port/man/man9/flush.html [2] https://github.com/torvalds/linux/commit/9523feac272ccad2ad8186ba4fcc891 Signed-off-by: Keno Fischer Reviewed-by: Greg Kurz [groug, send a zero-sized reply instead of detaching the buffer] Signed-off-by: Greg Kurz Acked-by: Michael S. Tsirkin Reviewed-by: Stefano Stabellini --- hw/9pfs/9p.c | 18 ++++++++++++++++++ hw/9pfs/trace-events | 1 + 2 files changed, 19 insertions(+) diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c index 364c7cb44628..e88bb50f1365 100644 --- a/hw/9pfs/9p.c +++ b/hw/9pfs/9p.c @@ -630,6 +630,24 @@ static void coroutine_fn pdu_complete(V9fsPDU *pdu, ss= ize_t len) V9fsState *s =3D pdu->s; int ret; =20 + /* + * The 9p spec requires that successfully cancelled pdus receive no re= ply. + * Sending a reply would confuse clients because they would + * assume that any EINTR is the actual result of the operation, + * rather than a consequence of the cancellation. However, if + * the operation completed (succesfully or with an error other + * than caused be cancellation), we do send out that reply, both + * for efficiency and to avoid confusing the rest of the state machine + * that assumes passing a non-error here will mean a successful + * transmission of the reply. + */ + bool discard =3D pdu->cancelled && len =3D=3D -EINTR; + if (discard) { + trace_v9fs_rcancel(pdu->tag, pdu->id); + pdu->size =3D 0; + goto out_notify; + } + if (len < 0) { int err =3D -len; len =3D 7; diff --git a/hw/9pfs/trace-events b/hw/9pfs/trace-events index 08a4abf22ea4..1aee350c42f1 100644 --- a/hw/9pfs/trace-events +++ b/hw/9pfs/trace-events @@ -1,6 +1,7 @@ # See docs/devel/tracing.txt for syntax documentation. =20 # hw/9pfs/virtio-9p.c +v9fs_rcancel(uint16_t tag, uint8_t id) "tag %d id %d" v9fs_rerror(uint16_t tag, uint8_t id, int err) "tag %d id %d err %d" v9fs_version(uint16_t tag, uint8_t id, int32_t msize, char* version) "tag = %d id %d msize %d version %s" v9fs_version_return(uint16_t tag, uint8_t id, int32_t msize, char* version= ) "tag %d id %d msize %d version %s" --=20 2.13.6 From nobody Sat May 4 05:22:15 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 1517596050461507.5723734326932; Fri, 2 Feb 2018 10:27:30 -0800 (PST) Received: from localhost ([::1]:47772 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehg3d-0005Qp-6B for importer@patchew.org; Fri, 02 Feb 2018 13:27:29 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36124) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehfhM-0001Qm-5I for qemu-devel@nongnu.org; Fri, 02 Feb 2018 13:05:29 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ehfgG-0003XI-Oo for qemu-devel@nongnu.org; Fri, 02 Feb 2018 13:04:28 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:58980) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ehe47-00045l-TL for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:19:52 -0500 Received: from pps.filterd (m0098410.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w12GIpwD039268 for ; Fri, 2 Feb 2018 11:19:51 -0500 Received: from e06smtp14.uk.ibm.com (e06smtp14.uk.ibm.com [195.75.94.110]) by mx0a-001b2d01.pphosted.com with ESMTP id 2fvrmaree1-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 02 Feb 2018 11:19:50 -0500 Received: from localhost by e06smtp14.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 2 Feb 2018 16:19:47 -0000 Received: from b06cxnps4075.portsmouth.uk.ibm.com (9.149.109.197) by e06smtp14.uk.ibm.com (192.168.101.144) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 2 Feb 2018 16:19:45 -0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w12GJjIF42926310; Fri, 2 Feb 2018 16:19:45 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6920A4C046; Fri, 2 Feb 2018 16:13:40 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 573254C040; Fri, 2 Feb 2018 16:13:40 +0000 (GMT) Received: from smtp.lab.toulouse-stg.fr.ibm.com (unknown [9.101.4.1]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Fri, 2 Feb 2018 16:13:40 +0000 (GMT) Received: from bahia.lan (icon-9-164-151-127.megacenter.de.ibm.com [9.164.151.127]) by smtp.lab.toulouse-stg.fr.ibm.com (Postfix) with ESMTP id 87A46220408; Fri, 2 Feb 2018 17:19:44 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Fri, 2 Feb 2018 17:19:28 +0100 X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180202161935.20803-1-groug@kaod.org> References: <20180202161935.20803-1-groug@kaod.org> X-TM-AS-GCONF: 00 x-cbid: 18020216-0016-0000-0000-0000051ED489 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18020216-0017-0000-0000-0000285B7DC7 Message-Id: <20180202161935.20803-4-groug@kaod.org> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2018-02-02_04:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=4 phishscore=0 bulkscore=0 spamscore=0 clxscore=1034 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802020199 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.156.1 Subject: [Qemu-devel] [PULL v2 03/10] 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: Peter Maydell , Greg Kurz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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); --=20 2.13.6 From nobody Sat May 4 05:22:15 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 1517593031127559.9547338487076; Fri, 2 Feb 2018 09:37:11 -0800 (PST) Received: from localhost ([::1]:42124 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehfGv-00016q-Tn for importer@patchew.org; Fri, 02 Feb 2018 12:37:09 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53573) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehe6X-0000zW-Ia for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:23:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ehe4A-00049Q-D8 for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:21:00 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:56886 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ehe49-00047c-4f for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:19:53 -0500 Received: from pps.filterd (m0098417.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w12GBcdm079742 for ; Fri, 2 Feb 2018 11:19:50 -0500 Received: from e06smtp15.uk.ibm.com (e06smtp15.uk.ibm.com [195.75.94.111]) by mx0a-001b2d01.pphosted.com with ESMTP id 2fvtexjq1m-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 02 Feb 2018 11:19:49 -0500 Received: from localhost by e06smtp15.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 2 Feb 2018 16:19:48 -0000 Received: from b06cxnps3074.portsmouth.uk.ibm.com (9.149.109.194) by e06smtp15.uk.ibm.com (192.168.101.145) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 2 Feb 2018 16:19:46 -0000 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w12GJjTn66388120; Fri, 2 Feb 2018 16:19:45 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 158ED11C054; Fri, 2 Feb 2018 16:13:13 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 03D6611C04A; Fri, 2 Feb 2018 16:13:13 +0000 (GMT) Received: from smtp.lab.toulouse-stg.fr.ibm.com (unknown [9.101.4.1]) by d06av25.portsmouth.uk.ibm.com (Postfix) with ESMTP; Fri, 2 Feb 2018 16:13:12 +0000 (GMT) Received: from bahia.lan (icon-9-164-151-127.megacenter.de.ibm.com [9.164.151.127]) by smtp.lab.toulouse-stg.fr.ibm.com (Postfix) with ESMTP id 00CAC22011B; Fri, 2 Feb 2018 17:19:44 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Fri, 2 Feb 2018 17:19:29 +0100 X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180202161935.20803-1-groug@kaod.org> References: <20180202161935.20803-1-groug@kaod.org> X-TM-AS-GCONF: 00 x-cbid: 18020216-0020-0000-0000-000003F1BF08 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18020216-0021-0000-0000-000042842CCB Message-Id: <20180202161935.20803-5-groug@kaod.org> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2018-02-02_04:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=13 phishscore=0 bulkscore=0 spamscore=0 clxscore=1034 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802020199 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.158.5 Subject: [Qemu-devel] [PULL v2 04/10] 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: Peter Maydell , Greg Kurz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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); --=20 2.13.6 From nobody Sat May 4 05:22:15 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 1517596589141754.8817591835453; Fri, 2 Feb 2018 10:36:29 -0800 (PST) Received: from localhost ([::1]:48770 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehgCK-0005E6-Ap for importer@patchew.org; Fri, 02 Feb 2018 13:36:28 -0500 Received: from eggs.gnu.org ([208.118.235.92]:44783) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehfrp-0002sO-7e for qemu-devel@nongnu.org; Fri, 02 Feb 2018 13:17:19 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ehfqn-0004PE-4r for qemu-devel@nongnu.org; Fri, 02 Feb 2018 13:15:16 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:52562 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ehe47-00045u-Lo for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:19:51 -0500 Received: from pps.filterd (m0098414.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w12GBc2K124438 for ; Fri, 2 Feb 2018 11:19:51 -0500 Received: from e06smtp15.uk.ibm.com (e06smtp15.uk.ibm.com [195.75.94.111]) by mx0b-001b2d01.pphosted.com with ESMTP id 2fvtvgsg56-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 02 Feb 2018 11:19:50 -0500 Received: from localhost by e06smtp15.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 2 Feb 2018 16:19:48 -0000 Received: from b06cxnps4076.portsmouth.uk.ibm.com (9.149.109.198) by e06smtp15.uk.ibm.com (192.168.101.145) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 2 Feb 2018 16:19:46 -0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w12GJksG37355676; Fri, 2 Feb 2018 16:19:46 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 46FC54C046; Fri, 2 Feb 2018 16:13:41 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 357554C050; Fri, 2 Feb 2018 16:13:41 +0000 (GMT) Received: from smtp.lab.toulouse-stg.fr.ibm.com (unknown [9.101.4.1]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Fri, 2 Feb 2018 16:13:41 +0000 (GMT) Received: from bahia.lan (icon-9-164-151-127.megacenter.de.ibm.com [9.164.151.127]) by smtp.lab.toulouse-stg.fr.ibm.com (Postfix) with ESMTP id 6BBDE220408; Fri, 2 Feb 2018 17:19:45 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Fri, 2 Feb 2018 17:19:30 +0100 X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180202161935.20803-1-groug@kaod.org> References: <20180202161935.20803-1-groug@kaod.org> X-TM-AS-GCONF: 00 x-cbid: 18020216-0020-0000-0000-000003F1BF09 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18020216-0021-0000-0000-000042842CCC Message-Id: <20180202161935.20803-6-groug@kaod.org> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2018-02-02_04:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=13 phishscore=0 bulkscore=0 spamscore=0 clxscore=1034 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802020199 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.158.5 Subject: [Qemu-devel] [PULL v2 05/10] 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: Peter Maydell , Greg Kurz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 --=20 2.13.6 From nobody Sat May 4 05:22:15 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 1517591799118229.61734736711253; Fri, 2 Feb 2018 09:16:39 -0800 (PST) Received: from localhost ([::1]:40714 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehex4-00080z-6v for importer@patchew.org; Fri, 02 Feb 2018 12:16:38 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54161) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehe6p-0001OK-0R for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:23:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ehe4A-00048o-43 for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:21:00 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:45428) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ehe48-00046m-I1 for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:19:53 -0500 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w12GGxg4107654 for ; Fri, 2 Feb 2018 11:19:51 -0500 Received: from e06smtp14.uk.ibm.com (e06smtp14.uk.ibm.com [195.75.94.110]) by mx0a-001b2d01.pphosted.com with ESMTP id 2fvrynq8q1-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 02 Feb 2018 11:19:51 -0500 Received: from localhost by e06smtp14.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 2 Feb 2018 16:19:48 -0000 Received: from b06cxnps3074.portsmouth.uk.ibm.com (9.149.109.194) by e06smtp14.uk.ibm.com (192.168.101.144) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 2 Feb 2018 16:19:46 -0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w12GJkJk65208478; Fri, 2 Feb 2018 16:19:46 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 99547A4051; Fri, 2 Feb 2018 16:13:16 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 87D5FA4040; Fri, 2 Feb 2018 16:13:16 +0000 (GMT) Received: from smtp.lab.toulouse-stg.fr.ibm.com (unknown [9.101.4.1]) by d06av23.portsmouth.uk.ibm.com (Postfix) with ESMTP; Fri, 2 Feb 2018 16:13:16 +0000 (GMT) Received: from bahia.lan (icon-9-164-151-127.megacenter.de.ibm.com [9.164.151.127]) by smtp.lab.toulouse-stg.fr.ibm.com (Postfix) with ESMTP id D37C422011B; Fri, 2 Feb 2018 17:19:45 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Fri, 2 Feb 2018 17:19:31 +0100 X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180202161935.20803-1-groug@kaod.org> References: <20180202161935.20803-1-groug@kaod.org> X-TM-AS-GCONF: 00 x-cbid: 18020216-0016-0000-0000-0000051ED48A X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18020216-0017-0000-0000-0000285B7DC8 Message-Id: <20180202161935.20803-7-groug@kaod.org> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2018-02-02_04:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=13 phishscore=0 bulkscore=0 spamscore=0 clxscore=1034 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802020199 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.156.1 Subject: [Qemu-devel] [PULL v2 06/10] 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: Peter Maydell , Greg Kurz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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(); } --=20 2.13.6 From nobody Sat May 4 05:22:15 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 1517591455469786.0902836344349; Fri, 2 Feb 2018 09:10:55 -0800 (PST) Received: from localhost ([::1]:40417 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eherW-0002Rq-Ey for importer@patchew.org; Fri, 02 Feb 2018 12:10:54 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54170) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehe5l-0001ON-Go for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:22:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ehe4A-00049h-FN for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:21:00 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:49516) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ehe49-00047j-JP for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:19:53 -0500 Received: from pps.filterd (m0098404.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w12GJpDN023423 for ; Fri, 2 Feb 2018 11:19:52 -0500 Received: from e06smtp12.uk.ibm.com (e06smtp12.uk.ibm.com [195.75.94.108]) by mx0a-001b2d01.pphosted.com with ESMTP id 2fvsncndsn-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 02 Feb 2018 11:19:51 -0500 Received: from localhost by e06smtp12.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 2 Feb 2018 16:19:48 -0000 Received: from b06cxnps4074.portsmouth.uk.ibm.com (9.149.109.196) by e06smtp12.uk.ibm.com (192.168.101.142) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 2 Feb 2018 16:19:47 -0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06cxnps4074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w12GJkYh46268534; Fri, 2 Feb 2018 16:19:46 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0DEC6A4055; Fri, 2 Feb 2018 16:13:17 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id F07D9A4051; Fri, 2 Feb 2018 16:13:16 +0000 (GMT) Received: from smtp.lab.toulouse-stg.fr.ibm.com (unknown [9.101.4.1]) by d06av23.portsmouth.uk.ibm.com (Postfix) with ESMTP; Fri, 2 Feb 2018 16:13:16 +0000 (GMT) Received: from bahia.lan (icon-9-164-151-127.megacenter.de.ibm.com [9.164.151.127]) by smtp.lab.toulouse-stg.fr.ibm.com (Postfix) with ESMTP id 48BEA220408; Fri, 2 Feb 2018 17:19:46 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Fri, 2 Feb 2018 17:19:32 +0100 X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180202161935.20803-1-groug@kaod.org> References: <20180202161935.20803-1-groug@kaod.org> X-TM-AS-GCONF: 00 x-cbid: 18020216-0008-0000-0000-000004C8DBE8 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18020216-0009-0000-0000-00001E5C7EFB Message-Id: <20180202161935.20803-8-groug@kaod.org> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2018-02-02_04:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=13 phishscore=0 bulkscore=0 spamscore=0 clxscore=1034 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802020199 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.156.1 Subject: [Qemu-devel] [PULL v2 07/10] 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: Peter Maydell , Greg Kurz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Trivial test of a successful write. Signed-off-by: Greg Kurz (groug, handle potential overflow when computing request size, add missing g_free(buf), backend handles one written byte at a time to validate the server doesn't do short-reads) Reviewed-by: Stefan Hajnoczi --- hw/9pfs/9p-synth.c | 11 +++++++++ hw/9pfs/9p-synth.h | 1 + tests/virtio-9p-test.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 75 insertions(+) diff --git a/hw/9pfs/9p-synth.c b/hw/9pfs/9p-synth.c index f17b74f44461..ade346070601 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 1; +} + 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..12315aeb4e5b 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,34 @@ 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; + uint32_t body_size =3D 4 + 8 + 4; + + g_assert_cmpint(body_size, <=3D, UINT32_MAX - count); + body_size +=3D count; + req =3D v9fs_req_init(v9p, body_size, 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 +560,32 @@ 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_malloc0(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(buf); + g_free(wnames[0]); +} + typedef void (*v9fs_test_fn)(QVirtIO9P *v9p); =20 static void v9fs_run_pci_test(gconstpointer data) @@ -554,6 +616,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(); } --=20 2.13.6 From nobody Sat May 4 05:22:15 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 1517592824787901.4990193164949; Fri, 2 Feb 2018 09:33:44 -0800 (PST) Received: from localhost ([::1]:41935 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehfDb-0006XI-TQ for importer@patchew.org; Fri, 02 Feb 2018 12:33:43 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53573) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehe5Q-0000zW-Mw for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:22:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ehe4C-0004CA-Pg for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:21:02 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:55520) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ehe4B-00049y-C5 for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:19:56 -0500 Received: from pps.filterd (m0098409.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w12GJ68w009007 for ; Fri, 2 Feb 2018 11:19:54 -0500 Received: from e06smtp12.uk.ibm.com (e06smtp12.uk.ibm.com [195.75.94.108]) by mx0a-001b2d01.pphosted.com with ESMTP id 2fvsskct67-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 02 Feb 2018 11:19:52 -0500 Received: from localhost by e06smtp12.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 2 Feb 2018 16:19:50 -0000 Received: from b06cxnps4074.portsmouth.uk.ibm.com (9.149.109.196) by e06smtp12.uk.ibm.com (192.168.101.142) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 2 Feb 2018 16:19:47 -0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06cxnps4074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w12GJlgW34144448; Fri, 2 Feb 2018 16:19:47 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 80EEDA4040; Fri, 2 Feb 2018 16:13:17 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 658D1A404D; Fri, 2 Feb 2018 16:13:17 +0000 (GMT) Received: from smtp.lab.toulouse-stg.fr.ibm.com (unknown [9.101.4.1]) by d06av23.portsmouth.uk.ibm.com (Postfix) with ESMTP; Fri, 2 Feb 2018 16:13:17 +0000 (GMT) Received: from bahia.lan (icon-9-164-151-127.megacenter.de.ibm.com [9.164.151.127]) by smtp.lab.toulouse-stg.fr.ibm.com (Postfix) with ESMTP id B170F22011B; Fri, 2 Feb 2018 17:19:46 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Fri, 2 Feb 2018 17:19:33 +0100 X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180202161935.20803-1-groug@kaod.org> References: <20180202161935.20803-1-groug@kaod.org> X-TM-AS-GCONF: 00 x-cbid: 18020216-0008-0000-0000-000004C8DBE9 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18020216-0009-0000-0000-00001E5C7EFD Message-Id: <20180202161935.20803-9-groug@kaod.org> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2018-02-02_04:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=13 phishscore=0 bulkscore=0 spamscore=0 clxscore=1034 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802020199 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.156.1 Subject: [Qemu-devel] [PULL v2 08/10] 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: Peter Maydell , Greg Kurz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 12315aeb4e5b..0d0341491e79 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)); --=20 2.13.6 From nobody Sat May 4 05:22:15 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 1517591273994935.1785649623226; Fri, 2 Feb 2018 09:07:53 -0800 (PST) Received: from localhost ([::1]:40306 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eheoW-0008Dw-Ug for importer@patchew.org; Fri, 02 Feb 2018 12:07:49 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47776) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehe5I-0006iE-MQ for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:22:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ehe4C-0004Br-MY for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:21:02 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:45772) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ehe4B-00049v-9R for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:19:56 -0500 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w12GHcQv109417 for ; Fri, 2 Feb 2018 11:19:54 -0500 Received: from e06smtp14.uk.ibm.com (e06smtp14.uk.ibm.com [195.75.94.110]) by mx0a-001b2d01.pphosted.com with ESMTP id 2fvrynq8s4-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 02 Feb 2018 11:19:53 -0500 Received: from localhost by e06smtp14.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 2 Feb 2018 16:19:51 -0000 Received: from b06cxnps4076.portsmouth.uk.ibm.com (9.149.109.198) by e06smtp14.uk.ibm.com (192.168.101.144) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 2 Feb 2018 16:19:48 -0000 Received: from d06av24.portsmouth.uk.ibm.com (mk.ibm.com [9.149.105.60]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w12GJlij47054950; Fri, 2 Feb 2018 16:19:47 GMT Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4654842042; Fri, 2 Feb 2018 16:12:51 +0000 (GMT) Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 29CF142047; Fri, 2 Feb 2018 16:12:51 +0000 (GMT) Received: from smtp.lab.toulouse-stg.fr.ibm.com (unknown [9.101.4.1]) by d06av24.portsmouth.uk.ibm.com (Postfix) with ESMTP; Fri, 2 Feb 2018 16:12:51 +0000 (GMT) Received: from bahia.lan (icon-9-164-151-127.megacenter.de.ibm.com [9.164.151.127]) by smtp.lab.toulouse-stg.fr.ibm.com (Postfix) with ESMTP id 2667D220408; Fri, 2 Feb 2018 17:19:47 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Fri, 2 Feb 2018 17:19:34 +0100 X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180202161935.20803-1-groug@kaod.org> References: <20180202161935.20803-1-groug@kaod.org> X-TM-AS-GCONF: 00 x-cbid: 18020216-0016-0000-0000-0000051ED48D X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18020216-0017-0000-0000-0000285B7DCA Message-Id: <20180202161935.20803-10-groug@kaod.org> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2018-02-02_04:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=15 phishscore=0 bulkscore=0 spamscore=0 clxscore=1034 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802020199 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.156.1 Subject: [Qemu-devel] [PULL v2 09/10] 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: Peter Maydell , Greg Kurz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 (groug, change the test to only write a single byte to avoid any alignment or endianess consideration) --- hw/9pfs/9p-synth.c | 20 +++++++++ hw/9pfs/9p-synth.h | 7 +++ hw/9pfs/9p.c | 1 + tests/virtio-9p-test.c | 117 +++++++++++++++++++++++++++++++++++++++++++--= ---- 4 files changed, 132 insertions(+), 13 deletions(-) diff --git a/hw/9pfs/9p-synth.c b/hw/9pfs/9p-synth.c index ade346070601..18082dffe865 100644 --- a/hw/9pfs/9p-synth.c +++ b/hw/9pfs/9p-synth.c @@ -521,6 +521,20 @@ static ssize_t v9fs_synth_qtest_write(void *buf, int l= en, off_t offset, return 1; } =20 +static ssize_t v9fs_synth_qtest_flush_write(void *buf, int len, off_t offs= et, + void *arg) +{ + bool should_block =3D !!*(uint8_t *)buf; + + if (should_block) { + /* This will cause the server to call us again until we're cancell= ed */ + errno =3D EINTR; + return -1; + } + + return 1; +} + static int synth_init(FsContext *ctx, Error **errp) { QLIST_INIT(&synth_root.child); @@ -557,6 +571,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..af7a993a1e8e 100644 --- a/hw/9pfs/9p-synth.h +++ b/hw/9pfs/9p-synth.h @@ -55,4 +55,11 @@ int qemu_v9fs_synth_add_file(V9fsSynthNode *parent, int = mode, #define QTEST_V9FS_SYNTH_LOPEN_FILE "LOPEN" #define QTEST_V9FS_SYNTH_WRITE_FILE "WRITE" =20 +/* Any write to the "FLUSH" file is handled one byte at a time by the + * backend. If the byte is zero, the backend returns success (ie, 1), + * otherwise it forces the server to try again forever. Thus allowing + * the client to cancel the request. + */ +#define QTEST_V9FS_SYNTH_FLUSH_FILE "FLUSH" + #endif diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c index e88bb50f1365..85a1ed8171a4 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 0d0341491e79..0d3334a6ce17 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 @@ -454,6 +455,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"; @@ -462,7 +481,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)); @@ -476,7 +495,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 @@ -494,7 +513,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); @@ -514,7 +533,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); @@ -530,11 +549,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); @@ -550,11 +569,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]); @@ -570,15 +589,15 @@ 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 @@ -586,6 +605,76 @@ static void fs_write(QVirtIO9P *v9p) g_free(wnames[0]); } =20 +static void fs_flush_success(QVirtIO9P *v9p) +{ + char *const wnames[] =3D { g_strdup(QTEST_V9FS_SYNTH_FLUSH_FILE) }; + P9Req *req, *flush_req; + uint32_t reply_len; + uint8_t should_block; + + 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. + */ + should_block =3D 1; + req =3D v9fs_twrite(v9p, 1, 0, sizeof(should_block), &should_block, 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) }; + P9Req *req, *flush_req; + uint32_t count; + uint8_t should_block; + + 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. + */ + should_block =3D 0; + req =3D v9fs_twrite(v9p, 1, 0, sizeof(should_block), &should_block, 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(should_block)); + v9fs_rflush(flush_req); + + g_free(wnames[0]); +} + typedef void (*v9fs_test_fn)(QVirtIO9P *v9p); =20 static void v9fs_run_pci_test(gconstpointer data) @@ -617,6 +706,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(); } --=20 2.13.6 From nobody Sat May 4 05:22:15 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 1517593522396750.6872623165532; Fri, 2 Feb 2018 09:45:22 -0800 (PST) Received: from localhost ([::1]:42506 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehfOr-00008F-Hf for importer@patchew.org; Fri, 02 Feb 2018 12:45:21 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53354) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ehe5F-0000wH-QV for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:22:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ehe4A-0004AG-Vk for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:21:00 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:49428 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ehe4A-00049M-I7 for qemu-devel@nongnu.org; Fri, 02 Feb 2018 11:19:54 -0500 Received: from pps.filterd (m0098413.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w12GBbIA113964 for ; Fri, 2 Feb 2018 11:19:52 -0500 Received: from e06smtp14.uk.ibm.com (e06smtp14.uk.ibm.com [195.75.94.110]) by mx0b-001b2d01.pphosted.com with ESMTP id 2fvqy6a45a-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 02 Feb 2018 11:19:52 -0500 Received: from localhost by e06smtp14.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 2 Feb 2018 16:19:50 -0000 Received: from b06cxnps4075.portsmouth.uk.ibm.com (9.149.109.197) by e06smtp14.uk.ibm.com (192.168.101.144) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 2 Feb 2018 16:19:48 -0000 Received: from d06av26.portsmouth.uk.ibm.com (d06av26.portsmouth.uk.ibm.com [9.149.105.62]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w12GJmbD47906822; Fri, 2 Feb 2018 16:19:48 GMT Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 65B6CAE04D; Fri, 2 Feb 2018 16:11:09 +0000 (GMT) Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 52750AE051; Fri, 2 Feb 2018 16:11:09 +0000 (GMT) Received: from smtp.lab.toulouse-stg.fr.ibm.com (unknown [9.101.4.1]) by d06av26.portsmouth.uk.ibm.com (Postfix) with ESMTP; Fri, 2 Feb 2018 16:11:09 +0000 (GMT) Received: from bahia.lan (icon-9-164-151-127.megacenter.de.ibm.com [9.164.151.127]) by smtp.lab.toulouse-stg.fr.ibm.com (Postfix) with ESMTP id 8FACA22011B; Fri, 2 Feb 2018 17:19:47 +0100 (CET) From: Greg Kurz To: qemu-devel@nongnu.org Date: Fri, 2 Feb 2018 17:19:35 +0100 X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180202161935.20803-1-groug@kaod.org> References: <20180202161935.20803-1-groug@kaod.org> X-TM-AS-GCONF: 00 x-cbid: 18020216-0016-0000-0000-0000051ED48C X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18020216-0017-0000-0000-0000285B7DCB Message-Id: <20180202161935.20803-11-groug@kaod.org> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2018-02-02_04:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=4 phishscore=0 bulkscore=0 spamscore=0 clxscore=1034 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1802020199 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.158.5 Subject: [Qemu-devel] [PULL v2 10/10] tests/virtio-9p: explicitly handle potential integer overflows 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: Peter Maydell , Greg Kurz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Greg Kurz Reviewed-by: Eric Blake Reviewed-by: Stefan Hajnoczi --- tests/virtio-9p-test.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c index 0d3334a6ce17..54edcb995542 100644 --- a/tests/virtio-9p-test.c +++ b/tests/virtio-9p-test.c @@ -168,7 +168,7 @@ static uint16_t v9fs_string_size(const char *string) { size_t len =3D strlen(string); =20 - g_assert_cmpint(len, <=3D, UINT16_MAX); + g_assert_cmpint(len, <=3D, UINT16_MAX - 2); =20 return 2 + len; } @@ -209,17 +209,20 @@ static P9Req *v9fs_req_init(QVirtIO9P *v9p, uint32_t = size, uint8_t id, uint16_t tag) { P9Req *req =3D g_new0(P9Req, 1); - uint32_t t_size =3D 7 + size; /* 9P header has well-known size of 7 by= tes */ + uint32_t total_size =3D 7; /* 9P header has well-known size of 7 bytes= */ P9Hdr hdr =3D { - .size =3D cpu_to_le32(t_size), .id =3D id, .tag =3D cpu_to_le16(tag) }; =20 - g_assert_cmpint(t_size, <=3D, P9_MAX_SIZE); + g_assert_cmpint(total_size, <=3D, UINT32_MAX - size); + total_size +=3D size; + hdr.size =3D cpu_to_le32(total_size); + + g_assert_cmpint(total_size, <=3D, P9_MAX_SIZE); =20 req->v9p =3D v9p; - req->t_size =3D t_size; + req->t_size =3D total_size; req->t_msg =3D guest_alloc(v9p->qs->alloc, req->t_size); v9fs_memwrite(req, &hdr, 7); req->tag =3D tag; @@ -305,8 +308,13 @@ static void v9fs_rlerror(P9Req *req, uint32_t *err) 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, - tag); + P9Req *req; + uint32_t body_size =3D 4; + uint16_t string_size =3D v9fs_string_size(version); + + g_assert_cmpint(body_size, <=3D, UINT32_MAX - string_size); + body_size +=3D string_size; + req =3D v9fs_req_init(v9p, body_size, P9_TVERSION, tag); =20 v9fs_uint32_write(req, msize); v9fs_string_write(req, version); @@ -366,12 +374,15 @@ static P9Req *v9fs_twalk(QVirtIO9P *v9p, uint32_t fid= , uint32_t newfid, { P9Req *req; int i; - uint32_t size =3D 4 + 4 + 2; + uint32_t body_size =3D 4 + 4 + 2; =20 for (i =3D 0; i < nwname; i++) { - size +=3D v9fs_string_size(wnames[i]); + uint16_t wname_size =3D v9fs_string_size(wnames[i]); + + g_assert_cmpint(body_size, <=3D, UINT32_MAX - wname_size); + body_size +=3D wname_size; } - req =3D v9fs_req_init(v9p, size, P9_TWALK, tag); + req =3D v9fs_req_init(v9p, body_size, P9_TWALK, tag); v9fs_uint32_write(req, fid); v9fs_uint32_write(req, newfid); v9fs_uint16_write(req, nwname); --=20 2.13.6