From patchwork Mon Apr 24 13:02:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fengchengwen X-Patchwork-Id: 126470 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id E3360429DB; Mon, 24 Apr 2023 15:09:14 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D32C6410D0; Mon, 24 Apr 2023 15:09:14 +0200 (CEST) Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by mails.dpdk.org (Postfix) with ESMTP id A22DE40FAE for ; Mon, 24 Apr 2023 15:09:13 +0200 (CEST) Received: from dggpeml500024.china.huawei.com (unknown [172.30.72.56]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4Q4lj52RmJzSv6C; Mon, 24 Apr 2023 21:04:57 +0800 (CST) Received: from localhost.localdomain (10.50.163.32) by dggpeml500024.china.huawei.com (7.185.36.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Mon, 24 Apr 2023 21:09:11 +0800 From: Chengwen Feng To: , CC: Subject: [RFC 0/3] introduce coroutine library Date: Mon, 24 Apr 2023 13:02:05 +0000 Message-ID: <20230424130208.9517-1-fengchengwen@huawei.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 X-Originating-IP: [10.50.163.32] X-ClientProxiedBy: dggems706-chm.china.huawei.com (10.3.19.183) To dggpeml500024.china.huawei.com (7.185.36.10) X-CFilter-Loop: Reflected X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org This patchset introduces the coroutine library which will help refactor the hns3 PMD's reset process. The hns3 single function reset process consists of the following steps: 1.stop_service(); 2.prepare_reset(); 3.delay(100ms); 4.notify_hw(); 5.wait_hw_reset_done(); // multiple sleep waits are involved. 6.reinit(); 7.restore_conf(); If the DPDK process take over multiple hns3 functions (e.g. 100), it's impractical to reset and restore functions in sequence: 1.proc_func(001); // will completed in 100+ms range. 2.proc_func(002); // will completed in 100~200+ms range. ... x.proc_func(100); // will completed in 9900~10000+ms range. The later functions will process fail because it's too late to deal with. One solution is that create a reset thread for each function, and it will lead to large number of threads if the DPDK process take over multiple hns3 functions. So the current hns3 driver uses asynchronous mechanism, for examples, it use rte_eal_alarm_set() when process delay(100ms), it splits a serial process into multiple asynchronous processes, and the code is complex and difficult to understand. The coroutine is a good mechanism to provide programmers with the simplicity of keeping serial processes within a limited number of threads. This patchset use to build the coroutine framework, and it just provides a demo. More APIs maybe added in the future. In addition, we would like to ask the community whether it it possible to accept the library. If not, whether it is allowed to provide the library in hns3 PMD. Chengwen Feng (3): lib/coroutine: add coroutine library examples/coroutine: support coroutine examples net/hns3: refactor reset process with coroutine drivers/net/hns3/hns3_ethdev.c | 217 ++++++++++++++++++++++++++++++ drivers/net/hns3/hns3_ethdev.h | 3 + drivers/net/hns3/hns3_intr.c | 38 ++++++ drivers/net/hns3/meson.build | 2 +- examples/coroutine/main.c | 153 +++++++++++++++++++++ examples/coroutine/meson.build | 10 ++ examples/meson.build | 1 + lib/coroutine/meson.build | 8 ++ lib/coroutine/rte_coroutine.c | 190 ++++++++++++++++++++++++++ lib/coroutine/rte_coroutine.h | 110 +++++++++++++++ lib/coroutine/rte_coroutine_imp.h | 46 +++++++ lib/coroutine/version.map | 11 ++ lib/meson.build | 1 + 13 files changed, 789 insertions(+), 1 deletion(-) create mode 100644 examples/coroutine/main.c create mode 100644 examples/coroutine/meson.build create mode 100644 lib/coroutine/meson.build create mode 100644 lib/coroutine/rte_coroutine.c create mode 100644 lib/coroutine/rte_coroutine.h create mode 100644 lib/coroutine/rte_coroutine_imp.h create mode 100644 lib/coroutine/version.map