代码拉取完成,页面将自动刷新
From 75e11463d7bd67732d3c7f0e7ed3a9dece8c4982 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng14@huawei.com>
Date: Sat, 25 Nov 2023 09:26:23 +0800
Subject: [PATCH] dfx: support bond get dpdk xstats
---
src/lstack/core/lstack_control_plane.c | 2 +
src/lstack/core/lstack_dpdk.c | 93 +++++++++++++++++++------
src/lstack/core/lstack_protocol_stack.c | 2 +-
src/lstack/core/lstack_stack_stat.c | 14 ++--
src/lstack/include/lstack_cfg.h | 1 -
src/lstack/include/lstack_dpdk.h | 1 -
src/lstack/include/lstack_stack_stat.h | 3 +-
src/lstack/netif/lstack_ethdev.c | 4 +-
8 files changed, 89 insertions(+), 31 deletions(-)
diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c
index b97ee7f..4633834 100644
--- a/src/lstack/core/lstack_control_plane.c
+++ b/src/lstack/core/lstack_control_plane.c
@@ -586,6 +586,8 @@ static int32_t handle_stat_request(int32_t sockfd)
if (msg.stat_mode == GAZELLE_STAT_LSTACK_LOG_LEVEL_SET ||
msg.stat_mode == GAZELLE_STAT_LSTACK_LOW_POWER_MDF) {
return handle_proc_cmd(sockfd, &msg);
+ } else if (msg.stat_mode == GAZELLE_STAT_LSTACK_SHOW_XSTATS) {
+ return handle_dpdk_cmd(sockfd, msg.stat_mode);
} else {
ret = handle_stack_cmd(sockfd, msg.stat_mode);
if (ret != 0) {
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index 703fd0d..19a7bf4 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -346,13 +346,6 @@ void lstack_log_level_init(void)
}
}
-// get port id
-inline uint16_t get_port_id(void)
-{
- uint16_t port_id = get_global_cfg_params()->port_id;
- return port_id;
-}
-
static int32_t ethdev_port_id(uint8_t *mac)
{
int32_t port_id;
@@ -497,8 +490,6 @@ int32_t dpdk_ethdev_init(int port_id, bool bond_port)
}
}
- get_global_cfg_params()->port_id = port_id;
-
struct rte_eth_dev_info dev_info;
int32_t ret = rte_eth_dev_info_get(port_id, &dev_info);
if (ret != 0) {
@@ -814,23 +805,83 @@ bool port_in_stack_queue(ip_addr_t src_ip, ip_addr_t dst_ip, uint16_t src_port,
return (reta_index % stack_group->nb_queues) == stack->queue_id;
}
-void dpdk_nic_xstats_get(struct gazelle_stack_dfx_data *dfx, uint16_t port_id)
+static int dpdk_nic_xstats_value_get(uint64_t *values, unsigned int len, uint16_t *ports, unsigned int count)
{
- int32_t ret;
- int32_t len = rte_eth_xstats_get_names_by_id(port_id, NULL, 0, NULL);
- dfx->data.nic_xstats.len = len;
- dfx->data.nic_xstats.port_id = port_id;
+ uint64_t tmp_values[RTE_ETH_XSTATS_MAX_LEN];
+ int p_idx;
+ int v_idx;
+ int ret;
+
+ for (p_idx = 0; p_idx < count; p_idx++) {
+ ret = rte_eth_xstats_get_by_id(ports[p_idx], NULL, tmp_values, len);
+ if (ret < 0 || ret > len) {
+ LSTACK_LOG(ERR, LSTACK, "rte_eth_xstats_get_by_id failed.\n");
+ return -1;
+ }
+
+ for (v_idx = 0; v_idx < len; v_idx++) {
+ values[v_idx] += tmp_values[v_idx];
+ }
+ }
+ return 0;
+}
+
+static int dpdk_nic_xstats_name_get(struct nic_eth_xstats_name *names, uint16_t port_id)
+{
+ int len;
+
+ len = rte_eth_xstats_get_names_by_id(port_id, NULL, 0, NULL);
if (len < 0) {
- return;
+ LSTACK_LOG(ERR, LSTACK, "rte_eth_xstats_get_names_by_id failed.\n");
+ return -1;
+ }
+
+ if (len != rte_eth_xstats_get_names_by_id(port_id, (struct rte_eth_xstat_name *)names, len, NULL)) {
+ LSTACK_LOG(ERR, LSTACK, "rte_eth_xstats_get_names_by_id failed.\n");
+ return -1;
}
- if (len != rte_eth_xstats_get_names_by_id(port_id,
- (struct rte_eth_xstat_name *)dfx->data.nic_xstats.xstats_name, len, NULL)) {
- dfx->data.nic_xstats.len = -1;
+
+ return len;
+}
+
+void dpdk_nic_xstats_get(struct gazelle_stack_dfx_data *dfx, uint16_t port_id)
+{
+ struct rte_eth_dev_info dev_info;
+ int len;
+ int ret;
+
+ dfx->data.nic_xstats.len = -1;
+ dfx->data.nic_xstats.port_id = port_id;
+ ret = rte_eth_dev_info_get(port_id, &dev_info);
+ if (ret < 0) {
+ LSTACK_LOG(ERR, LSTACK, "rte_eth_dev_info_get failed.\n");
return;
}
- ret = rte_eth_xstats_get_by_id(port_id, NULL, dfx->data.nic_xstats.values, len);
- if (ret < 0 || ret > len) {
- dfx->data.nic_xstats.len = -1;
+ /* bond not support get xstats, we get xstats from slave device of bond */
+ if (strcmp(dev_info.driver_name, "net_bonding") == 0) {
+ uint16_t slaves[RTE_MAX_ETHPORTS];
+ int slave_count;
+ slave_count = rte_eth_bond_slaves_get(port_id, slaves, RTE_MAX_ETHPORTS);
+ if (slave_count <= 0) {
+ LSTACK_LOG(ERR, LSTACK, "rte_eth_bond_slaves_get failed.\n");
+ return;
+ }
+ len = dpdk_nic_xstats_name_get(dfx->data.nic_xstats.xstats_name, slaves[0]);
+ if (len <= 0) {
+ return;
+ }
+ if (dpdk_nic_xstats_value_get(dfx->data.nic_xstats.values, len, slaves, slave_count) != 0) {
+ return;
+ }
+ } else {
+ len = dpdk_nic_xstats_name_get(dfx->data.nic_xstats.xstats_name, port_id);
+ if (len <= 0) {
+ return;
+ }
+ if (dpdk_nic_xstats_value_get(dfx->data.nic_xstats.values, len, &port_id, 1) != 0) {
+ return;
+ }
}
+ dfx->data.nic_xstats.len = len;
}
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index cbc8b8f..dfebfcc 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -479,7 +479,7 @@ void stack_polling(uint32_t wakeup_tick)
if (kni_switch && !stack->queue_id && !(wakeup_tick & 0xfff)) {
rte_kni_handle_request(get_gazelle_kni());
if (get_kni_started()) {
- kni_handle_rx(get_port_id());
+ kni_handle_rx(stack->port_id);
}
}
return;
diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c
index 60832b4..18548ab 100644
--- a/src/lstack/core/lstack_stack_stat.c
+++ b/src/lstack/core/lstack_stack_stat.c
@@ -256,19 +256,25 @@ static int32_t send_control_cmd_data(int32_t fd, struct gazelle_stack_dfx_data *
return 0;
}
-int32_t handle_stack_cmd(int32_t fd, enum GAZELLE_STAT_MODE stat_mode)
+int handle_dpdk_cmd(int fd, enum GAZELLE_STAT_MODE stat_mode)
{
struct gazelle_stack_dfx_data dfx;
- struct protocol_stack_group *stack_group = get_protocol_stack_group();
if (stat_mode == GAZELLE_STAT_LSTACK_SHOW_XSTATS) {
- dpdk_nic_xstats_get(&dfx, get_port_id());
+ dpdk_nic_xstats_get(&dfx, get_protocol_stack_group()->port_id);
dfx.tid = 0;
dfx.eof = 1;
send_control_cmd_data(fd, &dfx);
- return 0;
}
+ return 0;
+}
+
+int handle_stack_cmd(int fd, enum GAZELLE_STAT_MODE stat_mode)
+{
+ struct gazelle_stack_dfx_data dfx;
+ struct protocol_stack_group *stack_group = get_protocol_stack_group();
+
for (uint32_t i = 0; i < stack_group->stack_num; i++) {
struct protocol_stack *stack = stack_group->stacks[i];
diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h
index 26da357..e33f4fe 100644
--- a/src/lstack/include/lstack_cfg.h
+++ b/src/lstack/include/lstack_cfg.h
@@ -94,7 +94,6 @@ struct cfg_params {
uint16_t num_process;
uint16_t num_listen_port;
- uint16_t port_id;
uint16_t is_primary;
uint16_t num_queue;
uint16_t tot_queue_num;
diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h
index 3a621d0..e3daefa 100644
--- a/src/lstack/include/lstack_dpdk.h
+++ b/src/lstack/include/lstack_dpdk.h
@@ -55,7 +55,6 @@ void dpdk_skip_nic_init(void);
int32_t dpdk_init_lstack_kni(void);
void dpdk_restore_pci(void);
bool port_in_stack_queue(ip_addr_t src_ip, ip_addr_t dst_ip, uint16_t src_port, uint16_t dst_port);
-uint16_t get_port_id(void);
struct rte_mempool *create_pktmbuf_mempool(const char *name, uint32_t nb_mbuf,
uint32_t mbuf_cache_size, uint16_t queue_id, unsigned numa_id);
diff --git a/src/lstack/include/lstack_stack_stat.h b/src/lstack/include/lstack_stack_stat.h
index 5737bae..d5a4ec7 100644
--- a/src/lstack/include/lstack_stack_stat.h
+++ b/src/lstack/include/lstack_stack_stat.h
@@ -24,7 +24,8 @@ enum GAZELLE_STAT_MODE;
void calculate_lstack_latency(struct gazelle_stack_latency *stack_latency, const struct pbuf *pbuf,
enum GAZELLE_LATENCY_TYPE type);
void stack_stat_init(void);
-int32_t handle_stack_cmd(int fd, enum GAZELLE_STAT_MODE stat_mode);
+int handle_stack_cmd(int fd, enum GAZELLE_STAT_MODE stat_mode);
+int handle_dpdk_cmd(int fd, enum GAZELLE_STAT_MODE stat_mode);
uint64_t get_current_time(void);
void lstack_get_low_power_info(struct gazelle_stat_low_power_info *low_power_info);
void unregister_wakeup(struct protocol_stack *stack, struct wakeup_poll *wakeup);
diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c
index 9912858..29bef21 100644
--- a/src/lstack/netif/lstack_ethdev.c
+++ b/src/lstack/netif/lstack_ethdev.c
@@ -330,7 +330,7 @@ struct rte_flow *create_flow_director(uint16_t port_id, uint16_t queue_id,
void config_flow_director(uint16_t queue_id, uint32_t src_ip,
uint32_t dst_ip, uint16_t src_port, uint16_t dst_port)
{
- uint16_t port_id = get_port_id();
+ uint16_t port_id = get_protocol_stack_group()->port_id;
char rule_key[RULE_KEY_LEN] = {0};
sprintf_s(rule_key, sizeof(rule_key), "%u_%u_%u", src_ip, src_port, dst_port);
struct flow_rule *fl_exist = find_rule(rule_key);
@@ -357,7 +357,7 @@ void config_flow_director(uint16_t queue_id, uint32_t src_ip,
void delete_flow_director(uint32_t dst_ip, uint16_t src_port, uint16_t dst_port)
{
- uint16_t port_id = get_port_id();
+ uint16_t port_id = get_protocol_stack_group()->port_id;
char rule_key[RULE_KEY_LEN] = {0};
sprintf_s(rule_key, RULE_KEY_LEN, "%u_%u_%u",dst_ip, dst_port, src_port);
struct flow_rule *fl = find_rule(rule_key);
--
2.27.0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。