From patchwork Thu Nov 17 05:09:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Yan, Zhirun" X-Patchwork-Id: 119909 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 D7DF0A00C2; Thu, 17 Nov 2022 06:09:36 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7775240DDA; Thu, 17 Nov 2022 06:09:36 +0100 (CET) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by mails.dpdk.org (Postfix) with ESMTP id C05C340141 for ; Thu, 17 Nov 2022 06:09:34 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1668661774; x=1700197774; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=gMg6NtbF85vC33a+GnpZF56v2gS0x2sEEmBxwn+39po=; b=Q9gkv05hMgHGHThbxyLJavXCxl3EaoAgvmSz4ueAKgOBkZ1FSnwwyyID zvRZjz4HHAh99jqTpZXk3MI77CpwgO8ccU7PZc6sskBK4akxEvAF+wNO0 TGa7TYdnACKJjJJtiwR928pRFMmhMzOWg0dgEwVsv3x87bGsFPnluu7vg CvdyU9o6MlfmbA0r7l1U4eaeZ0KaGQ12CsbgFVOSgIV6MwD1q1A0kxGzh tIzS3JWNQLbrtJ0a8s4Cc4Z6CPzPlkeLcGSV9PbJZQgm8qyQsEdrSkfuA FDa+QybxnlZnetThBD33clGI4EiJdO/LZU/mR/snIXCf8a5lA8sPRwRm0 Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10533"; a="292465732" X-IronPort-AV: E=Sophos;i="5.96,169,1665471600"; d="scan'208";a="292465732" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Nov 2022 21:09:33 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10533"; a="617466000" X-IronPort-AV: E=Sophos;i="5.96,169,1665471600"; d="scan'208";a="617466000" Received: from dpdk-zhirun-lmm.sh.intel.com ([10.67.118.230]) by orsmga006.jf.intel.com with ESMTP; 16 Nov 2022 21:09:31 -0800 From: Zhirun Yan To: dev@dpdk.org, jerinj@marvell.com, kirankumark@marvell.com, ndabilpuram@marvell.com Cc: cunming.liang@intel.com, haiyue.wang@intel.com, Zhirun Yan Subject: [PATCH v1 00/13] graph enhancement for multi-core dispatch Date: Thu, 17 Nov 2022 13:09:13 +0800 Message-Id: <20221117050926.136974-1-zhirun.yan@intel.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 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 Currently, rte_graph supports RTC (Run-To-Completion) model within each of a single core. RTC is one of the typical model of packet processing. Others like Pipeline or Hybrid are lack of support. The patch set introduces a 'generic' model selection which is a self-reacting scheme according to the core affinity. The new model enables a cross-core dispatching mechanism which employs a scheduling work-queue to dispatch streams to other worker cores which being associated with the destination node. When core flavor of the destination node is a default 'current', the stream can be continue executed as normal. Example: 3-node graph targets 3-core budget Generic Model RTC: Config Graph-A: node-0->current; node-1->current; node-2->current; Graph-A':node-0/1/2 @0, Graph-A':node-0/1/2 @1, Graph-A':node-0/1/2 @2 + - - - - - - - - - - - - - - - - - - - - - + ' Core #0/1/2 ' ' ' ' +--------+ +---------+ +--------+ ' ' | Node-0 | --> | Node-1 | --> | Node-2 | ' ' +--------+ +---------+ +--------+ ' ' ' + - - - - - - - - - - - - - - - - - - - - - + Pipeline: Config Graph-A: node-0->0; node-1->1; node-2->2; Graph-A':node-0 @0, Graph-A':node-1 @1, Graph-A':node-2 @2 + - - - - - -+ +- - - - - - + + - - - - - -+ ' Core #0 ' ' Core #1 ' ' Core #2 ' ' ' ' ' ' ' ' +--------+ ' ' +--------+ ' ' +--------+ ' ' | Node-0 | ' --> ' | Node-1 | ' --> ' | Node-2 | ' ' +--------+ ' ' +--------+ ' ' +--------+ ' ' ' ' ' ' ' + - - - - - -+ +- - - - - - + + - - - - - -+ Hybrid: Config Graph-A: node-0->current; node-1->current; node-2->2; Graph-A':node-0/1 @0, Graph-A':node-0/1 @1, Graph-A':node-2 @2 + - - - - - - - - - - - - - - - + + - - - - - -+ ' Core #0 ' ' Core #2 ' ' ' ' ' ' +--------+ +--------+ ' ' +--------+ ' ' | Node-0 | ------> | Node-1 | ' --> ' | Node-2 | ' ' +--------+ +--------+ ' ' +--------+ ' ' ' ' ' + - - - - - - - - - - - - - - - + + - - - - - -+ ^ | | + - - - - - - - - - - - - - - - + | ' Core #1 ' | ' ' | ' +--------+ +--------+ ' | ' | Node-0 | ------> | Node-1 | ' --------+ ' +--------+ +--------+ ' ' ' + - - - - - - - - - - - - - - - + The patch set has been break down as below: 1. Split graph worker into common and default model part. 2. Inline graph node processing and graph circular buffer walking to make it reusable. 3. Add set/get APIs to choose worker model. 4. Introduce core affinity API to set the node run on specific worker core. (only use in new model) 5. Introduce graph affinity API to bind one graph with specific worker core. 6. Introduce graph clone API. 7. Introduce stream moving with scheduler work-queue in patch 8,9,10. 8. Add stats for new models. 9. Abstract default graph config process and integrate new model into example/l3fwd-graph. Add new parameters for model choosing. We could run with new worker model by this: ./dpdk-l3fwd-graph -l 8,9,10,11 -n 4 -- -p 0x1 --config="(0,0,9)" -P --model="generic" References: https://static.sched.com/hosted_files/dpdkuserspace22/a6/graph%20introduce%20remote%20dispatch%20for%20mult-core%20scaling.pdf Zhirun Yan (13): graph: split graph worker into common and default model graph: move node process into inline function graph: add macro to walk on graph circular buffer graph: add get/set graph worker model APIs graph: introduce core affinity API graph: introduce graph affinity API graph: introduce graph clone API for other worker core graph: introduce stream moving cross cores graph: enable create and destroy graph scheduling workqueue graph: introduce graph walk by cross-core dispatch graph: enable graph generic scheduler model graph: add stats for corss-core dispatching examples/l3fwd-graph: introduce generic worker model examples/l3fwd-graph/main.c | 218 +++++++++-- lib/graph/graph.c | 179 +++++++++ lib/graph/graph_debug.c | 6 + lib/graph/graph_populate.c | 1 + lib/graph/graph_private.h | 44 +++ lib/graph/graph_stats.c | 74 +++- lib/graph/meson.build | 3 +- lib/graph/node.c | 1 + lib/graph/rte_graph.h | 44 +++ lib/graph/rte_graph_model_generic.c | 179 +++++++++ lib/graph/rte_graph_model_generic.h | 114 ++++++ lib/graph/rte_graph_model_rtc.h | 22 ++ lib/graph/rte_graph_worker.h | 516 ++------------------------ lib/graph/rte_graph_worker_common.h | 545 ++++++++++++++++++++++++++++ lib/graph/version.map | 8 + 15 files changed, 1430 insertions(+), 524 deletions(-) create mode 100644 lib/graph/rte_graph_model_generic.c create mode 100644 lib/graph/rte_graph_model_generic.h create mode 100644 lib/graph/rte_graph_model_rtc.h create mode 100644 lib/graph/rte_graph_worker_common.h