From nobody Tue May 21 22:34:10 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1711974968; cv=none; d=zohomail.com; s=zohoarc; b=MOEMSAh1wauZtQWlkn++n0LAwYvzkTBJc+oGAubwKZppVVH7xVneBf3+NriBz8cfZLVO9JHlJI9OpFXiI3cty4fJSh53FLqIMFHDwJqWrsFpgzLHTeVwaDxx/aO1+ZqQaRTiz3U40UJdpJljG5rJx4BWL/wBwwiEaqqB5erSAbM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1711974968; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=+i6/JIXBjwYwLmO8A1dzg7Dpfm4F6Y8Fo9/nAIhiCLI=; b=fvlAwIba4zRkE4wMOlUlqNGAJuMmqwBjqSjT2dzIZE8X9K9WVwT1mhvx7SzOLiRYchDlMHrqu7jniMEfpERrc1laLUvTtEiUfHFXjjlne/+gZCK4Gz90rlDD+iOKoheoXBhd5D8/vh6Z9rkeIIA2hSAn7vRmymWIU70gFQOCQs4= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1711974968560517.1580111462828; Mon, 1 Apr 2024 05:36:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rrGsb-0000LA-1D; Mon, 01 Apr 2024 08:35:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rrGs5-0008Kd-D1; Mon, 01 Apr 2024 08:34:43 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rrGs1-0000gO-Eb; Mon, 01 Apr 2024 08:34:41 -0400 Received: from mail.maildlp.com (unknown [172.19.88.214]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4V7Vms1D2Jz1GFPy; Mon, 1 Apr 2024 20:33:49 +0800 (CST) Received: from dggpeml500011.china.huawei.com (unknown [7.185.36.84]) by mail.maildlp.com (Postfix) with ESMTPS id 8F58C1A016C; Mon, 1 Apr 2024 20:34:25 +0800 (CST) Received: from huawei.com (10.91.158.201) by dggpeml500011.china.huawei.com (7.185.36.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.35; Mon, 1 Apr 2024 20:34:24 +0800 To: CC: , , , , , , , , , , Subject: [PATCH v2 1/1] nbd/server: do not poll within a coroutine context Date: Mon, 1 Apr 2024 20:41:20 +0800 Message-ID: <20240401124120.4020988-1-zhuyangyang14@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20240401123342.3947762-1-zhuyangyang14@huawei.com> References: <20240401123342.3947762-1-zhuyangyang14@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.91.158.201] X-ClientProxiedBy: dggems705-chm.china.huawei.com (10.3.19.182) To dggpeml500011.china.huawei.com (7.185.36.84) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=45.249.212.191; envelope-from=zhuyangyang14@huawei.com; helo=szxga05-in.huawei.com X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Zhu Yangyang From: Zhu Yangyang via Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZM-MESSAGEID: 1711974970106100001 Content-Type: text/plain; charset="utf-8" Coroutines are not supposed to block. Instead, they should yield. Fixes: f95910f ("nbd: implement TLS support in the protocol negotiation") Signed-off-by: Zhu Yangyang --- nbd/client.c | 7 ++++--- nbd/common.c | 19 ++++++++++++++++--- nbd/nbd-internal.h | 6 +++--- nbd/server.c | 10 +++++----- 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/nbd/client.c b/nbd/client.c index 29ffc609a4..1ab91ed205 100644 --- a/nbd/client.c +++ b/nbd/client.c @@ -619,18 +619,19 @@ static QIOChannel *nbd_receive_starttls(QIOChannel *i= oc, return NULL; } qio_channel_set_name(QIO_CHANNEL(tioc), "nbd-client-tls"); - data.loop =3D g_main_loop_new(g_main_context_default(), FALSE); trace_nbd_receive_starttls_tls_handshake(); qio_channel_tls_handshake(tioc, - nbd_tls_handshake, + nbd_client_tls_handshake, &data, NULL, NULL); =20 if (!data.complete) { + data.loop =3D g_main_loop_new(g_main_context_default(), FALSE); g_main_loop_run(data.loop); + g_main_loop_unref(data.loop); } - g_main_loop_unref(data.loop); + if (data.error) { error_propagate(errp, data.error); object_unref(OBJECT(tioc)); diff --git a/nbd/common.c b/nbd/common.c index 3247c1d618..01ca30a5c4 100644 --- a/nbd/common.c +++ b/nbd/common.c @@ -47,14 +47,27 @@ int nbd_drop(QIOChannel *ioc, size_t size, Error **errp) } =20 =20 -void nbd_tls_handshake(QIOTask *task, - void *opaque) +void nbd_client_tls_handshake(QIOTask *task, void *opaque) { struct NBDTLSHandshakeData *data =3D opaque; =20 qio_task_propagate_error(task, &data->error); data->complete =3D true; - g_main_loop_quit(data->loop); + if (data->loop) { + g_main_loop_quit(data->loop); + } +} + + +void nbd_server_tls_handshake(QIOTask *task, void *opaque) +{ + struct NBDTLSHandshakeData *data =3D opaque; + + qio_task_propagate_error(task, &data->error); + data->complete =3D true; + if (!qemu_coroutine_entered(data->co)) { + aio_co_wake(data->co); + } } =20 =20 diff --git a/nbd/nbd-internal.h b/nbd/nbd-internal.h index dfa02f77ee..99cca9382c 100644 --- a/nbd/nbd-internal.h +++ b/nbd/nbd-internal.h @@ -74,13 +74,13 @@ static inline int nbd_write(QIOChannel *ioc, const void= *buffer, size_t size, =20 struct NBDTLSHandshakeData { GMainLoop *loop; + Coroutine *co; bool complete; Error *error; }; =20 - -void nbd_tls_handshake(QIOTask *task, - void *opaque); +void nbd_server_tls_handshake(QIOTask *task, void *opaque); +void nbd_client_tls_handshake(QIOTask *task, void *opaque); =20 int nbd_drop(QIOChannel *ioc, size_t size, Error **errp); =20 diff --git a/nbd/server.c b/nbd/server.c index c3484cc1eb..b218512ced 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -777,17 +777,17 @@ static QIOChannel *nbd_negotiate_handle_starttls(NBDC= lient *client, =20 qio_channel_set_name(QIO_CHANNEL(tioc), "nbd-server-tls"); trace_nbd_negotiate_handle_starttls_handshake(); - data.loop =3D g_main_loop_new(g_main_context_default(), FALSE); + data.co =3D qemu_coroutine_self(); qio_channel_tls_handshake(tioc, - nbd_tls_handshake, + nbd_server_tls_handshake, &data, NULL, NULL); =20 - if (!data.complete) { - g_main_loop_run(data.loop); + while (!data.complete) { + qemu_coroutine_yield(); } - g_main_loop_unref(data.loop); + if (data.error) { object_unref(OBJECT(tioc)); error_propagate(errp, data.error); --=20 2.33.0