代码拉取完成,页面将自动刷新
同步操作将从 src-openEuler/gazelle 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
From dae1c41eea8dba45344f49c2fc00eeb31a24f925 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng14@huawei.com>
Date: Mon, 17 Jun 2024 19:09:13 +0800
Subject: [PATCH] refactor tx cache module
---
src/lstack/api/dir.mk | 2 +-
src/lstack/api/lstack_tx_cache.c | 47 ---------
src/lstack/core/lstack_cfg.c | 1 -
src/lstack/core/lstack_protocol_stack.c | 4 +-
src/lstack/include/lstack_protocol_stack.h | 1 -
src/lstack/include/lstack_tx_cache.h | 13 +--
src/lstack/netif/dir.mk | 2 +-
src/lstack/netif/lstack_ethdev.c | 32 ++----
src/lstack/netif/lstack_tx_cache.c | 114 +++++++++++++++++++++
9 files changed, 130 insertions(+), 86 deletions(-)
delete mode 100644 src/lstack/api/lstack_tx_cache.c
create mode 100644 src/lstack/netif/lstack_tx_cache.c
diff --git a/src/lstack/api/dir.mk b/src/lstack/api/dir.mk
index 70bc59d..729690d 100644
--- a/src/lstack/api/dir.mk
+++ b/src/lstack/api/dir.mk
@@ -8,7 +8,7 @@
# PURPOSE.
# See the Mulan PSL v2 for more details.
-SRC = lstack_epoll.c lstack_signal.c lstack_fork.c lstack_wrap.c lstack_rtw_api.c lstack_rtc_api.c lstack_dummy_api.c lstack_tx_cache.c
+SRC = lstack_epoll.c lstack_signal.c lstack_fork.c lstack_wrap.c lstack_rtw_api.c lstack_rtc_api.c lstack_dummy_api.c
$(eval $(call register_dir, api, $(SRC)))
diff --git a/src/lstack/api/lstack_tx_cache.c b/src/lstack/api/lstack_tx_cache.c
deleted file mode 100644
index 42aef57..0000000
--- a/src/lstack/api/lstack_tx_cache.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
-* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved.
-* gazelle is licensed under the Mulan PSL v2.
-* You can use this software according to the terms and conditions of the Mulan PSL v2.
-* You may obtain a copy of Mulan PSL v2 at:
-* http://license.coscl.org.cn/MulanPSL2
-* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
-* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
-* PURPOSE.
-* See the Mulan PSL v2 for more details.
-*/
-
-#include "lwip/sockets.h"
-#include "lstack_cfg.h"
-#include "lstack_protocol_stack.h"
-#include "lstack_tx_cache.h"
-
-void stack_send_pkts(struct protocol_stack *stack)
-{
- if (!get_global_cfg_params()->send_cache_mode) {
- return;
- }
-
- uint32_t send_num = stack->tx_cache.send_end - stack->tx_cache.send_start;
-
- if (send_num == 0) {
- return;
- }
-
- uint32_t start = stack->tx_cache.send_start & STACK_SEND_MASK;
- uint32_t end = stack->tx_cache.send_end & STACK_SEND_MASK;
- uint32_t sent_pkts = 0;
-
- if (start < end) {
- sent_pkts = stack->dev_ops.tx_xmit(stack, &stack->tx_cache.send_pkts[start], send_num);
- } else {
- send_num = STACK_SEND_MAX - start;
- sent_pkts = stack->dev_ops.tx_xmit(stack, &stack->tx_cache.send_pkts[start], send_num);
- if (sent_pkts == send_num) {
- sent_pkts += stack->dev_ops.tx_xmit(stack, stack->tx_cache.send_pkts, end);
- }
- }
-
- stack->tx_cache.send_start += sent_pkts;
- stack->stats.tx += sent_pkts;
-}
-
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
index f0c5f4f..5521898 100644
--- a/src/lstack/core/lstack_cfg.c
+++ b/src/lstack/core/lstack_cfg.c
@@ -32,7 +32,6 @@
#include "gazelle_reg_msg.h"
#include "lstack_log.h"
#include "gazelle_base_func.h"
-#include "lstack_protocol_stack.h"
#include "lstack_cfg.h"
#define DEFAULT_CONF_FILE "/etc/gazelle/lstack.conf"
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 74e543d..f6d381e 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -480,7 +480,9 @@ int stack_polling(uint32_t wakeup_tick)
do_lwip_read_recvlist(stack, read_connect_number);
if ((wakeup_tick & 0xf) == 0) {
wakeup_stack_epoll(stack);
- stack_send_pkts(stack);
+ if (get_global_cfg_params()->send_cache_mode) {
+ tx_cache_send(stack->queue_id);
+ }
}
/* run to completion mode currently does not support sockmap */
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index ab27dfa..6ca4f14 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -77,7 +77,6 @@ struct protocol_stack {
uint32_t tx_ring_used;
struct rte_mbuf *pkts[NIC_QUEUE_SIZE_MAX];
- struct lstack_tx_cache tx_cache;
struct list_node recv_list;
struct list_node same_node_recv_list; /* used for same node processes communication */
struct list_node wakeup_list;
diff --git a/src/lstack/include/lstack_tx_cache.h b/src/lstack/include/lstack_tx_cache.h
index 3991b16..04e9e35 100644
--- a/src/lstack/include/lstack_tx_cache.h
+++ b/src/lstack/include/lstack_tx_cache.h
@@ -13,16 +13,7 @@
#ifndef _LSTACK_TX_CACHE_H_
#define _LSTACK_TX_CACHE_H_
-#define STACK_SEND_MAX (2048)
-#define STACK_SEND_MASK (STACK_SEND_MAX - 1)
-#define STACK_SEND_INDEX(index) ((index) & STACK_SEND_MASK)
-
-struct lstack_tx_cache {
- uint32_t send_start;
- uint32_t send_end;
- struct rte_mbuf *send_pkts[STACK_SEND_MAX];
-};
-
-void stack_send_pkts(struct protocol_stack *stack);
+int tx_cache_init(uint16_t queue_id, void *priv, struct lstack_dev_ops *dev_ops);
+int tx_cache_send(uint16_t queue_id);
#endif /* _LSTACK_TX_CACHE_H_ */
diff --git a/src/lstack/netif/dir.mk b/src/lstack/netif/dir.mk
index 1e67734..b551041 100644
--- a/src/lstack/netif/dir.mk
+++ b/src/lstack/netif/dir.mk
@@ -8,7 +8,7 @@
# PURPOSE.
# See the Mulan PSL v2 for more details.
-SRC = lstack_ethdev.c lstack_vdev.c lstack_flow.c
+SRC = lstack_ethdev.c lstack_vdev.c lstack_flow.c lstack_tx_cache.c
ifeq ($(GAZELLE_FAULT_INJECT_ENABLE), 1)
SRC += lstack_fault_inject.c
endif
diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c
index 77172f8..45c5f9e 100644
--- a/src/lstack/netif/lstack_ethdev.c
+++ b/src/lstack/netif/lstack_ethdev.c
@@ -187,19 +187,6 @@ int32_t eth_dev_poll(void)
return nr_pkts;
}
-static void eth_dev_send_pkt(struct protocol_stack *stack, struct rte_mbuf *mbuf)
-{
- do {
- if (STACK_SEND_INDEX(stack->tx_cache.send_end + 1) != STACK_SEND_INDEX(stack->tx_cache.send_start)) {
- stack->tx_cache.send_pkts[STACK_SEND_INDEX(stack->tx_cache.send_end)] = mbuf;
- stack->tx_cache.send_end++;
- return;
- }
- stack_send_pkts(stack);
- stack->stats.send_pkts_fail++;
- } while (1);
-}
-
static err_t eth_dev_output(struct netif *netif, struct pbuf *pbuf)
{
struct protocol_stack *stack = get_protocol_stack();
@@ -245,16 +232,12 @@ static err_t eth_dev_output(struct netif *netif, struct pbuf *pbuf)
pbuf = pbuf->next;
}
- if (!get_global_cfg_params()->send_cache_mode) {
- uint32_t sent_pkts = stack->dev_ops.tx_xmit(stack, &first_mbuf, 1);
- stack->stats.tx += sent_pkts;
- if (sent_pkts < 1) {
- stack->stats.tx_drop++;
- rte_pktmbuf_free(first_mbuf);
- return ERR_MEM;
- }
- } else {
- eth_dev_send_pkt(stack, first_mbuf);
+ uint32_t sent_pkts = stack->dev_ops.tx_xmit(stack, &first_mbuf, 1);
+ stack->stats.tx += sent_pkts;
+ if (sent_pkts < 1) {
+ stack->stats.tx_drop++;
+ rte_pktmbuf_free(first_mbuf);
+ return ERR_MEM;
}
return ERR_OK;
@@ -295,6 +278,9 @@ int32_t ethdev_init(struct protocol_stack *stack)
struct cfg_params *cfg = get_global_cfg_params();
vdev_dev_ops_init(&stack->dev_ops);
+ if (cfg->send_cache_mode) {
+ tx_cache_init(stack->queue_id, stack, &stack->dev_ops);
+ }
if (use_ltran()) {
stack->rx_ring_used = 0;
diff --git a/src/lstack/netif/lstack_tx_cache.c b/src/lstack/netif/lstack_tx_cache.c
new file mode 100644
index 0000000..ac5a9db
--- /dev/null
+++ b/src/lstack/netif/lstack_tx_cache.c
@@ -0,0 +1,114 @@
+/*
+* Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved.
+* gazelle is licensed under the Mulan PSL v2.
+* You can use this software according to the terms and conditions of the Mulan PSL v2.
+* You may obtain a copy of Mulan PSL v2 at:
+* http://license.coscl.org.cn/MulanPSL2
+* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+* PURPOSE.
+* See the Mulan PSL v2 for more details.
+*/
+
+#include <rte_mbuf.h>
+
+#include "lwip/sockets.h"
+#include "lstack_ethdev.h"
+#include "lstack_log.h"
+#include "gazelle_opt.h"
+#include "lstack_protocol_stack.h"
+#include "lstack_tx_cache.h"
+
+#define TX_CACHE_MAX 128
+#define TX_CACHE_MASK (TX_CACHE_MAX - 1)
+#define TX_CACHE_INDEX(index) ((index) & TX_CACHE_MASK)
+
+struct tx_cache {
+ uint16_t port_id;
+ uint16_t queue_id;
+
+ uint32_t send_start;
+ uint32_t send_end;
+ struct rte_mbuf *send_pkts[TX_CACHE_MAX];
+
+ uint64_t send_pkts_fail;
+ void *priv;
+};
+struct lstack_dev_ops g_tx_cache_dev_ops;
+
+static uint32_t tx_cache_recv(struct protocol_stack *stack, struct rte_mbuf **pkts, uint32_t nr_pkts);
+
+struct tx_cache *g_tx_cache[PROTOCOL_STACK_MAX];
+
+int tx_cache_init(uint16_t queue_id, void *priv, struct lstack_dev_ops *dev_ops)
+{
+ struct tx_cache *tx_cache = calloc(1, sizeof(struct tx_cache));
+ if (tx_cache == NULL) {
+ LSTACK_LOG(ERR, LSTACK, "queue(%d) tx cache init failed\n", queue_id);
+ }
+
+ tx_cache->queue_id = queue_id;
+ tx_cache->priv = priv;
+ g_tx_cache[queue_id] = tx_cache;
+
+ g_tx_cache_dev_ops.tx_xmit = dev_ops->tx_xmit;
+ dev_ops->tx_xmit = tx_cache_recv;
+
+ return 0;
+}
+
+int tx_cache_send(uint16_t queue_id)
+{
+ struct tx_cache *tx_cache = g_tx_cache[queue_id];
+ if (tx_cache == NULL) {
+ LSTACK_LOG(ERR, LSTACK, "queue(%d) tx cache get failed\n", queue_id);
+ return 0;
+ }
+
+ uint32_t send_num = tx_cache->send_end - tx_cache->send_start;
+ if (send_num == 0) {
+ return 0;
+ }
+
+ uint32_t start = tx_cache->send_start & TX_CACHE_MASK;
+ uint32_t end = tx_cache->send_end & TX_CACHE_MASK;
+ uint32_t sent_pkts = 0;
+ if (start < end) {
+ sent_pkts = g_tx_cache_dev_ops.tx_xmit(tx_cache->priv, &tx_cache->send_pkts[start], send_num);
+ } else {
+ send_num = TX_CACHE_MAX - start;
+ sent_pkts = g_tx_cache_dev_ops.tx_xmit(tx_cache->priv, &tx_cache->send_pkts[start], send_num);
+ if (sent_pkts == send_num) {
+ sent_pkts += g_tx_cache_dev_ops.tx_xmit(tx_cache->priv, tx_cache->send_pkts, end);
+ }
+ }
+
+ tx_cache->send_start += sent_pkts;
+ return sent_pkts;
+}
+
+static uint32_t tx_cache_recv(struct protocol_stack *stack, struct rte_mbuf **pkts, uint32_t nr_pkts)
+{
+ if (nr_pkts != 1) {
+ LSTACK_LOG(ERR, LSTACK, "arg not support, nr_pkts is %d\n", nr_pkts);
+ return 0;
+ }
+ uint16_t queue_id = stack->queue_id;
+ struct tx_cache *tx_cache = g_tx_cache[queue_id];
+ if (tx_cache == NULL) {
+ LSTACK_LOG(ERR, LSTACK, "queue(%d) tx cache get failed\n", queue_id);
+ return 0;
+ }
+
+ do {
+ if (TX_CACHE_INDEX(tx_cache->send_end + 1) != TX_CACHE_INDEX(tx_cache->send_start)) {
+ tx_cache->send_pkts[TX_CACHE_INDEX(tx_cache->send_end)] = pkts[0];
+ tx_cache->send_end++;
+ return nr_pkts;
+ }
+
+ tx_cache_send(queue_id);
+ } while (1);
+
+ return 0;
+}
--
2.33.0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。