update version to 1.0.2

(cherry picked from commit c21ad92f973ef093c536294bb9be79de97370fa4)
This commit is contained in:
jiangheng 2023-07-04 19:58:05 +08:00 committed by openeuler-sync-bot
parent b16093c78d
commit 5f7578f88b
265 changed files with 5 additions and 59380 deletions

View File

@ -1,28 +0,0 @@
From 9155ca505cc2b3f3aa70ff6c0b4401be517b194f Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Fri, 4 Mar 2022 14:19:14 +0800
Subject: [PATCH] fix compile error
---
src/ltran/ltran_dfx.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index c923de0..159fbb9 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -111,7 +111,10 @@ static pid_t ltran_process_exist(void)
char line[LINE];
FILE *cmd = popen("pidof ltran", "r");
- (void)fgets(line, LINE, cmd);
+ if(fgets(line, LINE, cmd) == NULL) {
+ return 0;
+ }
+
pid_t pid = strtoul(line, NULL, BASE_DEC_SCALE);
(void)pclose(cmd);
--
2.30.0

View File

@ -1,482 +0,0 @@
From 012d15720728b615920b79de929f18a2a86d9d0a Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Tue, 8 Mar 2022 10:24:12 +0800
Subject: [PATCH] reduce copy in send
---
src/common/dpdk_common.h | 23 +++---
src/lstack/core/lstack_dpdk.c | 11 +--
src/lstack/core/lstack_lwip.c | 82 ++++++++++++++-----
src/lstack/core/lstack_protocol_stack.c | 11 ++-
src/lstack/include/lstack_ethdev.h | 4 -
src/lstack/include/lstack_lwip.h | 6 +-
src/lstack/netif/lstack_ethdev.c | 101 ++++--------------------
src/lstack/netif/lstack_vdev.c | 3 +-
8 files changed, 104 insertions(+), 137 deletions(-)
diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h
index 165a64b..e9cacc3 100644
--- a/src/common/dpdk_common.h
+++ b/src/common/dpdk_common.h
@@ -21,30 +21,25 @@
#define GAZELLE_MBUFF_PRIV_SIZE (sizeof(uint64_t) * 2)
#define PTR_TO_PRIVATE(mbuf) RTE_PTR_ADD(mbuf, sizeof(struct rte_mbuf))
+/* NOTE!!! magic code, even the order.
+* I wrote it carefully, and check the assembly. for example, there is 24 ins in A72,
+* and if there is no cache miss, it only take less than 20 cycle(store pipe is the bottleneck).
+*/
static __rte_always_inline void copy_mbuf(struct rte_mbuf *dst, struct rte_mbuf *src)
{
- /* NOTE!!! magic code, even the order.
- I wrote it carefully, and check the assembly. for example, there is 24 ins in A72,
- and if there is no cache miss, it only take less than 20 cycle(store pipe is the bottleneck).
- */
- uint8_t *dst_data = NULL;
- uint8_t *src_data = NULL;
- uint32_t rx_desc_fields_len = 16;
- uint16_t data_len;
-
/* In the direction of tx, data is copied from lstack to ltran. It is necessary to judge whether
the length of data transmitted from lstack has been tampered with to prevent overflow
*/
- data_len = src->data_len;
+ uint16_t data_len = src->data_len;
if (data_len > RTE_MBUF_DEFAULT_BUF_SIZE)
return;
dst->ol_flags = src->ol_flags;
- // there is buf_len in rx_descriptor_fields1, copy it is dangerous acturely.
- rte_memcpy((uint8_t *)dst->rx_descriptor_fields1, (const uint8_t *)src->rx_descriptor_fields1, rx_desc_fields_len);
+ // there is buf_len in rx_descriptor_fields1, copy it is dangerous acturely. 16 : mbuf desc size
+ rte_memcpy((uint8_t *)dst->rx_descriptor_fields1, (const uint8_t *)src->rx_descriptor_fields1, 16);
- dst_data = rte_pktmbuf_mtod(dst, void*);
- src_data = rte_pktmbuf_mtod(src, void*);
+ uint8_t *dst_data = rte_pktmbuf_mtod(dst, void*);
+ uint8_t *src_data = rte_pktmbuf_mtod(src, void*);
rte_memcpy(dst_data, src_data, data_len);
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index 1d355d4..280d643 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -34,6 +34,7 @@
#include "lstack_dpdk.h"
#include "lstack_lockless_queue.h"
#include "lstack_thread_rpc.h"
+#include "lstack_lwip.h"
#include "lstack_cfg.h"
struct eth_params {
@@ -257,7 +258,7 @@ int32_t fill_mbuf_to_ring(struct rte_mempool *mempool, struct rte_ring *ring, ui
while (remain > 0) {
batch = LWIP_MIN(remain, FREE_RX_QUEUE_SZ);
- ret = eth_mbuf_claim(mempool, free_buf, batch);
+ ret = gazelle_alloc_pktmbuf(mempool, free_buf, batch);
if (ret != 0) {
LSTACK_LOG(ERR, LSTACK, "cannot alloc mbuf for ring, count: %d ret=%d\n", (int32_t)batch, ret);
return -1;
@@ -341,7 +342,7 @@ static int eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_inf
if (rx_ol_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) {
#if CHECKSUM_CHECK_IP_HW
rx_ol |= DEV_RX_OFFLOAD_IPV4_CKSUM;
- CONFIG_VAR_APPEND("DEV_RX_OFFLOAD_IPV4_CKSUM ");
+ LSTACK_LOG(INFO, LSTACK, "DEV_RX_OFFLOAD_IPV4_CKSUM\n");
#endif
}
@@ -349,7 +350,7 @@ static int eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_inf
if (rx_ol_capa & DEV_RX_OFFLOAD_TCP_CKSUM) {
#if CHECKSUM_CHECK_TCP_HW
rx_ol |= DEV_RX_OFFLOAD_TCP_CKSUM;
- CONFIG_VAR_APPEND("DEV_RX_OFFLOAD_TCP_CKSUM ");
+ LSTACK_LOG(INFO, LSTACK, "DEV_RX_OFFLOAD_TCP_CKSUM\n");
#endif
}
@@ -357,7 +358,7 @@ static int eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_inf
if (tx_ol_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) {
#if CHECKSUM_GEN_IP_HW
tx_ol |= DEV_TX_OFFLOAD_IPV4_CKSUM;
- CONFIG_VAR_APPEND("DEV_TX_OFFLOAD_IPV4_CKSUM ");
+ LSTACK_LOG(INFO, LSTACK, "DEV_TX_OFFLOAD_IPV4_CKSUM\n");
#endif
}
@@ -365,7 +366,7 @@ static int eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_inf
if (tx_ol_capa & DEV_TX_OFFLOAD_TCP_CKSUM) {
#if CHECKSUM_GEN_TCP_HW
tx_ol |= DEV_TX_OFFLOAD_TCP_CKSUM;
- CONFIG_VAR_APPEND("DEV_TX_OFFLOAD_TCP_CKSUM ");
+ LSTACK_LOG(INFO, LSTACK, "DEV_TX_OFFLOAD_TCP_CKSUM\n");
#endif
}
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 379682c..fbb4d62 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -19,6 +19,7 @@
#include <lwip/priv/tcp_priv.h>
#include <securec.h>
#include <rte_errno.h>
+#include <rte_malloc.h>
#include "gazelle_base_func.h"
#include "lstack_ethdev.h"
@@ -140,37 +141,80 @@ void gazelle_clean_sock(int32_t fd)
sock->stack->conn_num--;
}
-static void gazelle_free_pbuf(struct pbuf *p)
+void gazelle_free_pbuf(struct pbuf *pbuf)
{
- struct rte_mbuf *mbuf = pbuf_to_mbuf(p);
- rte_pktmbuf_free(mbuf);
+ if (pbuf == NULL) {
+ return;
+ }
+
+ struct rte_mbuf *mbuf = pbuf_to_mbuf(pbuf);
+ if (mbuf->pool != NULL) {
+ rte_pktmbuf_free(mbuf);
+ } else {
+ rte_free(mbuf);
+ }
}
-static struct pbuf *tcp_pktmbuf_alloc(struct rte_mempool *pool, pbuf_layer layer, u16_t len)
+static int32_t alloc_mbufs(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num)
+{
+ // alloc mbuf from pool
+ if (rte_pktmbuf_alloc_bulk(pool, mbufs, num) == 0) {
+ return 0;
+ }
+
+ // alloc mbuf from system
+ for (uint32_t i = 0; i < num; i++) {
+ struct rte_mbuf *mbuf = (struct rte_mbuf *)rte_malloc(NULL, pool->elt_size, sizeof(uint64_t));
+ if (mbuf == NULL) {
+ for (uint32_t j = 0; j < i; j++) {
+ rte_free(mbufs[j]);
+ mbufs[j] = NULL;
+ }
+ return -1;
+ }
+
+ mbufs[i] = mbuf;
+ rte_pktmbuf_init(pool, NULL, mbuf, 0);
+ rte_pktmbuf_reset(mbuf);
+ mbuf->pool = NULL;
+ }
+
+ return 0;
+}
+
+int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num)
{
- struct rte_mbuf *mbuf = NULL;
- struct pbuf *pbuf = NULL;
struct pbuf_custom *pbuf_custom = NULL;
- u16_t offset = layer;
- u16_t total_len = LWIP_MEM_ALIGN_SIZE(offset) + LWIP_MEM_ALIGN_SIZE(len);
+ int32_t ret = alloc_mbufs(pool, mbufs, num);
+ if (ret != 0) {
+ get_protocol_stack()->stats.tx_allocmbuf_fail++;
+ return ret;
+ }
- int32_t ret = rte_pktmbuf_alloc_bulk(pool, &mbuf, 1);
- if (ret) {
- LSTACK_LOG(ERR, LSTACK, "tid %ld pktmbuf_alloc failed ret=%d\n", get_stack_tid(), ret);
- return NULL;
+
+ for (uint32_t i = 0; i < num; i++) {
+ pbuf_custom = mbuf_to_pbuf(mbufs[i]);
+ pbuf_custom->custom_free_function = gazelle_free_pbuf;
}
- uint8_t *data = (uint8_t *)rte_pktmbuf_append(mbuf, total_len);
- if (!data) {
- rte_pktmbuf_free(mbuf);
+ return 0;
+}
+
+struct pbuf *lwip_alloc_pbuf(pbuf_layer layer, uint16_t length, pbuf_type type)
+{
+ struct rte_mbuf *mbuf;
+ int32_t ret = alloc_mbufs(get_protocol_stack()->tx_pktmbuf_pool, &mbuf, 1);
+ if (ret != 0) {
+ get_protocol_stack()->stats.tx_allocmbuf_fail++;
return NULL;
}
- pbuf_custom = mbuf_to_pbuf(mbuf);
+ struct pbuf_custom *pbuf_custom = mbuf_to_pbuf(mbuf);
pbuf_custom->custom_free_function = gazelle_free_pbuf;
- pbuf = pbuf_alloced_custom(layer, len, PBUF_RAM, pbuf_custom, data, total_len);
- pbuf->flags |= PBUF_FLAG_SND_SAVE_CPY;
+
+ void *data = rte_pktmbuf_mtod(mbuf, void *);
+ struct pbuf *pbuf = pbuf_alloced_custom(layer, length, type, pbuf_custom, data, MAX_PACKET_SZ);
return pbuf;
}
@@ -180,7 +224,7 @@ void stack_replenish_send_idlembuf(struct protocol_stack *stack)
uint32_t replenish_cnt = rte_ring_free_count(stack->send_idle_ring);
for (uint32_t i = 0; i < replenish_cnt; i++) {
- struct pbuf *pbuf = tcp_pktmbuf_alloc(stack->tx_pktmbuf_pool, PBUF_TRANSPORT, TCP_MSS);
+ struct pbuf *pbuf = lwip_alloc_pbuf(PBUF_TRANSPORT, MAX_PACKET_SZ - PBUF_TRANSPORT, PBUF_RAM);
if (pbuf == NULL) {
break;
}
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index c0ab451..35665e6 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -198,8 +198,6 @@ int32_t init_protocol_stack(void)
init_list_node(&stack->recv_list);
init_list_node(&stack->listen_list);
- stack_replenish_send_idlembuf(stack);
-
stack_group->stacks[i] = stack;
}
@@ -290,6 +288,8 @@ static void stack_thread_init(struct protocol_stack *stack)
hugepage_init();
+ stack_replenish_send_idlembuf(stack);
+
tcpip_init(NULL, NULL);
if (use_ltran()) {
@@ -631,10 +631,9 @@ void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack
if (cur_stack == stack) {
continue;
}
-
- mbuf_copy = rte_pktmbuf_alloc(stack->rx_pktmbuf_pool);
- if (mbuf_copy == NULL) {
- stack->stats.rx_allocmbuf_fail++;
+
+ ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, &mbuf_copy, 1);
+ if (ret != 0) {
return;
}
copy_mbuf(mbuf_copy, mbuf);
diff --git a/src/lstack/include/lstack_ethdev.h b/src/lstack/include/lstack_ethdev.h
index 492a7c8..29e0c23 100644
--- a/src/lstack/include/lstack_ethdev.h
+++ b/src/lstack/include/lstack_ethdev.h
@@ -30,11 +30,7 @@ struct eth_dev_ops {
};
int32_t ethdev_init(struct protocol_stack *stack);
-
int32_t eth_dev_poll(void);
-int32_t eth_mbuf_claim(struct rte_mempool *pool, struct rte_mbuf **mbufs, unsigned count);
-
-
uint32_t eth_get_flow_cnt(void);
void eth_dev_recv(struct rte_mbuf *mbuf);
diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h
index 3be365d..8bf0f29 100644
--- a/src/lstack/include/lstack_lwip.h
+++ b/src/lstack/include/lstack_lwip.h
@@ -14,13 +14,11 @@
#define __LIBOS_LWIP_H__
#include "lstack_thread_rpc.h"
+#include "lwipsock.h"
#define SOCK_RECV_RING_SIZE (128)
#define SOCK_SEND_RING_SIZE (32)
-/* flags define last type PBUF_FLAG_TCP_FIN 0x20U in pbuf.h */
-#define PBUF_FLAG_SND_SAVE_CPY 0x40U
-
#define NETCONN_IS_ACCEPTIN(sock) (((sock)->conn->acceptmbox != NULL) && !sys_mbox_empty((sock)->conn->acceptmbox))
#define NETCONN_IS_DATAIN(sock) ((rte_ring_count((sock)->recv_ring) || (sock)->recv_lastdata))
#define NETCONN_IS_DATAOUT(sock) rte_ring_free_count((sock)->send_ring)
@@ -39,5 +37,7 @@ void get_lwip_conntable(struct rpc_msg *msg);
void get_lwip_connnum(struct rpc_msg *msg);
void stack_recvlist_count(struct rpc_msg *msg);
void stack_replenish_send_idlembuf(struct protocol_stack *stack);
+int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num);
+void gazelle_free_pbuf(struct pbuf *pbuf);
#endif
diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c
index 5d7161c..796a46d 100644
--- a/src/lstack/netif/lstack_ethdev.c
+++ b/src/lstack/netif/lstack_ethdev.c
@@ -36,63 +36,11 @@
#include "lstack_stack_stat.h"
#include "lstack_log.h"
#include "lstack_dpdk.h"
+#include "lstack_lwip.h"
#include "lstack_ethdev.h"
#define PKTMBUF_MALLOC_FLAG NULL
-static inline void eth_mbuf_reclaim(struct rte_mbuf *mbuf)
-{
- if (mbuf->pool != PKTMBUF_MALLOC_FLAG) {
- rte_pktmbuf_free(mbuf);
- } else {
- rte_free(mbuf);
- }
-}
-
-static void eth_pbuf_reclaim(struct pbuf *pbuf)
-{
- if (pbuf != NULL) {
- struct rte_mbuf *mbuf = pbuf_to_mbuf(pbuf);
- eth_mbuf_reclaim(mbuf);
- }
-}
-
-int32_t eth_mbuf_claim(struct rte_mempool *mp, struct rte_mbuf **mbufs, unsigned count)
-{
- struct rte_mbuf *m = NULL;
- uint32_t i;
-
- // try alloc mbuf from mbufpoll
- if (rte_pktmbuf_alloc_bulk(mp, mbufs, count) == 0) {
- return 0;
- }
-
- // try alloc mbuf from system
- for (i = 0; i < count; i++) {
- // elt_size == sizeof(struct pbuf_custom) + GAZELLE_MBUFF_PRIV_SIZE + MBUF_SZ
- m = (struct rte_mbuf *)rte_malloc(NULL, mp->elt_size, sizeof(uint64_t));
- if (m == NULL) {
- LSTACK_LOG(ERR, LSTACK, "vdev failed to malloc mbuf\n");
- break;
- }
- // init mbuf
- mbufs[i] = m;
- rte_pktmbuf_init(mp, NULL, m, 0);
- rte_pktmbuf_reset(m);
- m->pool = PKTMBUF_MALLOC_FLAG;
- }
-
- if (unlikely(i != count)) {
- for (uint32_t j = 0; j < i; j++) {
- rte_free(mbufs[j]);
- mbufs[j] = NULL;
- }
- return -1;
- }
-
- return 0;
-}
-
void eth_dev_recv(struct rte_mbuf *mbuf)
{
int32_t ret;
@@ -108,14 +56,11 @@ void eth_dev_recv(struct rte_mbuf *mbuf)
while (m != NULL) {
len = (uint16_t)rte_pktmbuf_pkt_len(m);
payload = rte_pktmbuf_mtod(m, void *);
-
pc = mbuf_to_pbuf(m);
- pc->custom_free_function = eth_pbuf_reclaim;
-
+ pc->custom_free_function = gazelle_free_pbuf;
next = pbuf_alloced_custom(PBUF_RAW, (uint16_t)len, PBUF_RAM, pc, payload, (uint16_t)len);
if (next == NULL) {
- stack->stats.rx_drop++;
- LSTACK_LOG(ERR, LSTACK, "eth_dev_recv: failed to allocate pbuf!\n");
+ stack->stats.rx_allocmbuf_fail++;
break;
}
@@ -185,42 +130,28 @@ uint32_t eth_get_flow_cnt(void)
static err_t eth_dev_output(struct netif *netif, struct pbuf *pbuf)
{
- uint8_t *data = NULL;
- int32_t ret;
- uint32_t sent_pkts;
- struct rte_mbuf *mbufs[DPDK_PKT_BURST_SIZE];
- uint16_t total_len = pbuf->tot_len;
- struct pbuf *head = pbuf;
struct protocol_stack *stack = get_protocol_stack();
+ struct rte_mbuf *mbuf = pbuf_to_mbuf(pbuf);
- ret = rte_pktmbuf_alloc_bulk(stack->tx_pktmbuf_pool, &mbufs[0], 1);
- if (ret != 0) {
- stack->stats.tx_drop++;
- stack->stats.tx_allocmbuf_fail++;
- LSTACK_LOG(ERR, LSTACK, "cannot alloc mbuf for output ret=%d\n", ret);
- return ERR_MEM;
- }
-
- data = (uint8_t *)rte_pktmbuf_append(mbufs[0], total_len);
- if (data == NULL) {
+ if (mbuf->buf_addr == 0) {
stack->stats.tx_drop++;
- stack->stats.tx_allocmbuf_fail++;
- LSTACK_LOG(ERR, LSTACK, "eth_dev_output: append mbuf failed!\n");
- rte_pktmbuf_free(mbufs[0]);
- return ERR_MEM;
+ return ERR_BUF;
}
- for (; head != NULL; head = head->next) {
- rte_memcpy(data, head->payload, head->len);
- data += head->len;
- }
+ mbuf->data_len = pbuf->len;
+ mbuf->pkt_len = pbuf->tot_len;
+ rte_mbuf_refcnt_update(mbuf, 1);
+#if CHECKSUM_GEN_IP_HW || CHECKSUM_GEN_TCP_HW
+ mbuf->ol_flags = pbuf->ol_flags;
+ mbuf->l2_len = pbuf->l2_len;
+ mbuf->l3_len = pbuf->l3_len;
+#endif
- sent_pkts = stack->dev_ops->tx_xmit(stack, mbufs, 1);
+ uint32_t sent_pkts = stack->dev_ops->tx_xmit(stack, &mbuf, 1);
stack->stats.tx += sent_pkts;
if (sent_pkts < 1) {
stack->stats.tx_drop++;
- rte_pktmbuf_free(mbufs[0]);
- mbufs[0] = NULL;
+ rte_pktmbuf_free(mbuf);
return ERR_MEM;
}
diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c
index 2b30334..a2f89fa 100644
--- a/src/lstack/netif/lstack_vdev.c
+++ b/src/lstack/netif/lstack_vdev.c
@@ -25,6 +25,7 @@
#include "lstack_ethdev.h"
#include "lstack_control_plane.h"
#include "lstack_log.h"
+#include "lstack_lwip.h"
#include "lstack_vdev.h"
/* INUSE_TX_PKTS_WATERMARK < VDEV_RX_QUEUE_SZ;
@@ -46,7 +47,7 @@ static uint32_t ltran_rx_poll(struct protocol_stack *stack, struct rte_mbuf **pk
stack->rx_ring_used += rcvd_pkts;
if (unlikely(stack->rx_ring_used >= USED_RX_PKTS_WATERMARK)) {
uint32_t free_cnt = LWIP_MIN(stack->rx_ring_used, DPDK_PKT_BURST_SIZE);
- int32_t ret = eth_mbuf_claim(stack->rx_pktmbuf_pool, (struct rte_mbuf **)free_buf, free_cnt);
+ int32_t ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, (struct rte_mbuf **)free_buf, free_cnt);
if (likely(ret == 0)) {
nr_pkts = rte_ring_en_enqueue_bulk(stack->rx_ring, (void **)free_buf, free_cnt);
stack->rx_ring_used -= nr_pkts;
--
2.30.0

View File

@ -1,27 +0,0 @@
From 23c3c39dda9ff0810ee16a5db7e2b21edc6a37d7 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Mon, 7 Mar 2022 23:14:21 +0800
Subject: [PATCH 03/34] execute gazelle_init_sock() before read event
---
src/lstack/core/lstack_protocol_stack.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 35665e6..f96d7a3 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -518,9 +518,7 @@ void stack_accept(struct rpc_msg *msg)
fd = sock->attach_fd;
msg->result = lwip_accept(fd, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p);
- if (msg->result > 0) {
- gazelle_init_sock(msg->result);
- } else {
+ if (msg->result <= 0) {
LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d attach_fd %d failed %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i,
fd, msg->result);
}
--
1.8.3.1

View File

@ -1,193 +0,0 @@
From 0f126e8723824823cddc608c2a6493ea9fc99e89 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Tue, 8 Mar 2022 10:59:59 +0800
Subject: [PATCH 04/34] recvmsg/sendmsg should use
recvmsg_from_stack/sendmsg_to_stack instead of
rpc_call_recvmsg/rpc_call_sendmsg
---
src/lstack/api/lstack_wrap.c | 33 +--------------
src/lstack/core/lstack_lwip.c | 88 ++++++++++++++++++++++++++++++++++++++++
src/lstack/include/lstack_lwip.h | 3 ++
3 files changed, 93 insertions(+), 31 deletions(-)
diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c
index 6488c62..7804ce9 100644
--- a/src/lstack/api/lstack_wrap.c
+++ b/src/lstack/api/lstack_wrap.c
@@ -103,10 +103,6 @@ static inline int32_t do_epoll_wait(int32_t epfd, struct epoll_event* events, in
static inline int32_t do_accept(int32_t s, struct sockaddr *addr, socklen_t *addrlen)
{
- if (addr == NULL || addrlen == NULL) {
- GAZELLE_RETURN(EINVAL);
- }
-
if (select_path(s) == PATH_KERNEL) {
return posix_api->accept_fn(s, addr, addrlen);
}
@@ -292,31 +288,6 @@ static inline ssize_t do_read(int32_t s, void *mem, size_t len)
return posix_api->read_fn(s, mem, len);
}
-static inline ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags)
-{
- if (buf == NULL) {
- GAZELLE_RETURN(EINVAL);
- }
-
- if (len == 0) {
- return 0;
- }
-
- struct lwip_sock *sock = get_socket(fd);
- if (sock == NULL) {
- GAZELLE_RETURN(EINVAL);
- }
-
- ssize_t send = write_stack_data(sock, buf, len);
- if (send < 0 || sock->have_rpc_send) {
- return send;
- }
-
- sock->have_rpc_send = true;
- ssize_t ret = rpc_call_send(fd, buf, len, flags);
- return (ret < 0) ? ret : send;
-}
-
static inline ssize_t do_send(int32_t sockfd, const void *buf, size_t len, int32_t flags)
{
if (select_path(sockfd) != PATH_LWIP) {
@@ -342,7 +313,7 @@ static inline ssize_t do_recvmsg(int32_t s, struct msghdr *message, int32_t flag
}
if (select_path(s) == PATH_LWIP) {
- return rpc_call_recvmsg(s, message, flags);
+ return recvmsg_from_stack(s, message, flags);
}
return posix_api->recv_msg(s, message, flags);
@@ -355,7 +326,7 @@ static inline ssize_t do_sendmsg(int32_t s, const struct msghdr *message, int32_
}
if (select_path(s) == PATH_LWIP) {
- return rpc_call_sendmsg(s, message, flags);
+ return sendmsg_to_stack(s, message, flags);
}
return posix_api->send_msg(s, message, flags);
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index fbb4d62..0a71aae 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -386,6 +386,94 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags)
return recv_len;
}
+ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags)
+{
+ ssize_t buflen = 0;
+ int32_t i;
+
+ if (message == NULL || message->msg_iovlen <= 0 || message->msg_iovlen > IOV_MAX) {
+ GAZELLE_RETURN(EINVAL);
+ }
+ for (i = 0; i < message->msg_iovlen; i++) {
+ if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len <= 0) ||
+ ((size_t)(ssize_t)message->msg_iov[i].iov_len != message->msg_iov[i].iov_len) ||
+ ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) <= 0)) {
+ GAZELLE_RETURN(EINVAL);
+ }
+ buflen = (ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len);
+ }
+ buflen = 0;
+ for (i = 0; i < message->msg_iovlen; i++) {
+ ssize_t recvd_local = read_stack_data(s, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, flags);
+ if (recvd_local > 0) {
+ buflen += recvd_local;
+ }
+ if (recvd_local < 0 || (recvd_local < (int)message->msg_iov[i].iov_len) || (flags & MSG_PEEK)) {
+ if (buflen <= 0) {
+ buflen = recvd_local;
+ }
+ break;
+ }
+ flags |= MSG_DONTWAIT;
+ }
+
+ return buflen;
+}
+
+ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags)
+{
+ if (buf == NULL) {
+ GAZELLE_RETURN(EINVAL);
+ }
+
+ if (len == 0) {
+ return 0;
+ }
+
+ struct lwip_sock *sock = get_socket(fd);
+ if (sock == NULL) {
+ GAZELLE_RETURN(EINVAL);
+ }
+
+ ssize_t send = write_stack_data(sock, buf, len);
+ if (send < 0 || sock->have_rpc_send) {
+ return send;
+ }
+
+ sock->have_rpc_send = true;
+ ssize_t ret = rpc_call_send(fd, buf, len, flags);
+ return (ret < 0) ? ret : send;
+}
+
+ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags)
+{
+ int32_t ret;
+ int32_t i;
+ ssize_t buflen = 0;
+
+ if (message == NULL || message->msg_iovlen <= 0 || message->msg_iovlen > IOV_MAX) {
+ GAZELLE_RETURN(EINVAL);
+ }
+ for (i = 0; i < message->msg_iovlen; i++) {
+ if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len <= 0) ||
+ ((size_t)(ssize_t)message->msg_iov[i].iov_len != message->msg_iov[i].iov_len) ||
+ ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) <= 0)) {
+ GAZELLE_RETURN(EINVAL);
+ }
+ buflen = (ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len);
+ }
+
+ for (i = 0; i < message->msg_iovlen; i++) {
+ ret = gazelle_send(s, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, flags);
+ if (ret < 0) {
+ return buflen == 0 ? ret : buflen;
+ }
+ buflen += ret;
+ }
+
+ return buflen;
+}
+
ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags)
{
size_t recv_left = len;
diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h
index 8bf0f29..581b9fe 100644
--- a/src/lstack/include/lstack_lwip.h
+++ b/src/lstack/include/lstack_lwip.h
@@ -39,5 +39,8 @@ void stack_recvlist_count(struct rpc_msg *msg);
void stack_replenish_send_idlembuf(struct protocol_stack *stack);
int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num);
void gazelle_free_pbuf(struct pbuf *pbuf);
+ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags);
+ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags);
+ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags);
#endif
--
1.8.3.1

View File

@ -1,31 +0,0 @@
From ff74c402d0502797fe4411178882bb3cb8e3ddd9 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Mon, 7 Mar 2022 23:30:12 +0800
Subject: [PATCH 05/34] fix LD_PRELOAD
---
src/lstack/api/lstack_wrap.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c
index 7804ce9..6ee5639 100644
--- a/src/lstack/api/lstack_wrap.c
+++ b/src/lstack/api/lstack_wrap.c
@@ -44,6 +44,14 @@ enum KERNEL_LWIP_PATH {
static inline enum KERNEL_LWIP_PATH select_path(int fd)
{
+ if (posix_api == NULL) {
+ /* link liblstack.so using LD_PRELOAD mode will read liblstack.so,
+ poisx_api need to be initialized here */
+ if (posix_api_init() != 0) {
+ LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n");
+ }
+ return PATH_KERNEL;
+ }
struct lwip_sock *sock = posix_api->get_socket(fd);
/* AF_UNIX case */
--
1.8.3.1

View File

@ -1,65 +0,0 @@
From 7b7dd1bdda75f8877e57f3b29432e3e1686bf9b5 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Mon, 7 Mar 2022 23:35:07 +0800
Subject: [PATCH 06/34] reduce replenish send_idle_ring rpc call
---
src/lstack/core/lstack_lwip.c | 4 ++--
src/lstack/core/lstack_thread_rpc.c | 2 ++
src/lstack/include/lstack_protocol_stack.h | 1 +
3 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 0a71aae..a9ef824 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -240,7 +240,7 @@ void stack_replenish_send_idlembuf(struct protocol_stack *stack)
ssize_t write_lwip_data(struct lwip_sock *sock, int32_t fd, int32_t flags)
{
struct pbuf *pbuf = NULL;
- ssize_t send_ret;
+ ssize_t send_ret = 0;
ssize_t send_len = 0;
do {
@@ -327,7 +327,7 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len)
sock->have_event = false;
}
- if (rte_ring_free_count(sock->stack->send_idle_ring) > USED_IDLE_WATERMARK) {
+ if (rte_ring_free_count(sock->stack->send_idle_ring) > USED_IDLE_WATERMARK && !sock->stack->in_replenish) {
rpc_call_replenish_idlembuf(sock->stack);
}
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index 1ed20dd..8b3d36c 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -194,10 +194,12 @@ static void rpc_replenish_idlembuf(struct rpc_msg *msg)
{
struct protocol_stack *stack = get_protocol_stack();
stack_replenish_send_idlembuf(stack);
+ stack->in_replenish = 0;
}
void rpc_call_replenish_idlembuf(struct protocol_stack *stack)
{
+ stack->in_replenish = 1;
struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, rpc_replenish_idlembuf);
if (msg == NULL) {
return;
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index 3c49bd5..1020e83 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -28,6 +28,7 @@ struct protocol_stack {
uint16_t socket_id;
uint16_t cpu_id;
volatile uint16_t conn_num;
+ volatile bool in_replenish;
// for dispatcher thread
cpu_set_t idle_cpuset;
--
1.8.3.1

View File

@ -1,50 +0,0 @@
From 6289822ec806dbcc0499378148e1b291d9f992f5 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Thu, 10 Mar 2022 21:03:59 +0800
Subject: [PATCH 07/34] parse_host_addr() should be executed before
parse_dpdk_args()
---
src/lstack/core/lstack_cfg.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
index 0f899b1..d8eaced 100644
--- a/src/lstack/core/lstack_cfg.c
+++ b/src/lstack/core/lstack_cfg.c
@@ -63,16 +63,16 @@ struct config_vector_t {
};
static struct config_vector_t g_config_tbl[] = {
- { "dpdk_args", parse_dpdk_args },
+ { "host_addr", parse_host_addr },
+ { "gateway_addr", parse_gateway_addr },
+ { "mask_addr", parse_mask_addr },
{ "use_ltran", parse_use_ltran },
+ { "devices", parse_devices },
+ { "dpdk_args", parse_dpdk_args },
{ "num_cpus", parse_stack_cpu_number },
{ "num_weakup", parse_weakup_cpu_number },
{ "numa_bind", parse_numa_bind },
{ "low_power_mode", parse_low_power_mode },
- { "host_addr", parse_host_addr },
- { "mask_addr", parse_mask_addr },
- { "devices", parse_devices },
- { "gateway_addr", parse_gateway_addr },
{ "kni_switch", parse_kni_switch },
{ NULL, NULL }
};
@@ -302,8 +302,9 @@ static int32_t numa_to_cpusnum(unsigned socket_id, uint32_t *cpulist, int32_t nu
int32_t count = 0;
char *elem = strtok(strbuf, "-");
while (elem && count < num) {
- while (elem && isspace(*elem))
+ while (elem && isspace(*elem)) {
elem++;
+ }
cpulist[count++] = (uint32_t)strtol(elem, NULL, 10); // 10 : decimal
if (count % 2 == 0) // 2 : even
--
1.8.3.1

View File

@ -1,56 +0,0 @@
From b9914a2ff92b34242eefd9d42bc80a8b0a6307c5 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Tue, 8 Mar 2022 14:45:59 +0800
Subject: [PATCH 08/34] fix gazellectl -l option error
---
src/ltran/ltran_dfx.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index 159fbb9..381d30d 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -1182,19 +1182,23 @@ static int32_t parse_dfx_cmd_args(int32_t argc, char *argv[], struct gazelle_sta
return num_cmd;
}
-static int32_t check_cmd_support(enum GAZELLE_STAT_MODE stat_mode)
+static int32_t check_cmd_support(struct gazelle_stat_msg_request *req_msg, int32_t req_msg_num)
{
- switch (stat_mode) {
+ switch (req_msg[0].stat_mode) {
case GAZELLE_STAT_LSTACK_LOG_LEVEL_SET:
case GAZELLE_STAT_LSTACK_SHOW:
case GAZELLE_STAT_LSTACK_SHOW_SNMP:
case GAZELLE_STAT_LSTACK_SHOW_CONN:
case GAZELLE_STAT_LSTACK_SHOW_LATENCY:
case GAZELLE_STAT_LSTACK_LOW_POWER_MDF:
- case GAZELLE_STAT_LTRAN_START_LATENCY:
return 0;
default:
- show_usage();
+ if (req_msg[0].stat_mode == GAZELLE_STAT_LTRAN_START_LATENCY &&
+ req_msg[req_msg_num - 1].stat_mode == GAZELLE_STAT_LSTACK_SHOW_LATENCY) {
+ return 0;
+ }
+ /* keep output consistency */
+ printf("connect ltran failed. errno: 111 ret=-1\n");
return -1;
}
@@ -1220,9 +1224,9 @@ int32_t main(int32_t argc, char *argv[])
g_gazelle_dfx_tbl[GAZELLE_STAT_LSTACK_SHOW].recv_size = sizeof(struct gazelle_stack_dfx_data);
g_gazelle_dfx_tbl[GAZELLE_STAT_LTRAN_START_LATENCY].recv_size =sizeof(struct gazelle_stack_dfx_data);
g_gazelle_dfx_tbl[GAZELLE_STAT_LTRAN_STOP_LATENCY].recv_size =sizeof(struct gazelle_stack_dfx_data);
- ret = check_cmd_support(req_msg[msg_index].stat_mode);
+ ret = check_cmd_support(req_msg, req_msg_num);
if (ret < 0) {
- return 0;
+ return -1;
}
}
--
1.8.3.1

View File

@ -1,24 +0,0 @@
From bc1452fc1b981f62f72744954c2679497ac28f77 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Tue, 8 Mar 2022 20:19:35 +0800
Subject: [PATCH 09/34] bind cpu fail just walrm
---
src/lstack/core/lstack_dpdk.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index 280d643..0544943 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -80,7 +80,6 @@ int32_t thread_affinity_init(int32_t cpu_id)
ret = rte_thread_set_affinity(&cpuset);
if (ret != 0) {
LSTACK_LOG(ERR, LSTACK, "thread %d pthread_setaffinity_np failed ret=%d\n", rte_gettid(), ret);
- return -1;
}
return 0;
--
1.8.3.1

View File

@ -1,38 +0,0 @@
From 175ea2338bc5f9f428b1155d3910f40a8a311c25 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Wed, 9 Mar 2022 17:34:59 +0800
Subject: [PATCH 10/34] -mfix close not release sock
---
src/lstack/core/lstack_lwip.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index a9ef824..87d99d3 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -127,18 +127,18 @@ void gazelle_init_sock(int32_t fd)
void gazelle_clean_sock(int32_t fd)
{
- struct lwip_sock *sock = get_socket(fd);
+ struct lwip_sock *sock = get_socket_by_fd(fd);
if (sock == NULL) {
return;
}
+ sock->stack->conn_num--;
+
reset_sock_data(sock);
list_del_node_init(&sock->recv_list);
list_del_node_init(&sock->attach_list);
list_del_node_init(&sock->listen_list);
-
- sock->stack->conn_num--;
}
void gazelle_free_pbuf(struct pbuf *pbuf)
--
1.8.3.1

View File

@ -1,66 +0,0 @@
From 7f3dbd7145d683c22e70d69ec8799a49cb837415 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Wed, 9 Mar 2022 17:44:50 +0800
Subject: [PATCH 11/34] fix evetns err
---
src/lstack/core/lstack_lwip.c | 36 ++++++++++++++++++++----------------
1 file changed, 20 insertions(+), 16 deletions(-)
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 87d99d3..3b97bb8 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -317,14 +317,16 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len)
send_pkt++;
}
- if (NETCONN_IS_DATAOUT(sock)) {
- sock->have_event = true;
- sock->events |= EPOLLOUT;
- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
- sem_post(&sock->weakup->event_sem);
- sock->stack->stats.write_events++;
- } else {
- sock->have_event = false;
+ if ((sock->epoll_events & EPOLLOUT)) {
+ if (NETCONN_IS_DATAOUT(sock)) {
+ sock->have_event = true;
+ sock->events |= EPOLLOUT;
+ rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
+ sem_post(&sock->weakup->event_sem);
+ sock->stack->stats.write_events++;
+ } else {
+ sock->have_event = false;
+ }
}
if (rte_ring_free_count(sock->stack->send_idle_ring) > USED_IDLE_WATERMARK && !sock->stack->in_replenish) {
@@ -518,14 +520,16 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags)
}
}
- if (NETCONN_IS_DATAIN(sock)) {
- sock->have_event = true;
- sock->events |= EPOLLIN;
- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
- sem_post(&sock->weakup->event_sem);
- sock->stack->stats.read_events++;
- } else {
- sock->have_event = false;
+ if ((sock->epoll_events & EPOLLIN)) {
+ if (NETCONN_IS_DATAIN(sock)) {
+ sock->have_event = true;
+ sock->events |= EPOLLIN;
+ rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
+ sem_post(&sock->weakup->event_sem);
+ sock->stack->stats.read_events++;
+ } else {
+ sock->have_event = false;
+ }
}
if (recvd == 0) {
--
1.8.3.1

View File

@ -1,56 +0,0 @@
From 5d5268f64f4bd9b3fcdc2aad3d0d2f24c307351a Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Wed, 9 Mar 2022 19:26:51 +0800
Subject: [PATCH 12/34] fix dfx info show
---
src/lstack/core/lstack_lwip.c | 12 ++++++------
src/ltran/ltran_dfx.c | 2 +-
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 3b97bb8..8de032f 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -667,6 +667,12 @@ void get_lwip_conntable(struct rpc_msg *msg)
conn_num++;
}
+ for (pcb = tcp_tw_pcbs; pcb != NULL && conn_num < max_num; pcb = pcb->next) {
+ conn[conn_num].state = TIME_WAIT_LIST;
+ copy_pcb_to_conn(conn + conn_num, pcb);
+ conn_num++;
+ }
+
for (struct tcp_pcb_listen *pcbl = tcp_listen_pcbs.listen_pcbs; pcbl != NULL && conn_num < max_num;
pcbl = pcbl->next) {
conn[conn_num].state = LISTEN_LIST;
@@ -680,12 +686,6 @@ void get_lwip_conntable(struct rpc_msg *msg)
conn_num++;
}
- for (pcb = tcp_tw_pcbs; pcb != NULL && conn_num < max_num; pcb = pcb->next) {
- conn[conn_num].state = TIME_WAIT_LIST;
- copy_pcb_to_conn(conn + conn_num, pcb);
- conn_num++;
- }
-
msg->result = conn_num;
}
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index 381d30d..2a268f7 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -879,7 +879,7 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_
do {
printf("\n------ stack tid: %6u ------\n", stat->tid);
printf("No. Proto recv_cnt recv_ring in_send send_ring Local Address"
- " Foreign Address State\n");
+ " Foreign Address State\n");
unread_pkts = 0;
for (i = 0; i < conn->conn_num && i < GAZELLE_LSTACK_MAX_CONN; i++) {
struct gazelle_stat_lstack_conn_info *conn_info = &conn->conn_list[i];
--
1.8.3.1

View File

@ -1,49 +0,0 @@
From 92b990c766e21fc275bd7cd80bbdccc819ac30f8 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Wed, 9 Mar 2022 20:13:16 +0800
Subject: [PATCH 13/34] balance acept
---
src/lstack/core/lstack_protocol_stack.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index f96d7a3..badcfd3 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -709,18 +709,30 @@ int32_t stack_broadcast_listen(int32_t fd, int32_t backlog)
/* ergodic the protocol stack thread to find the connection, because all threads are listening */
int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen)
{
+ struct lwip_sock *min_sock = NULL;
+ int32_t min_fd;
+
while (fd > 0) {
struct lwip_sock *sock = get_socket(fd);
if (sock == NULL) {
GAZELLE_RETURN(EINVAL);
}
- if (NETCONN_IS_ACCEPTIN(sock)) {
- return rpc_call_accept(fd, addr, addrlen);
+ if (!NETCONN_IS_ACCEPTIN(sock)) {
+ continue;
+ }
+
+ if (min_sock == NULL || min_sock->stack->conn_num > sock->stack->conn_num) {
+ min_sock = sock;
+ min_fd = fd;
}
fd = sock->nextfd;
}
+ if (min_sock) {
+ return rpc_call_accept(min_fd, addr, addrlen);
+ }
+
GAZELLE_RETURN(EAGAIN);
}
--
1.8.3.1

View File

@ -1,248 +0,0 @@
From 4defcc589cfdd71234c2931ca8bee081ceab491a Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Wed, 9 Mar 2022 21:27:04 +0800
Subject: [PATCH 14/34] fix miss evetn
---
src/common/gazelle_dfx_msg.h | 1 +
src/lstack/api/lstack_epoll.c | 5 ---
src/lstack/core/lstack_lwip.c | 16 ++++++---
src/lstack/core/lstack_protocol_stack.c | 59 +++++++++++++++++++++++----------
src/lstack/include/lstack_weakup.h | 26 ++++++++++-----
src/ltran/ltran_dfx.c | 7 ++--
6 files changed, 75 insertions(+), 39 deletions(-)
diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h
index cde2fec..e681424 100644
--- a/src/common/gazelle_dfx_msg.h
+++ b/src/common/gazelle_dfx_msg.h
@@ -83,6 +83,7 @@ struct gazelle_stat_pkts {
uint64_t call_alloc_fail;
uint64_t read_events;
uint64_t write_events;
+ uint64_t accept_events;
uint64_t read_null;
uint64_t recv_empty;
uint64_t event_null;
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index 99d1eac..b1bb84c 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -43,11 +43,6 @@ enum POLL_TYPE {
static inline bool report_events(struct lwip_sock *sock, uint32_t event)
{
- /* listen fd event */
- if (sock->attach_fd > 0) {
- return true;
- }
-
/* error event */
if ((event & EPOLLERR) || (event & EPOLLHUP) || (event & EPOLLRDHUP)) {
return true;
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 8de032f..0561678 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -318,14 +318,18 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len)
}
if ((sock->epoll_events & EPOLLOUT)) {
+ /* avoid miss EPOLLOUT event, call NETCONN_IS_DATAOUT twice.
+ write data full and have_event=true, then data out add event failed because of have_event */
+ if (!NETCONN_IS_DATAOUT(sock)) {
+ sock->have_event = false;
+ }
+
if (NETCONN_IS_DATAOUT(sock)) {
sock->have_event = true;
sock->events |= EPOLLOUT;
rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
sem_post(&sock->weakup->event_sem);
sock->stack->stats.write_events++;
- } else {
- sock->have_event = false;
}
}
@@ -521,14 +525,18 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags)
}
if ((sock->epoll_events & EPOLLIN)) {
+ /* avoid miss EPOLLIN event, call NETCONN_IS_DATAIN twice.
+ read data empty and have_event=true, then data in add event failed because of have_event */
+ if (!NETCONN_IS_DATAIN(sock)) {
+ sock->have_event = false;
+ }
+
if (NETCONN_IS_DATAIN(sock)) {
sock->have_event = true;
sock->events |= EPOLLIN;
rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
sem_post(&sock->weakup->event_sem);
sock->stack->stats.read_events++;
- } else {
- sock->have_event = false;
}
}
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index badcfd3..197942f 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -505,6 +505,24 @@ void stack_listen(struct rpc_msg *msg)
}
}
+static bool have_accept_event(int32_t fd)
+{
+ do {
+ struct lwip_sock *sock = get_socket(fd);
+ if (sock == NULL) {
+ break;
+ }
+
+ if (NETCONN_IS_ACCEPTIN(sock)) {
+ return true;
+ }
+
+ fd = sock->nextfd;
+ } while (fd > 0);
+
+ return false;
+}
+
void stack_accept(struct rpc_msg *msg)
{
int32_t fd = msg->args[MSG_ARG_0].i;
@@ -522,21 +540,6 @@ void stack_accept(struct rpc_msg *msg)
LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d attach_fd %d failed %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i,
fd, msg->result);
}
-
- /* report remain accept event */
- do {
- struct lwip_sock *sock = get_socket(fd);
- if (sock == NULL) {
- break;
- }
-
- if ((sock->epoll_events & EPOLLIN) && NETCONN_IS_ACCEPTIN(sock)) {
- add_epoll_event(sock->conn, EPOLLIN);
- break;
- }
-
- fd = sock->nextfd;
- } while (fd > 0);
}
void stack_connect(struct rpc_msg *msg)
@@ -710,7 +713,9 @@ int32_t stack_broadcast_listen(int32_t fd, int32_t backlog)
int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen)
{
struct lwip_sock *min_sock = NULL;
- int32_t min_fd;
+ int32_t head_fd = fd;
+ int32_t min_fd = fd;
+ int32_t ret = -1;
while (fd > 0) {
struct lwip_sock *sock = get_socket(fd);
@@ -731,8 +736,26 @@ int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *add
}
if (min_sock) {
- return rpc_call_accept(min_fd, addr, addrlen);
+ ret = rpc_call_accept(min_fd, addr, addrlen);
+ }
+
+ /* avoid miss accept event, call have_accept_event twice.
+ rpc_call_accept empty and have_event=true, then establish connection add event failed because of have_event */
+ struct lwip_sock *sock = get_socket(head_fd);
+ if (!have_accept_event(head_fd)) {
+ sock->have_event = false;
+ }
+
+ if (have_accept_event(head_fd)) {
+ sock->have_event = true;
+ sock->events |= EPOLLIN;
+ rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
+ sem_post(&sock->weakup->event_sem);
+ sock->stack->stats.accept_events++;
}
- GAZELLE_RETURN(EAGAIN);
+ if(ret < 0) {
+ errno = EAGAIN;
+ }
+ return ret;
}
diff --git a/src/lstack/include/lstack_weakup.h b/src/lstack/include/lstack_weakup.h
index 6f11653..f334a0f 100644
--- a/src/lstack/include/lstack_weakup.h
+++ b/src/lstack/include/lstack_weakup.h
@@ -49,21 +49,29 @@ static inline __attribute__((always_inline)) void weakup_attach_sock(struct lwip
static inline __attribute__((always_inline)) void weakup_thread(struct rte_ring *weakup_ring)
{
- uint32_t num;
- struct lwip_sock *sock[WEAKUP_MAX];
+ struct lwip_sock *sock;
int32_t ret;
- num = rte_ring_sc_dequeue_burst(weakup_ring, (void **)sock, WEAKUP_MAX, NULL);
- for (uint32_t i = 0; i < num; ++i) {
- ret = rte_ring_mp_enqueue(sock[i]->weakup->event_ring, (void *)sock[i]);
+ for (uint32_t i = 0; i < WEAKUP_MAX; ++i) {
+ ret = rte_ring_sc_dequeue(weakup_ring, (void **)&sock);
+ if (ret != 0) {
+ break;
+ }
+
+ ret = rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
if (ret == 0) {
- sem_post(&sock[i]->weakup->event_sem);
- sock[i]->stack->stats.lwip_events++;
+ sem_post(&sock->weakup->event_sem);
+ sock->stack->stats.lwip_events++;
}
/* listen notice attach sock */
- if (!list_is_empty(&sock[i]->attach_list)) {
- weakup_attach_sock(sock[i]);
+ if (!list_is_empty(&sock->attach_list)) {
+ weakup_attach_sock(sock);
+ }
+
+ /* event_ring of attach sock may have idle elem */
+ if (ret != 0) {
+ break;
}
}
}
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index 2a268f7..1f4d88a 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -567,14 +567,15 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat)
printf("weakup_events: %-14"PRIu64" ", lstack_stat->data.pkts.weakup_events);
printf("lwip_events: %-16"PRIu64" ", lstack_stat->data.pkts.lwip_events);
printf("app_events: %-17"PRIu64"\n", lstack_stat->data.pkts.app_events);
+ printf("read_events: %-16"PRIu64" ", lstack_stat->data.pkts.read_events);
+ printf("write_events: %-15"PRIu64" ", lstack_stat->data.pkts.write_events);
+ printf("accept_events: %-14"PRIu64" \n", lstack_stat->data.pkts.accept_events);
printf("call_msg: %-19"PRIu64" ", lstack_stat->data.pkts.call_msg_cnt);
printf("read_null: %-18"PRIu64" ", lstack_stat->data.pkts.read_null);
- printf("read_events: %-16"PRIu64" \n", lstack_stat->data.pkts.read_events);
+ printf("recv_empty: %-17"PRIu64" \n", lstack_stat->data.pkts.recv_empty);
printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail);
printf("event_null: %-17"PRIu64" ", lstack_stat->data.pkts.event_null);
printf("remove_event: %-15"PRIu64" \n", lstack_stat->data.pkts.remove_event);
- printf("recv_empty: %-17"PRIu64" ", lstack_stat->data.pkts.recv_empty);
- printf("write_events: %-15"PRIu64" ", lstack_stat->data.pkts.write_events);
printf("send_self_rpc: %-14"PRIu64" \n", lstack_stat->data.pkts.send_self_rpc);
}
--
1.8.3.1

View File

@ -1,204 +0,0 @@
From a43b1b763b970660caeaf3f3206cd742990c0cd3 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Wed, 9 Mar 2022 23:05:41 +0800
Subject: [PATCH 15/34] fix too much evetns
---
src/lstack/api/lstack_epoll.c | 50 +++++++++++++++++----------------
src/lstack/core/lstack_lwip.c | 40 ++++++++------------------
src/lstack/core/lstack_protocol_stack.c | 8 +-----
src/ltran/ltran_dfx.c | 4 +--
4 files changed, 41 insertions(+), 61 deletions(-)
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index b1bb84c..6c9c582 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -41,6 +41,19 @@ enum POLL_TYPE {
TYPE_EPOLL,
};
+static inline bool check_event_vaild(struct lwip_sock *sock, uint32_t event)
+{
+ if (event == EPOLLIN && !NETCONN_IS_ACCEPTIN(sock) && !NETCONN_IS_DATAIN(sock)) {
+ return false;
+ }
+
+ if (sock->events == EPOLLOUT && !NETCONN_IS_DATAOUT(sock)) {
+ return false;
+ }
+
+ return true;
+}
+
static inline bool report_events(struct lwip_sock *sock, uint32_t event)
{
/* error event */
@@ -48,7 +61,11 @@ static inline bool report_events(struct lwip_sock *sock, uint32_t event)
return true;
}
- return false;
+ if (sock->have_event) {
+ return false;
+ }
+
+ return check_event_vaild(sock, event);
}
void add_epoll_event(struct netconn *conn, uint32_t event)
@@ -72,7 +89,7 @@ void add_epoll_event(struct netconn *conn, uint32_t event)
sock->events |= event & sock->epoll_events;
- if (!sock->have_event || report_events(sock, event)) {
+ if (report_events(sock, event)) {
sock->have_event = true;
weakup_enqueue(sock->stack->weakup_ring, sock);
sock->stack->stats.weakup_events++;
@@ -232,29 +249,16 @@ static inline int32_t save_poll_event(struct pollfd *fds, uint32_t maxevents, st
return event_num;
}
-static int32_t check_event_vaild(struct epoll_event *events, int32_t event_num, struct lwip_sock *sock,
- struct lwip_sock **sock_list, enum POLL_TYPE etype)
+static bool remove_event(enum POLL_TYPE etype, struct lwip_sock **sock_list, int32_t event_num, struct lwip_sock *sock)
{
/* remove duplicate event */
- if (etype == TYPE_EPOLL) {
- for (uint32_t i = 0; i < event_num; i++) {
- if (sock_list[i] == sock) {
- return -1;
- }
+ for (uint32_t i = 0; i < event_num && etype == TYPE_EPOLL; i++) {
+ if (sock_list[i] == sock) {
+ return true;
}
}
- /* non_listen_fd remove no data EPOLLIN event */
- if (sock->events == EPOLLIN && sock->attach_fd < 0 && !NETCONN_IS_DATAIN(sock)) {
- return -1;
- }
-
- /* remove no send_buff OUT event */
- if (sock->events == EPOLLOUT && !NETCONN_IS_DATAOUT(sock)) {
- return -1;
- }
-
- return 0;
+ return !check_event_vaild(sock, sock->events);
}
static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t maxevents, enum POLL_TYPE etype)
@@ -280,11 +284,9 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m
get_protocol_stack_group()->event_null++;
break;
}
+ sock->have_event = false;
- ret = check_event_vaild(events, event_num, sock, weakup->sock_list, etype);
- if (ret != 0) {
- events_cnt--;
- sock->have_event = false;
+ if (remove_event(etype, weakup->sock_list, event_num, sock)) {
sock->stack->stats.remove_event++;
continue;
}
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 0561678..4a79f46 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -317,20 +317,12 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len)
send_pkt++;
}
- if ((sock->epoll_events & EPOLLOUT)) {
- /* avoid miss EPOLLOUT event, call NETCONN_IS_DATAOUT twice.
- write data full and have_event=true, then data out add event failed because of have_event */
- if (!NETCONN_IS_DATAOUT(sock)) {
- sock->have_event = false;
- }
-
- if (NETCONN_IS_DATAOUT(sock)) {
- sock->have_event = true;
- sock->events |= EPOLLOUT;
- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
- sem_post(&sock->weakup->event_sem);
- sock->stack->stats.write_events++;
- }
+ if (!sock->have_event && (sock->epoll_events & EPOLLOUT) && NETCONN_IS_DATAOUT(sock)) {
+ sock->have_event = true;
+ sock->events |= EPOLLOUT;
+ rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
+ sem_post(&sock->weakup->event_sem);
+ sock->stack->stats.write_events++;
}
if (rte_ring_free_count(sock->stack->send_idle_ring) > USED_IDLE_WATERMARK && !sock->stack->in_replenish) {
@@ -524,20 +516,12 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags)
}
}
- if ((sock->epoll_events & EPOLLIN)) {
- /* avoid miss EPOLLIN event, call NETCONN_IS_DATAIN twice.
- read data empty and have_event=true, then data in add event failed because of have_event */
- if (!NETCONN_IS_DATAIN(sock)) {
- sock->have_event = false;
- }
-
- if (NETCONN_IS_DATAIN(sock)) {
- sock->have_event = true;
- sock->events |= EPOLLIN;
- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
- sem_post(&sock->weakup->event_sem);
- sock->stack->stats.read_events++;
- }
+ if (!sock->have_event && (sock->epoll_events & EPOLLIN) && NETCONN_IS_DATAIN(sock)) {
+ sock->have_event = true;
+ sock->events |= EPOLLIN;
+ rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
+ sem_post(&sock->weakup->event_sem);
+ sock->stack->stats.read_events++;
}
if (recvd == 0) {
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 197942f..68cc49d 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -739,14 +739,8 @@ int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *add
ret = rpc_call_accept(min_fd, addr, addrlen);
}
- /* avoid miss accept event, call have_accept_event twice.
- rpc_call_accept empty and have_event=true, then establish connection add event failed because of have_event */
struct lwip_sock *sock = get_socket(head_fd);
- if (!have_accept_event(head_fd)) {
- sock->have_event = false;
- }
-
- if (have_accept_event(head_fd)) {
+ if (!sock->have_event && have_accept_event(head_fd)) {
sock->have_event = true;
sock->events |= EPOLLIN;
rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index 1f4d88a..a552b40 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -556,9 +556,9 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat)
printf("read_lwip: %-18"PRIu64" ", lstack_stat->data.pkts.read_lwip_cnt);
printf("read_lwip_drop: %-13"PRIu64" \n", lstack_stat->data.pkts.read_lwip_drop);
printf("app_write: %-18"PRIu64" ", lstack_stat->data.pkts.app_write_cnt);
- printf("app_write_drop: %-13"PRIu64" ", lstack_stat->data.pkts.app_write_drop);
- printf("app_get_idlefail: %-11"PRIu64" \n", lstack_stat->data.pkts.app_write_idlefail);
printf("write_lwip: %-17"PRIu64" ", lstack_stat->data.pkts.write_lwip_cnt);
+ printf("app_get_idlefail: %-11"PRIu64" \n", lstack_stat->data.pkts.app_write_idlefail);
+ printf("app_write_drop: %-13"PRIu64" ", lstack_stat->data.pkts.app_write_drop);
printf("write_lwip_drop: %-12"PRIu64" ", lstack_stat->data.pkts.write_lwip_drop);
printf("app_write_idlebuf: %-10"PRIu16" \n", lstack_stat->data.pkts.send_idle_ring_cnt);
printf("recv_list: %-18"PRIu64" ", lstack_stat->data.pkts.recv_list);
--
1.8.3.1

View File

@ -1,24 +0,0 @@
From 5755516a6d49b5fee68169521e974abe276801f1 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Thu, 10 Mar 2022 10:12:09 +0800
Subject: [PATCH 16/34] fix dead loop
---
src/lstack/core/lstack_protocol_stack.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 68cc49d..939543b 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -724,6 +724,7 @@ int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *add
}
if (!NETCONN_IS_ACCEPTIN(sock)) {
+ fd = sock->nextfd;
continue;
}
--
1.8.3.1

View File

@ -1,110 +0,0 @@
From 0a2b49d63807e62c5b13418e70e641b3d50ce3f2 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Thu, 10 Mar 2022 20:19:14 +0800
Subject: [PATCH 17/34] remove unuse event
---
src/lstack/api/lstack_epoll.c | 19 +++++++++++++------
src/lstack/core/lstack_lwip.c | 9 ++++++++-
src/lstack/core/lstack_thread_rpc.c | 1 -
3 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index 6c9c582..b12ce58 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -43,15 +43,15 @@ enum POLL_TYPE {
static inline bool check_event_vaild(struct lwip_sock *sock, uint32_t event)
{
- if (event == EPOLLIN && !NETCONN_IS_ACCEPTIN(sock) && !NETCONN_IS_DATAIN(sock)) {
- return false;
+ if ((event & EPOLLIN) && !NETCONN_IS_ACCEPTIN(sock) && !NETCONN_IS_DATAIN(sock)) {
+ event &= ~EPOLLIN;
}
- if (sock->events == EPOLLOUT && !NETCONN_IS_DATAOUT(sock)) {
- return false;
+ if ((event & EPOLLOUT) && !NETCONN_IS_DATAOUT(sock)) {
+ event &= ~EPOLLOUT;
}
- return true;
+ return (event) ? true : false;
}
static inline bool report_events(struct lwip_sock *sock, uint32_t event)
@@ -251,6 +251,11 @@ static inline int32_t save_poll_event(struct pollfd *fds, uint32_t maxevents, st
static bool remove_event(enum POLL_TYPE etype, struct lwip_sock **sock_list, int32_t event_num, struct lwip_sock *sock)
{
+ /* close sock */
+ if (sock->stack == NULL) {
+ return true;
+ }
+
/* remove duplicate event */
for (uint32_t i = 0; i < event_num && etype == TYPE_EPOLL; i++) {
if (sock_list[i] == sock) {
@@ -287,7 +292,9 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m
sock->have_event = false;
if (remove_event(etype, weakup->sock_list, event_num, sock)) {
- sock->stack->stats.remove_event++;
+ if (sock->stack) {
+ sock->stack->stats.remove_event++;
+ }
continue;
}
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 4a79f46..fd334fb 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -128,7 +128,7 @@ void gazelle_init_sock(int32_t fd)
void gazelle_clean_sock(int32_t fd)
{
struct lwip_sock *sock = get_socket_by_fd(fd);
- if (sock == NULL) {
+ if (sock == NULL || sock->stack == NULL) {
return;
}
@@ -324,8 +324,12 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len)
sem_post(&sock->weakup->event_sem);
sock->stack->stats.write_events++;
}
+ if (!NETCONN_IS_DATAOUT(sock)) {
+ sock->events &= ~EPOLLOUT;
+ }
if (rte_ring_free_count(sock->stack->send_idle_ring) > USED_IDLE_WATERMARK && !sock->stack->in_replenish) {
+ stack->in_replenish = true;
rpc_call_replenish_idlembuf(sock->stack);
}
@@ -523,6 +527,9 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags)
sem_post(&sock->weakup->event_sem);
sock->stack->stats.read_events++;
}
+ if (!NETCONN_IS_DATAIN(sock)) {
+ sock->events &= ~EPOLLIN;
+ }
if (recvd == 0) {
sock->stack->stats.read_null++;
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index 8b3d36c..af5fad3 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -199,7 +199,6 @@ static void rpc_replenish_idlembuf(struct rpc_msg *msg)
void rpc_call_replenish_idlembuf(struct protocol_stack *stack)
{
- stack->in_replenish = 1;
struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, rpc_replenish_idlembuf);
if (msg == NULL) {
return;
--
1.8.3.1

View File

@ -1,45 +0,0 @@
From e531579c08a56b2a53ea605a7bbba70bedfbae45 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Fri, 11 Mar 2022 10:53:28 +0800
Subject: [PATCH 18/34] fix gazellectl show
---
src/lstack/core/lstack_lwip.c | 2 +-
src/ltran/ltran_dfx.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index fd334fb..90ddecc 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -329,7 +329,7 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len)
}
if (rte_ring_free_count(sock->stack->send_idle_ring) > USED_IDLE_WATERMARK && !sock->stack->in_replenish) {
- stack->in_replenish = true;
+ sock->stack->in_replenish = true;
rpc_call_replenish_idlembuf(sock->stack);
}
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index a552b40..a01d91f 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -1214,13 +1214,13 @@ int32_t main(int32_t argc, char *argv[])
struct gazelle_dfx_list *dfx = NULL;
char recv_buf[GAZELLE_CMD_RESP_BUFFER_SIZE + 1] = {0};
+ g_use_ltran = ltran_process_exist() ? true : false;
req_msg_num = parse_dfx_cmd_args(argc, argv, req_msg);
if (req_msg_num <= 0 || req_msg_num > GAZELLE_CMD_MAX) {
show_usage();
return 0;
}
- g_use_ltran = ltran_process_exist() ? true : false;
if (!g_use_ltran) {
g_gazelle_dfx_tbl[GAZELLE_STAT_LSTACK_SHOW].recv_size = sizeof(struct gazelle_stack_dfx_data);
g_gazelle_dfx_tbl[GAZELLE_STAT_LTRAN_START_LATENCY].recv_size =sizeof(struct gazelle_stack_dfx_data);
--
1.8.3.1

View File

@ -1,423 +0,0 @@
From 18a911bfd87c4b558740a586728e2bbec9813a6f Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Fri, 11 Mar 2022 16:21:43 +0800
Subject: [PATCH 19/34] fix repeate msg
---
src/common/gazelle_dfx_msg.h | 1 +
src/lstack/core/lstack_dpdk.c | 2 +-
src/lstack/core/lstack_lwip.c | 25 ++++---------
src/lstack/core/lstack_protocol_stack.c | 2 +-
src/lstack/core/lstack_thread_rpc.c | 63 ++++++++++++++++++---------------
src/lstack/include/lstack_thread_rpc.h | 3 +-
src/ltran/ltran_dfx.c | 3 +-
7 files changed, 46 insertions(+), 53 deletions(-)
diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h
index e681424..41cbefa 100644
--- a/src/common/gazelle_dfx_msg.h
+++ b/src/common/gazelle_dfx_msg.h
@@ -89,6 +89,7 @@ struct gazelle_stat_pkts {
uint64_t event_null;
uint64_t remove_event;
uint64_t send_self_rpc;
+ uint64_t call_null;
};
/* same as define in lwip/stats.h - struct stats_mib2 */
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index 0544943..b8320db 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -133,7 +133,7 @@ static struct rte_mempool *create_rpc_mempool(const char *name, uint16_t queue_i
if (ret < 0) {
return NULL;
}
- pool = rte_mempool_create(pool_name, CALL_POOL_SZ, sizeof(struct rpc_msg), CALL_CACHE_SZ, 0, NULL, NULL, NULL,
+ pool = rte_mempool_create(pool_name, CALL_POOL_SZ, sizeof(struct rpc_msg), 0, 0, NULL, NULL, NULL,
NULL, rte_socket_id(), 0);
if (pool == NULL) {
LSTACK_LOG(ERR, LSTACK, "cannot create %s pool rte_err=%d\n", pool_name, rte_errno);
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 90ddecc..1fc8446 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -26,6 +26,7 @@
#include "lstack_protocol_stack.h"
#include "lstack_log.h"
#include "lstack_weakup.h"
+#include "lstack_dpdk.h"
#include "lstack_stack_stat.h"
#include "lstack_lwip.h"
@@ -82,9 +83,9 @@ static void reset_sock_data(struct lwip_sock *sock)
}
}
-
void gazelle_init_sock(int32_t fd)
{
+ static uint32_t name_tick = 0;
struct lwip_sock *sock = get_socket(fd);
if (sock == NULL) {
return;
@@ -92,29 +93,15 @@ void gazelle_init_sock(int32_t fd)
reset_sock_data(sock);
- int32_t ret;
- char name[RTE_RING_NAMESIZE] = {0};
- static uint32_t name_tick = 0;
-
- ret = snprintf_s(name, sizeof(name), RTE_RING_NAMESIZE - 1, "%s_%d", "sock_recv", name_tick++);
- if (ret < 0) {
- LSTACK_LOG(ERR, LSTACK, "%s create failed.\n", name);
- return;
- }
- sock->recv_ring = rte_ring_create(name, SOCK_RECV_RING_SIZE, rte_socket_id(), RING_F_SP_ENQ | RING_F_SC_DEQ);
+ sock->recv_ring = create_ring("sock_recv", SOCK_RECV_RING_SIZE, 0, name_tick++);
if (sock->recv_ring == NULL) {
- LSTACK_LOG(ERR, LSTACK, "%s create failed. errno: %d.\n", name, rte_errno);
+ LSTACK_LOG(ERR, LSTACK, "sock_recv create failed. errno: %d.\n", rte_errno);
return;
}
- ret = snprintf_s(name, sizeof(name), RTE_RING_NAMESIZE - 1, "%s_%d", "sock_send", name_tick++);
- if (ret < 0) {
- LSTACK_LOG(ERR, LSTACK, "%s create failed. errno: %d.\n", name, rte_errno);
- return;
- }
- sock->send_ring = rte_ring_create(name, SOCK_SEND_RING_SIZE, rte_socket_id(), RING_F_SP_ENQ | RING_F_SC_DEQ);
+ sock->send_ring = create_ring("sock_send", SOCK_SEND_RING_SIZE, 0, name_tick++);
if (sock->send_ring == NULL) {
- LSTACK_LOG(ERR, LSTACK, "%s create failed. errno: %d.\n", name, rte_errno);
+ LSTACK_LOG(ERR, LSTACK, "sock_send create failed. errno: %d.\n", rte_errno);
return;
}
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 939543b..db8a20a 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -318,7 +318,7 @@ static void* gazelle_stack_thread(void *arg)
stack_thread_init(stack);
for (;;) {
- poll_rpc_msg(&stack->rpc_queue, stack->rpc_pool);
+ poll_rpc_msg(stack);
eth_dev_poll();
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index af5fad3..b4d57d3 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -24,12 +24,12 @@
#define HANDLE_RPC_MSG_MAX (8)
static inline __attribute__((always_inline))
-struct rpc_msg *rpc_msg_alloc(struct rte_mempool *pool, rpc_msg_func func)
+struct rpc_msg *rpc_msg_alloc(struct protocol_stack *stack, rpc_msg_func func)
{
int32_t ret;
struct rpc_msg *msg = NULL;
- ret = rte_mempool_get(pool, (void **)&msg);
+ ret = rte_mempool_get(stack->rpc_pool, (void **)&msg);
if (ret < 0) {
get_protocol_stack_group()->call_alloc_fail++;
return NULL;
@@ -46,6 +46,9 @@ static inline __attribute__((always_inline))
void rpc_msg_free(struct rte_mempool *pool, struct rpc_msg *msg)
{
pthread_spin_destroy(&msg->lock);
+
+ msg->self_release = 0;
+ msg->func = NULL;
rte_mempool_put(pool, (void *)msg);
}
@@ -71,7 +74,7 @@ int32_t rpc_sync_call(lockless_queue *queue, struct rte_mempool *pool, struct rp
return ret;
}
-void poll_rpc_msg(lockless_queue *rpc_queue, struct rte_mempool *rpc_pool)
+void poll_rpc_msg(struct protocol_stack *stack)
{
int32_t num;
struct rpc_msg *msg = NULL;
@@ -79,7 +82,7 @@ void poll_rpc_msg(lockless_queue *rpc_queue, struct rte_mempool *rpc_pool)
num = 0;
lockless_queue_node *first_node = NULL;
while (num++ < HANDLE_RPC_MSG_MAX) {
- lockless_queue_node *node = lockless_queue_mpsc_pop(rpc_queue);
+ lockless_queue_node *node = lockless_queue_mpsc_pop(&stack->rpc_queue);
if (node == NULL) {
return;
}
@@ -91,6 +94,8 @@ void poll_rpc_msg(lockless_queue *rpc_queue, struct rte_mempool *rpc_pool)
if (msg->func) {
msg->func(msg);
+ } else {
+ stack->stats.call_null++;
}
rte_mb();
@@ -98,7 +103,7 @@ void poll_rpc_msg(lockless_queue *rpc_queue, struct rte_mempool *rpc_pool)
if (msg->self_release) {
pthread_spin_unlock(&msg->lock);
} else {
- rpc_msg_free(rpc_pool, msg);
+ rpc_msg_free(stack->rpc_pool, msg);
}
if (first_node == node) {
@@ -109,7 +114,7 @@ void poll_rpc_msg(lockless_queue *rpc_queue, struct rte_mempool *rpc_pool)
int32_t rpc_call_conntable(struct protocol_stack *stack, void *conn_table, uint32_t max_conn)
{
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, get_lwip_conntable);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, get_lwip_conntable);
if (msg == NULL) {
return -1;
}
@@ -122,7 +127,7 @@ int32_t rpc_call_conntable(struct protocol_stack *stack, void *conn_table, uint3
int32_t rpc_call_connnum(struct protocol_stack *stack)
{
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, get_lwip_connnum);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, get_lwip_connnum);
if (msg == NULL) {
return -1;
}
@@ -132,7 +137,7 @@ int32_t rpc_call_connnum(struct protocol_stack *stack)
int32_t rpc_call_shadow_fd(struct protocol_stack *stack, int32_t fd, const struct sockaddr *addr, socklen_t addrlen)
{
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, create_shadow_fd);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, create_shadow_fd);
if (msg == NULL) {
return -1;
}
@@ -152,7 +157,7 @@ static void rpc_msgcnt(struct rpc_msg *msg)
int32_t rpc_call_msgcnt(struct protocol_stack *stack)
{
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, rpc_msgcnt);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, rpc_msgcnt);
if (msg == NULL) {
return -1;
}
@@ -162,7 +167,7 @@ int32_t rpc_call_msgcnt(struct protocol_stack *stack)
int32_t rpc_call_thread_regphase1(struct protocol_stack *stack, void *conn)
{
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, thread_register_phase1);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, thread_register_phase1);
if (msg == NULL) {
return -1;
}
@@ -172,7 +177,7 @@ int32_t rpc_call_thread_regphase1(struct protocol_stack *stack, void *conn)
int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn)
{
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, thread_register_phase2);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, thread_register_phase2);
if (msg == NULL) {
return -1;
}
@@ -182,7 +187,7 @@ int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn)
int32_t rpc_call_recvlistcnt(struct protocol_stack *stack)
{
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_recvlist_count);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_recvlist_count);
if (msg == NULL) {
return -1;
}
@@ -199,7 +204,7 @@ static void rpc_replenish_idlembuf(struct rpc_msg *msg)
void rpc_call_replenish_idlembuf(struct protocol_stack *stack)
{
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, rpc_replenish_idlembuf);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, rpc_replenish_idlembuf);
if (msg == NULL) {
return;
}
@@ -210,7 +215,7 @@ void rpc_call_replenish_idlembuf(struct protocol_stack *stack)
int32_t rpc_call_arp(struct protocol_stack *stack, struct rte_mbuf *mbuf)
{
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_arp);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_arp);
if (msg == NULL) {
return -1;
}
@@ -225,7 +230,7 @@ int32_t rpc_call_arp(struct protocol_stack *stack, struct rte_mbuf *mbuf)
int32_t rpc_call_socket(int32_t domain, int32_t type, int32_t protocol)
{
struct protocol_stack *stack = get_minconn_protocol_stack();
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_socket);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_socket);
if (msg == NULL) {
return -1;
}
@@ -240,7 +245,7 @@ int32_t rpc_call_socket(int32_t domain, int32_t type, int32_t protocol)
int32_t rpc_call_close(int fd)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_close);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_close);
if (msg == NULL) {
return -1;
}
@@ -253,7 +258,7 @@ int32_t rpc_call_close(int fd)
int32_t rpc_call_bind(int32_t fd, const struct sockaddr *addr, socklen_t addrlen)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_bind);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_bind);
if (msg == NULL) {
return -1;
}
@@ -268,7 +273,7 @@ int32_t rpc_call_bind(int32_t fd, const struct sockaddr *addr, socklen_t addrlen
int32_t rpc_call_listen(int s, int backlog)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(s);
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_listen);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_listen);
if (msg == NULL) {
return -1;
}
@@ -282,7 +287,7 @@ int32_t rpc_call_listen(int s, int backlog)
int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_accept);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_accept);
if (msg == NULL) {
return -1;
}
@@ -297,7 +302,7 @@ int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen)
int32_t rpc_call_connect(int fd, const struct sockaddr *addr, socklen_t addrlen)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_connect);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_connect);
if (msg == NULL) {
return -1;
}
@@ -312,7 +317,7 @@ int32_t rpc_call_connect(int fd, const struct sockaddr *addr, socklen_t addrlen)
int32_t rpc_call_getpeername(int fd, struct sockaddr *addr, socklen_t *addrlen)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_getpeername);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_getpeername);
if (msg == NULL) {
return -1;
}
@@ -327,7 +332,7 @@ int32_t rpc_call_getpeername(int fd, struct sockaddr *addr, socklen_t *addrlen)
int32_t rpc_call_getsockname(int fd, struct sockaddr *addr, socklen_t *addrlen)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_getsockname);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_getsockname);
if (msg == NULL) {
return -1;
}
@@ -342,7 +347,7 @@ int32_t rpc_call_getsockname(int fd, struct sockaddr *addr, socklen_t *addrlen)
int32_t rpc_call_getsockopt(int fd, int level, int optname, void *optval, socklen_t *optlen)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_getsockopt);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_getsockopt);
if (msg == NULL) {
return -1;
}
@@ -359,7 +364,7 @@ int32_t rpc_call_getsockopt(int fd, int level, int optname, void *optval, sockle
int32_t rpc_call_setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_setsockopt);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_setsockopt);
if (msg == NULL) {
return -1;
}
@@ -376,7 +381,7 @@ int32_t rpc_call_setsockopt(int fd, int level, int optname, const void *optval,
int32_t rpc_call_fcntl(int fd, int cmd, long val)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_fcntl);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_fcntl);
if (msg == NULL) {
return -1;
}
@@ -391,7 +396,7 @@ int32_t rpc_call_fcntl(int fd, int cmd, long val)
int32_t rpc_call_ioctl(int fd, long cmd, void *argp)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_ioctl);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_ioctl);
if (msg == NULL) {
return -1;
}
@@ -437,7 +442,7 @@ static void stack_send(struct rpc_msg *msg)
ssize_t rpc_call_send(int fd, const void *buf, size_t len, int flags)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_send);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_send);
if (msg == NULL) {
return -1;
}
@@ -454,7 +459,7 @@ ssize_t rpc_call_send(int fd, const void *buf, size_t len, int flags)
int32_t rpc_call_sendmsg(int fd, const struct msghdr *msghdr, int flags)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_sendmsg);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_sendmsg);
if (msg == NULL) {
return -1;
}
@@ -469,7 +474,7 @@ int32_t rpc_call_sendmsg(int fd, const struct msghdr *msghdr, int flags)
int32_t rpc_call_recvmsg(int fd, struct msghdr *msghdr, int flags)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
- struct rpc_msg *msg = rpc_msg_alloc(stack->rpc_pool, stack_recvmsg);
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_recvmsg);
if (msg == NULL) {
return -1;
}
diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h
index 8a05d6c..1365234 100644
--- a/src/lstack/include/lstack_thread_rpc.h
+++ b/src/lstack/include/lstack_thread_rpc.h
@@ -47,9 +47,8 @@ struct rpc_msg {
union rpc_msg_arg args[RPM_MSG_ARG_SIZE]; /* resolve by type */
};
-void poll_rpc_msg(lockless_queue *rpc_queue, struct rte_mempool *rpc_pool);
-
struct protocol_stack;
+void poll_rpc_msg(struct protocol_stack *stack);
void rpc_call_replenish_idlembuf(struct protocol_stack *stack);
int32_t rpc_call_msgcnt(struct protocol_stack *stack);
int32_t rpc_call_shadow_fd(struct protocol_stack *stack, int32_t fd, const struct sockaddr *addr, socklen_t addrlen);
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index a01d91f..4b46ac9 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -576,7 +576,8 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat)
printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail);
printf("event_null: %-17"PRIu64" ", lstack_stat->data.pkts.event_null);
printf("remove_event: %-15"PRIu64" \n", lstack_stat->data.pkts.remove_event);
- printf("send_self_rpc: %-14"PRIu64" \n", lstack_stat->data.pkts.send_self_rpc);
+ printf("send_self_rpc: %-14"PRIu64" ", lstack_stat->data.pkts.send_self_rpc);
+ printf("call_null: %-18"PRIu64" \n", lstack_stat->data.pkts.call_null);
}
static void gazelle_print_lstack_stat_detail(struct gazelle_stack_dfx_data *lstack_stat,
--
1.8.3.1

View File

@ -1,103 +0,0 @@
From e9294baffd16b59f481d787332f11c657d85473a Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Wed, 16 Mar 2022 14:34:43 +0800
Subject: [PATCH 20/34] fix wakeup typos
---
src/lstack/core/lstack_cfg.c | 19 ++++++++++++-------
src/lstack/include/lstack_cfg.h | 2 +-
src/lstack/lstack.conf | 2 +-
3 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
index d8eaced..e5a92ca 100644
--- a/src/lstack/core/lstack_cfg.c
+++ b/src/lstack/core/lstack_cfg.c
@@ -70,7 +70,7 @@ static struct config_vector_t g_config_tbl[] = {
{ "devices", parse_devices },
{ "dpdk_args", parse_dpdk_args },
{ "num_cpus", parse_stack_cpu_number },
- { "num_weakup", parse_weakup_cpu_number },
+ { "num_wakeup", parse_weakup_cpu_number },
{ "numa_bind", parse_numa_bind },
{ "low_power_mode", parse_low_power_mode },
{ "kni_switch", parse_kni_switch },
@@ -305,12 +305,17 @@ static int32_t numa_to_cpusnum(unsigned socket_id, uint32_t *cpulist, int32_t nu
while (elem && isspace(*elem)) {
elem++;
}
+ if (elem == NULL) {
+ LSTACK_LOG(ERR, LSTACK, "parse %s failed\n", path);
+ return -1;
+ }
cpulist[count++] = (uint32_t)strtol(elem, NULL, 10); // 10 : decimal
- if (count % 2 == 0) // 2 : even
+ if (count % 2 == 0) { // 2 : even
elem = strtok(NULL, "-");
- else
+ } else {
elem = strtok(NULL, ",");
+ }
}
return count;
@@ -353,7 +358,7 @@ int32_t init_stack_numa_cpuset(void)
for (int32_t idx = 0; idx < cfg->num_cpu; ++idx) {
CPU_SET(cfg->cpus[idx], &stack_cpuset);
}
- for (int32_t idx = 0; idx < cfg->num_weakup; ++idx) {
+ for (int32_t idx = 0; idx < cfg->num_wakeup; ++idx) {
CPU_SET(cfg->weakup[idx], &stack_cpuset);
}
@@ -691,9 +696,9 @@ static int32_t parse_weakup_cpu_number(void)
int32_t ret;
- g_config_params.num_weakup = 0;
+ g_config_params.num_wakeup = 0;
- cfg_args = config_lookup(&g_config, "num_weakup");
+ cfg_args = config_lookup(&g_config, "num_wakeup");
if (cfg_args == NULL) {
return 0;
}
@@ -707,7 +712,7 @@ static int32_t parse_weakup_cpu_number(void)
if (ret <= 0) {
return -EINVAL;
}
- g_config_params.num_weakup = (uint16_t)ret;
+ g_config_params.num_wakeup = (uint16_t)ret;
return 0;
}
diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h
index a8f5ea0..9096797 100644
--- a/src/lstack/include/lstack_cfg.h
+++ b/src/lstack/include/lstack_cfg.h
@@ -66,7 +66,7 @@ struct cfg_params {
uint8_t numa_bind;
uint16_t num_cpu;
uint16_t cpus[CFG_MAX_CPUS];
- uint16_t num_weakup;
+ uint16_t num_wakeup;
uint16_t weakup[CFG_MAX_CPUS];
uint8_t num_ports;
uint16_t ports[CFG_MAX_PORTS];
diff --git a/src/lstack/lstack.conf b/src/lstack/lstack.conf
index 0f46e77..eb996f1 100644
--- a/src/lstack/lstack.conf
+++ b/src/lstack/lstack.conf
@@ -16,7 +16,7 @@ kni_switch=0
low_power_mode=0
num_cpus="2"
-num_weakup="3"
+num_wakeup="3"
numa_bind=1
--
1.8.3.1

View File

@ -1,50 +0,0 @@
From ce951a907f5634e8502d28fb66ae79a3a3c82689 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Fri, 11 Mar 2022 21:19:19 +0800
Subject: [PATCH 21/34] fix pasre numacpulist
---
src/lstack/core/lstack_cfg.c | 19 ++++++++-----------
1 file changed, 8 insertions(+), 11 deletions(-)
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
index e5a92ca..058a392 100644
--- a/src/lstack/core/lstack_cfg.c
+++ b/src/lstack/core/lstack_cfg.c
@@ -323,25 +323,22 @@ static int32_t numa_to_cpusnum(unsigned socket_id, uint32_t *cpulist, int32_t nu
static int32_t stack_idle_cpuset(struct protocol_stack *stack, cpu_set_t *exclude)
{
- int32_t cpunum;
uint32_t cpulist[CPUS_RANGE_NUM];
- cpunum = numa_to_cpusnum(stack->socket_id, cpulist, CPUS_RANGE_NUM);
- if (cpunum <= 0 || cpunum % 2 != 0) { // 2 : even
+ int32_t cpunum = numa_to_cpusnum(stack->socket_id, cpulist, CPUS_RANGE_NUM);
+ if (cpunum <= 0 ) {
LSTACK_LOG(ERR, LSTACK, "numa_to_cpusnum failed\n");
return -1;
}
CPU_ZERO(&stack->idle_cpuset);
- for (uint32_t n = 0; n < cpunum; n += 2) { // 2 : even
- for (uint32_t i = cpulist[n]; i <= cpulist[n + 1]; i++) {
- /* skip stack cpu */
- if (CPU_ISSET(i, exclude)) {
- continue;
- }
-
- CPU_SET(i, &stack->idle_cpuset);
+ for (int32_t i = 0; i < cpunum; i++) {
+ /* skip stack cpu */
+ if (CPU_ISSET(cpulist[i], exclude)) {
+ continue;
}
+
+ CPU_SET(cpulist[i], &stack->idle_cpuset);
}
return 0;
--
1.8.3.1

View File

@ -1,267 +0,0 @@
From c064bea759414419d7fcae6c31455e517a9556f9 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Wed, 16 Mar 2022 15:19:53 +0800
Subject: [PATCH 22/34] fix get data error
---
src/common/gazelle_dfx_msg.h | 2 +-
src/lstack/api/lstack_epoll.c | 10 ++++------
src/lstack/core/lstack_dpdk.c | 8 +++-----
src/lstack/core/lstack_lwip.c | 15 ++++++++-------
src/lstack/core/lstack_stack_stat.c | 1 -
src/lstack/core/lstack_thread_rpc.c | 8 --------
src/lstack/include/lstack_protocol_stack.h | 1 -
src/lstack/netif/lstack_ethdev.c | 4 ++--
src/ltran/ltran_dfx.c | 7 +++----
9 files changed, 21 insertions(+), 35 deletions(-)
diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h
index 41cbefa..3956c33 100644
--- a/src/common/gazelle_dfx_msg.h
+++ b/src/common/gazelle_dfx_msg.h
@@ -86,10 +86,10 @@ struct gazelle_stat_pkts {
uint64_t accept_events;
uint64_t read_null;
uint64_t recv_empty;
- uint64_t event_null;
uint64_t remove_event;
uint64_t send_self_rpc;
uint64_t call_null;
+ uint64_t arp_copy_fail;
};
/* same as define in lwip/stats.h - struct stats_mib2 */
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index b12ce58..885ec45 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -78,17 +78,16 @@ void add_epoll_event(struct netconn *conn, uint32_t event)
sock = sock->shadowed_sock;
}
- /* sock not in monitoring */
- if (!sock->weakup) {
+ if ((event & sock->epoll_events) == 0) {
return;
}
+ sock->events |= event & sock->epoll_events;
- if ((event & sock->epoll_events) == 0) {
+ /* sock not in monitoring */
+ if (!sock->weakup) {
return;
}
- sock->events |= event & sock->epoll_events;
-
if (report_events(sock, event)) {
sock->have_event = true;
weakup_enqueue(sock->stack->weakup_ring, sock);
@@ -286,7 +285,6 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m
while (event_num < events_cnt) {
int32_t ret = rte_ring_sc_dequeue(weakup->event_ring, (void **)&sock);
if (ret != 0) {
- get_protocol_stack_group()->event_null++;
break;
}
sock->have_event = false;
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index b8320db..fb0e988 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -167,14 +167,12 @@ int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num)
return -1;
}
- stack->rx_pktmbuf_pool = create_pktmbuf_mempool("rx_mbuf", RX_NB_MBUF / stack_num, RX_MBUF_CACHE_SZ,
- stack->queue_id);
+ stack->rx_pktmbuf_pool = create_pktmbuf_mempool("rx_mbuf", RX_NB_MBUF / stack_num, 0, stack->queue_id);
if (stack->rx_pktmbuf_pool == NULL) {
return -1;
}
- stack->tx_pktmbuf_pool = create_pktmbuf_mempool("tx_mbuf", TX_NB_MBUF / stack_num, TX_MBUF_CACHE_SZ,
- stack->queue_id);
+ stack->tx_pktmbuf_pool = create_pktmbuf_mempool("tx_mbuf", TX_NB_MBUF / stack_num, 0, stack->queue_id);
if (stack->tx_pktmbuf_pool == NULL) {
return -1;
}
@@ -557,7 +555,7 @@ int32_t dpdk_init_lstack_kni(void)
{
struct protocol_stack_group *stack_group = get_protocol_stack_group();
- stack_group->kni_pktmbuf_pool = create_pktmbuf_mempool("kni_mbuf", KNI_NB_MBUF, KNI_MBUF_CACHE_SZ, 0);
+ stack_group->kni_pktmbuf_pool = create_pktmbuf_mempool("kni_mbuf", KNI_NB_MBUF, 0, 0);
if (stack_group->kni_pktmbuf_pool == NULL) {
return -1;
}
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 1fc8446..1a9d9b9 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -175,7 +175,6 @@ int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs,
int32_t ret = alloc_mbufs(pool, mbufs, num);
if (ret != 0) {
- get_protocol_stack()->stats.tx_allocmbuf_fail++;
return ret;
}
@@ -289,7 +288,7 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len)
}
copy_len = (len - send_len > pbuf->len) ? pbuf->len : (len - send_len);
- pbuf_take(pbuf, buf + send_len, copy_len);
+ pbuf_take(pbuf, (char *)buf + send_len, copy_len);
pbuf->tot_len = pbuf->len = copy_len;
ret = rte_ring_sp_enqueue(sock->send_ring, pbuf);
@@ -331,13 +330,13 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags)
uint32_t free_count = rte_ring_free_count(sock->recv_ring);
uint32_t data_count = rte_ring_count(sock->conn->recvmbox->ring);
-
+ uint32_t read_max = LWIP_MIN(free_count, data_count);
struct pbuf *pbuf = NULL;
- uint32_t read_count = LWIP_MIN(free_count, data_count);
+ uint32_t read_count = 0;
ssize_t recv_len = 0;
int32_t ret;
- for (uint32_t i = 0; i < read_count; i++) {
+ for (uint32_t i = 0; i < read_max; i++) {
err_t err = netconn_recv_tcp_pbuf_flags(sock->conn, &pbuf, apiflags);
if (err != ERR_OK) {
if (recv_len > 0) {
@@ -356,6 +355,7 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags)
sock->stack->stats.read_lwip_drop++;
break;
}
+ read_count++;
}
recv_len += pbuf->len;
@@ -364,7 +364,7 @@ ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags)
apiflags |= NETCONN_DONTBLOCK | NETCONN_NOFIN;
}
- if (data_count > free_count) {
+ if (data_count > read_count) {
add_recv_list(sock->conn->socket);
}
@@ -481,6 +481,7 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags)
while (recv_left > 0) {
if (sock->recv_lastdata) {
pbuf = sock->recv_lastdata;
+ sock->recv_lastdata = NULL;
} else {
ret = rte_ring_sc_dequeue(sock->recv_ring, (void **)&pbuf);
if (ret != 0) {
@@ -490,7 +491,7 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags)
}
copy_len = (recv_left > pbuf->tot_len) ? pbuf->tot_len : (u16_t)recv_left;
- pbuf_copy_partial(pbuf, buf + recvd, copy_len, 0);
+ pbuf_copy_partial(pbuf, (char *)buf + recvd, copy_len, 0);
recvd += copy_len;
recv_left -= copy_len;
diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c
index 0bd1c6c..41fe9bf 100644
--- a/src/lstack/core/lstack_stack_stat.c
+++ b/src/lstack/core/lstack_stack_stat.c
@@ -105,7 +105,6 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_
lstack_get_low_power_info(&dfx->low_power_info);
memcpy_s(&dfx->data.pkts, sizeof(dfx->data.pkts), &stack->stats, sizeof(dfx->data.pkts));
dfx->data.pkts.call_alloc_fail = stack_group->call_alloc_fail;
- dfx->data.pkts.event_null = stack_group->event_null;
dfx->data.pkts.weakup_ring_cnt = rte_ring_count(stack->weakup_ring);
dfx->data.pkts.send_idle_ring_cnt = rte_ring_count(stack->send_idle_ring);
dfx->data.pkts.call_msg_cnt = rpc_call_msgcnt(stack);
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index b4d57d3..8af1077 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -80,15 +80,11 @@ void poll_rpc_msg(struct protocol_stack *stack)
struct rpc_msg *msg = NULL;
num = 0;
- lockless_queue_node *first_node = NULL;
while (num++ < HANDLE_RPC_MSG_MAX) {
lockless_queue_node *node = lockless_queue_mpsc_pop(&stack->rpc_queue);
if (node == NULL) {
return;
}
- if (first_node == NULL) {
- first_node = node;
- }
msg = container_of(node, struct rpc_msg, queue_node);
@@ -105,10 +101,6 @@ void poll_rpc_msg(struct protocol_stack *stack)
} else {
rpc_msg_free(stack->rpc_pool, msg);
}
-
- if (first_node == node) {
- break;
- }
}
}
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index 1020e83..f289465 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -72,7 +72,6 @@ struct protocol_stack_group {
/* dfx stats */
bool latency_start;
uint64_t call_alloc_fail;
- uint64_t event_null;
};
long get_stack_tid(void);
diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c
index 796a46d..026f545 100644
--- a/src/lstack/netif/lstack_ethdev.c
+++ b/src/lstack/netif/lstack_ethdev.c
@@ -97,8 +97,8 @@ int32_t eth_dev_poll(void)
}
if (get_protocol_stack_group()->latency_start) {
- uint64_t time_stamp = get_current_time();
- time_stamp_into_mbuf(nr_pkts, pkts, time_stamp);
+ uint64_t time_stamp = get_current_time();
+ time_stamp_into_mbuf(nr_pkts, pkts, time_stamp);
}
for (uint32_t i = 0; i < nr_pkts; i++) {
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index 4b46ac9..5b3a95c 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -390,7 +390,7 @@ static void gazelle_print_ltran_start_latency(void *buf, const struct gazelle_st
static void gazelle_print_ltran_stat_latency(void *buf, const struct gazelle_stat_msg_request *req_msg)
{
struct in_addr *ip_addr = (struct in_addr *)buf;
- struct gazelle_stat_lstack_total *stat = (struct gazelle_stat_lstack_total *)(buf + sizeof(*ip_addr));
+ struct gazelle_stat_lstack_total *stat = (struct gazelle_stat_lstack_total *)((char *)buf + sizeof(*ip_addr));
uint64_t total_rx = 0;
double total_latency = 0;
uint64_t max = 0;
@@ -574,9 +574,8 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat)
printf("read_null: %-18"PRIu64" ", lstack_stat->data.pkts.read_null);
printf("recv_empty: %-17"PRIu64" \n", lstack_stat->data.pkts.recv_empty);
printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail);
- printf("event_null: %-17"PRIu64" ", lstack_stat->data.pkts.event_null);
- printf("remove_event: %-15"PRIu64" \n", lstack_stat->data.pkts.remove_event);
- printf("send_self_rpc: %-14"PRIu64" ", lstack_stat->data.pkts.send_self_rpc);
+ printf("remove_event: %-15"PRIu64" ", lstack_stat->data.pkts.remove_event);
+ printf("send_self_rpc: %-14"PRIu64" \n", lstack_stat->data.pkts.send_self_rpc);
printf("call_null: %-18"PRIu64" \n", lstack_stat->data.pkts.call_null);
}
--
1.8.3.1

View File

@ -1,197 +0,0 @@
From efd5bfb1a4a070217a0ff174d32500130b629d0a Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Wed, 16 Mar 2022 15:35:20 +0800
Subject: [PATCH 23/34] delete numa bind param
---
src/common/gazelle_dfx_msg.h | 1 -
src/lstack/api/lstack_epoll.c | 11 ++++-------
src/lstack/core/lstack_cfg.c | 19 -------------------
src/lstack/core/lstack_lwip.c | 1 -
src/lstack/core/lstack_protocol_stack.c | 4 ----
src/lstack/core/lstack_thread_rpc.c | 8 +++-----
src/lstack/include/lstack_cfg.h | 1 -
src/lstack/lstack.conf | 2 --
src/ltran/ltran_dfx.c | 5 ++---
9 files changed, 9 insertions(+), 43 deletions(-)
diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h
index 3956c33..cea4200 100644
--- a/src/common/gazelle_dfx_msg.h
+++ b/src/common/gazelle_dfx_msg.h
@@ -85,7 +85,6 @@ struct gazelle_stat_pkts {
uint64_t write_events;
uint64_t accept_events;
uint64_t read_null;
- uint64_t recv_empty;
uint64_t remove_event;
uint64_t send_self_rpc;
uint64_t call_null;
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index 885ec45..bcbb35e 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -83,16 +83,13 @@ void add_epoll_event(struct netconn *conn, uint32_t event)
}
sock->events |= event & sock->epoll_events;
- /* sock not in monitoring */
- if (!sock->weakup) {
+ if (!sock->weakup || !report_events(sock, event)) {
return;
}
- if (report_events(sock, event)) {
- sock->have_event = true;
- weakup_enqueue(sock->stack->weakup_ring, sock);
- sock->stack->stats.weakup_events++;
- }
+ sock->have_event = true;
+ weakup_enqueue(sock->stack->weakup_ring, sock);
+ sock->stack->stats.weakup_events++;
}
static void raise_pending_events(struct lwip_sock *sock)
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
index 058a392..fcc1c0b 100644
--- a/src/lstack/core/lstack_cfg.c
+++ b/src/lstack/core/lstack_cfg.c
@@ -53,7 +53,6 @@ static int32_t parse_weakup_cpu_number(void);
static int32_t parse_mask_addr(void);
static int32_t parse_devices(void);
static int32_t parse_dpdk_args(void);
-static int32_t parse_numa_bind(void);
static int32_t parse_gateway_addr(void);
static int32_t parse_kni_switch(void);
@@ -71,7 +70,6 @@ static struct config_vector_t g_config_tbl[] = {
{ "dpdk_args", parse_dpdk_args },
{ "num_cpus", parse_stack_cpu_number },
{ "num_wakeup", parse_weakup_cpu_number },
- { "numa_bind", parse_numa_bind },
{ "low_power_mode", parse_low_power_mode },
{ "kni_switch", parse_kni_switch },
{ NULL, NULL }
@@ -714,23 +712,6 @@ static int32_t parse_weakup_cpu_number(void)
return 0;
}
-static int32_t parse_numa_bind(void)
-{
- const config_setting_t *numa_bind = NULL;
-
- numa_bind = config_lookup(&g_config, "numa_bind");
- if (numa_bind == NULL) {
- g_config_params.numa_bind = 1;
- return 0;
- }
- g_config_params.numa_bind = (uint8_t)config_setting_get_bool(numa_bind);
- if (g_config_params.numa_bind != 0 && g_config_params.numa_bind != 1) {
- return -EINVAL;
- }
-
- return 0;
-}
-
static int32_t parse_use_ltran(void)
{
const config_setting_t *arg = NULL;
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 1a9d9b9..b157517 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -485,7 +485,6 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags)
} else {
ret = rte_ring_sc_dequeue(sock->recv_ring, (void **)&pbuf);
if (ret != 0) {
- sock->stack->stats.recv_empty++;
break;
}
}
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index db8a20a..c88f902 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -46,10 +46,6 @@ int32_t bind_to_stack_numa(int32_t stack_id)
struct protocol_stack *stack = get_protocol_stack_group()->stacks[stack_id];
pthread_t tid = pthread_self();
- if (get_global_cfg_params()->numa_bind == 0) {
- return 0;
- }
-
if (last_stack_id == stack_id) {
return 0;
}
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index 8af1077..b3665a7 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -414,12 +414,9 @@ static void stack_send(struct rpc_msg *msg)
}
msg->result = write_lwip_data(sock, fd, flags);
- if (msg->result < 0 || rte_ring_count(sock->send_ring) == 0) {
- msg->self_release = 0;
- sock->have_rpc_send = false;
- }
+ sock->have_rpc_send = false;
- if (rte_ring_count(sock->send_ring)) {
+ if (msg->result >= 0 && rte_ring_count(sock->send_ring)) {
sock->have_rpc_send = true;
sock->stack->stats.send_self_rpc++;
msg->self_release = 1;
@@ -443,6 +440,7 @@ ssize_t rpc_call_send(int fd, const void *buf, size_t len, int flags)
msg->args[MSG_ARG_1].size = len;
msg->args[MSG_ARG_2].i = flags;
+ msg->self_release = 0;
rpc_call(&stack->rpc_queue, msg);
return 0;
diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h
index 9096797..1a59c6c 100644
--- a/src/lstack/include/lstack_cfg.h
+++ b/src/lstack/include/lstack_cfg.h
@@ -63,7 +63,6 @@ struct cfg_params {
ip4_addr_t netmask;
ip4_addr_t gateway_addr;
struct rte_ether_addr ethdev;
- uint8_t numa_bind;
uint16_t num_cpu;
uint16_t cpus[CFG_MAX_CPUS];
uint16_t num_wakeup;
diff --git a/src/lstack/lstack.conf b/src/lstack/lstack.conf
index eb996f1..fdca602 100644
--- a/src/lstack/lstack.conf
+++ b/src/lstack/lstack.conf
@@ -18,8 +18,6 @@ low_power_mode=0
num_cpus="2"
num_wakeup="3"
-numa_bind=1
-
host_addr="192.168.1.10"
mask_addr="255.255.255.0"
gateway_addr="192.168.1.1"
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index 5b3a95c..451f527 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -572,10 +572,9 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat)
printf("accept_events: %-14"PRIu64" \n", lstack_stat->data.pkts.accept_events);
printf("call_msg: %-19"PRIu64" ", lstack_stat->data.pkts.call_msg_cnt);
printf("read_null: %-18"PRIu64" ", lstack_stat->data.pkts.read_null);
- printf("recv_empty: %-17"PRIu64" \n", lstack_stat->data.pkts.recv_empty);
- printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail);
+ printf("call_alloc_fail: %-12"PRIu64" \n", lstack_stat->data.pkts.call_alloc_fail);
printf("remove_event: %-15"PRIu64" ", lstack_stat->data.pkts.remove_event);
- printf("send_self_rpc: %-14"PRIu64" \n", lstack_stat->data.pkts.send_self_rpc);
+ printf("send_self_rpc: %-14"PRIu64" ", lstack_stat->data.pkts.send_self_rpc);
printf("call_null: %-18"PRIu64" \n", lstack_stat->data.pkts.call_null);
}
--
1.8.3.1

View File

@ -1,806 +0,0 @@
From fadeb43a653ab5da503b7030b60b4e063f0b3aef Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Sun, 13 Mar 2022 22:57:44 +0800
Subject: [PATCH 24/34] refactor event
---
src/common/gazelle_dfx_msg.h | 10 +++-
src/lstack/api/lstack_epoll.c | 73 +++++++++++++++++---------
src/lstack/core/lstack_control_plane.c | 13 +++++
src/lstack/core/lstack_lwip.c | 76 ++++++++++++++++++++-------
src/lstack/core/lstack_protocol_stack.c | 36 ++++++++++---
src/lstack/core/lstack_stack_stat.c | 4 ++
src/lstack/core/lstack_thread_rpc.c | 42 +++++++++++++++
src/lstack/include/lstack_lwip.h | 3 ++
src/lstack/include/lstack_protocol_stack.h | 2 +
src/lstack/include/lstack_thread_rpc.h | 3 ++
src/lstack/include/lstack_weakup.h | 84 +++++++++++++++++++++---------
src/ltran/ltran_dfx.c | 36 ++++++++-----
12 files changed, 290 insertions(+), 92 deletions(-)
diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h
index cea4200..ae20436 100644
--- a/src/common/gazelle_dfx_msg.h
+++ b/src/common/gazelle_dfx_msg.h
@@ -64,10 +64,12 @@ struct gazelle_stat_pkts {
uint64_t rx_drop;
uint64_t rx_allocmbuf_fail;
uint64_t tx_allocmbuf_fail;
- uint16_t weakup_ring_cnt;
uint64_t call_msg_cnt;
+ uint16_t weakup_ring_cnt;
uint16_t conn_num;
uint16_t send_idle_ring_cnt;
+ uint64_t event_list;
+ uint64_t wakeup_list;
uint64_t read_lwip_drop;
uint64_t read_lwip_cnt;
uint64_t write_lwip_drop;
@@ -89,6 +91,10 @@ struct gazelle_stat_pkts {
uint64_t send_self_rpc;
uint64_t call_null;
uint64_t arp_copy_fail;
+ uint64_t epoll_pending;
+ uint64_t epoll_pending_call;
+ uint64_t epoll_self_call;
+ uint64_t epoll_self_event;
};
/* same as define in lwip/stats.h - struct stats_mib2 */
@@ -162,6 +168,8 @@ struct gazelle_stat_lstack_conn_info {
uint32_t send_ring_cnt;
uint32_t recv_ring_cnt;
uint32_t tcp_sub_state;
+ uint32_t event_ring_cnt;
+ uint32_t self_ring_cnt;
};
struct gazelle_stat_lstack_conn {
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index bcbb35e..a686ddb 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -87,19 +87,27 @@ void add_epoll_event(struct netconn *conn, uint32_t event)
return;
}
- sock->have_event = true;
- weakup_enqueue(sock->stack->weakup_ring, sock);
- sock->stack->stats.weakup_events++;
+ if (weakup_enqueue(sock->stack->weakup_ring, sock)) {
+ if (list_is_empty(&sock->event_list)) {
+ list_add_node(&sock->stack->event_list, &sock->event_list);
+ }
+ } else {
+ sock->have_event = true;
+ sock->stack->stats.weakup_events++;
+ }
}
static void raise_pending_events(struct lwip_sock *sock)
{
- if (!sock->conn) {
+ struct weakup_poll *wakeup = sock->weakup;
+ struct protocol_stack *stack = sock->stack;
+ struct netconn *conn = sock->conn;
+ if (wakeup == NULL || stack == NULL || conn == NULL) {
return;
}
struct lwip_sock *attach_sock = NULL;
- if (sock->attach_fd > 0 && sock->attach_fd != sock->conn->socket) {
+ if (sock->attach_fd > 0 && sock->attach_fd != conn->socket) {
attach_sock = get_socket_by_fd(sock->attach_fd);
if (attach_sock == NULL) {
return;
@@ -108,7 +116,10 @@ static void raise_pending_events(struct lwip_sock *sock)
attach_sock = sock;
}
- struct netconn *conn = attach_sock->conn;
+ conn = attach_sock->conn;
+ if (conn == NULL) {
+ return;
+ }
struct tcp_pcb *tcp = conn->pcb.tcp;
if ((tcp == NULL) || (tcp->state < ESTABLISHED)) {
return;
@@ -132,10 +143,17 @@ static void raise_pending_events(struct lwip_sock *sock)
event |= POLLERR | POLLIN;
}
- if (event != 0) {
- sock->events |= event;
- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
- sem_post(&sock->weakup->event_sem);
+ if (event == 0) {
+ return;
+ }
+ sock->events |= event;
+ if (rte_ring_mp_enqueue(wakeup->event_ring, (void *)sock) == 0 ||
+ rte_ring_mp_enqueue(wakeup->self_ring, (void *)sock) == 0) {
+ sem_post(&wakeup->event_sem);
+ stack->stats.epoll_pending++;
+ } else {
+ rpc_call_addevent(stack, sock);
+ stack->stats.epoll_pending_call++;
}
}
@@ -168,6 +186,12 @@ int32_t lstack_epoll_create(int32_t size)
GAZELLE_RETURN(ENOMEM);
}
+ weakup->self_ring = create_ring("SELF_EVENT", VDEV_EVENT_QUEUE_SZ, RING_F_SC_DEQ, fd);
+ if (weakup->self_ring == NULL) {
+ posix_api->close_fn(fd);
+ GAZELLE_RETURN(ENOMEM);
+ }
+
sock->weakup = weakup;
return fd;
@@ -247,11 +271,6 @@ static inline int32_t save_poll_event(struct pollfd *fds, uint32_t maxevents, st
static bool remove_event(enum POLL_TYPE etype, struct lwip_sock **sock_list, int32_t event_num, struct lwip_sock *sock)
{
- /* close sock */
- if (sock->stack == NULL) {
- return true;
- }
-
/* remove duplicate event */
for (uint32_t i = 0; i < event_num && etype == TYPE_EPOLL; i++) {
if (sock_list[i] == sock) {
@@ -267,29 +286,26 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m
struct epoll_event *events = (struct epoll_event *)out;
struct pollfd *fds = (struct pollfd *)out;
- uint32_t events_cnt = rte_ring_count(weakup->event_ring);
- if (events_cnt == 0) {
- return 0;
- }
if (etype == TYPE_EPOLL) {
maxevents = LWIP_MIN(EPOLL_MAX_EVENTS, maxevents);
}
- events_cnt = LWIP_MIN(events_cnt, maxevents);
int32_t event_num = 0;
struct lwip_sock *sock = NULL;
- while (event_num < events_cnt) {
- int32_t ret = rte_ring_sc_dequeue(weakup->event_ring, (void **)&sock);
- if (ret != 0) {
+ while (event_num < maxevents) {
+ if (rte_ring_sc_dequeue(weakup->self_ring, (void **)&sock) &&
+ rte_ring_sc_dequeue(weakup->event_ring, (void **)&sock)) {
break;
}
+ /* close sock */
+ if (sock->stack == NULL) {
+ return true;
+ }
sock->have_event = false;
if (remove_event(etype, weakup->sock_list, event_num, sock)) {
- if (sock->stack) {
- sock->stack->stats.remove_event++;
- }
+ sock->stack->stats.remove_event++;
continue;
}
@@ -390,6 +406,11 @@ static int32_t poll_init(struct pollfd *fds, nfds_t nfds, struct weakup_poll *we
if (weakup->event_ring == NULL) {
GAZELLE_RETURN(ENOMEM);
}
+
+ weakup->self_ring = create_ring("SELF_EVENT", VDEV_EVENT_QUEUE_SZ, RING_F_SC_DEQ, rte_gettid());
+ if (weakup->self_ring == NULL) {
+ GAZELLE_RETURN(ENOMEM);
+ }
}
for (uint32_t i = 0; i < nfds; i++) {
diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c
index a7e084d..c782d51 100644
--- a/src/lstack/core/lstack_control_plane.c
+++ b/src/lstack/core/lstack_control_plane.c
@@ -38,6 +38,7 @@
#define RECONNECT_TO_LTRAN_DELAY (1)
#define GAZELLE_BADFD (-1)
#define GAZELLE_LISTEN_BACKLOG 5
+#define GAZELLE_10MS (10000)
static int32_t g_data_fd = -1;
static volatile bool g_register_state = true;
@@ -701,6 +702,12 @@ void control_server_thread(void *arg)
int32_t num, connfd;
struct epoll_event evt_array;
while (1) {
+ /* wait init finish */
+ if (posix_api->is_chld) {
+ usleep(GAZELLE_10MS);
+ continue;
+ }
+
num = posix_api->epoll_wait_fn(epfd, &evt_array, 1, -1);
if (num <= 0) {
continue;
@@ -741,6 +748,12 @@ void control_client_thread(void *arg)
}
while (1) {
+ /* wait init finish */
+ if (posix_api->is_chld) {
+ usleep(GAZELLE_10MS);
+ continue;
+ }
+
if (sockfd < 0) {
set_register_state(false);
sockfd = client_reg_proc_reconnect(epfd);
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index b157517..d55f1e6 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -110,6 +110,8 @@ void gazelle_init_sock(int32_t fd)
init_list_node(&sock->recv_list);
init_list_node(&sock->attach_list);
init_list_node(&sock->listen_list);
+ init_list_node(&sock->event_list);
+ init_list_node(&sock->wakeup_list);
}
void gazelle_clean_sock(int32_t fd)
@@ -126,6 +128,8 @@ void gazelle_clean_sock(int32_t fd)
list_del_node_init(&sock->recv_list);
list_del_node_init(&sock->attach_list);
list_del_node_init(&sock->listen_list);
+ list_del_node_init(&sock->event_list);
+ list_del_node_init(&sock->wakeup_list);
}
void gazelle_free_pbuf(struct pbuf *pbuf)
@@ -266,6 +270,30 @@ ssize_t write_lwip_data(struct lwip_sock *sock, int32_t fd, int32_t flags)
return (send_ret < 0) ? send_ret : send_len;
}
+void add_self_event(struct lwip_sock *sock, uint32_t events)
+{
+ struct weakup_poll *wakeup = sock->weakup;
+ struct protocol_stack *stack = sock->stack;
+ if (wakeup == NULL || stack == NULL) {
+ return;
+ }
+
+ sock->events |= events;
+
+ if (sock->have_event) {
+ return;
+ }
+
+ if (rte_ring_mp_enqueue(wakeup->self_ring, (void *)sock) == 0) {
+ sock->have_event = true;
+ sem_post(&sock->weakup->event_sem);
+ stack->stats.epoll_self_event++;
+ } else {
+ rpc_call_addevent(stack, sock);
+ stack->stats.epoll_self_call++;
+ }
+}
+
ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len)
{
uint32_t free_count = rte_ring_free_count(sock->send_ring);
@@ -303,14 +331,10 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len)
send_pkt++;
}
- if (!sock->have_event && (sock->epoll_events & EPOLLOUT) && NETCONN_IS_DATAOUT(sock)) {
- sock->have_event = true;
- sock->events |= EPOLLOUT;
- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
- sem_post(&sock->weakup->event_sem);
+ if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_DATAOUT(sock)) {
+ add_self_event(sock, EPOLLOUT);
sock->stack->stats.write_events++;
- }
- if (!NETCONN_IS_DATAOUT(sock)) {
+ } else {
sock->events &= ~EPOLLOUT;
}
@@ -507,14 +531,10 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags)
}
}
- if (!sock->have_event && (sock->epoll_events & EPOLLIN) && NETCONN_IS_DATAIN(sock)) {
- sock->have_event = true;
- sock->events |= EPOLLIN;
- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
- sem_post(&sock->weakup->event_sem);
+ if ((sock->epoll_events & EPOLLIN) && NETCONN_IS_DATAIN(sock)) {
+ add_self_event(sock, EPOLLIN);
sock->stack->stats.read_events++;
- }
- if (!NETCONN_IS_DATAIN(sock)) {
+ } else {
sock->events &= ~EPOLLIN;
}
@@ -577,9 +597,14 @@ static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const s
conn->recv_cnt = rte_ring_count(netconn->recvmbox->ring);
struct lwip_sock *sock = get_socket(netconn->socket);
- if (sock != NULL && sock->recv_ring != NULL && sock->send_ring != NULL) {
+ if (netconn->socket > 0 && sock != NULL && sock->recv_ring != NULL && sock->send_ring != NULL) {
conn->recv_ring_cnt = rte_ring_count(sock->recv_ring);
conn->send_ring_cnt = rte_ring_count(sock->send_ring);
+ struct weakup_poll *weakup = sock->weakup;
+ if (weakup) {
+ conn->event_ring_cnt = rte_ring_count(weakup->event_ring);
+ conn->self_ring_cnt = rte_ring_count(weakup->self_ring);
+ }
}
}
}
@@ -696,10 +721,8 @@ void get_lwip_connnum(struct rpc_msg *msg)
msg->result = conn_num;
}
-void stack_recvlist_count(struct rpc_msg *msg)
+static uint32_t get_list_count(struct list_node *list)
{
- struct protocol_stack *stack = get_protocol_stack();
- struct list_node *list = &(stack->recv_list);
struct list_node *node, *temp;
uint32_t count = 0;
@@ -707,5 +730,20 @@ void stack_recvlist_count(struct rpc_msg *msg)
count++;
}
- msg->result = count;
+ return count;
+}
+
+void stack_wakeuplist_count(struct rpc_msg *msg)
+{
+ msg->result = get_list_count(get_protocol_stack()->wakeup_list);
+}
+
+void stack_eventlist_count(struct rpc_msg *msg)
+{
+ msg->result = get_list_count(&get_protocol_stack()->event_list);
+}
+
+void stack_recvlist_count(struct rpc_msg *msg)
+{
+ msg->result = get_list_count(&get_protocol_stack()->recv_list);
}
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index c88f902..45649fe 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -193,6 +193,7 @@ int32_t init_protocol_stack(void)
init_list_node(&stack->recv_list);
init_list_node(&stack->listen_list);
+ init_list_node(&stack->event_list);
stack_group->stacks[i] = stack;
}
@@ -261,8 +262,14 @@ static void* gazelle_weakup_thread(void *arg)
thread_affinity_init(lcore_id);
LSTACK_LOG(INFO, LSTACK, "weakup_%02d start\n", stack->queue_id);
+ struct list_node wakeup_list;
+ init_list_node(&wakeup_list);
+ stack->wakeup_list = &wakeup_list;
+
for (;;) {
- weakup_thread(stack->weakup_ring);
+ wakeup_list_sock(&wakeup_list);
+
+ weakup_thread(stack->weakup_ring, &wakeup_list);
}
return NULL;
@@ -307,6 +314,24 @@ static void stack_thread_init(struct protocol_stack *stack)
LSTACK_LOG(INFO, LSTACK, "stack_%02d init success\n", queue_id);
}
+static void report_stack_event(struct protocol_stack *stack)
+{
+ struct list_node *list = &(stack->event_list);
+ struct list_node *node, *temp;
+ struct lwip_sock *sock;
+
+ list_for_each_safe(node, temp, list) {
+ sock = container_of(node, struct lwip_sock, event_list);
+
+ if (weakup_enqueue(stack->weakup_ring, sock) == 0) {
+ list_del_node_init(&sock->event_list);
+ stack->stats.weakup_events++;
+ } else {
+ break;
+ }
+ }
+}
+
static void* gazelle_stack_thread(void *arg)
{
struct protocol_stack *stack = (struct protocol_stack *)arg;
@@ -321,6 +346,8 @@ static void* gazelle_stack_thread(void *arg)
read_recv_list();
sys_timer_run();
+
+ report_stack_event(stack);
}
return NULL;
@@ -737,11 +764,8 @@ int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *add
}
struct lwip_sock *sock = get_socket(head_fd);
- if (!sock->have_event && have_accept_event(head_fd)) {
- sock->have_event = true;
- sock->events |= EPOLLIN;
- rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
- sem_post(&sock->weakup->event_sem);
+ if (have_accept_event(head_fd)) {
+ add_self_event(sock, EPOLLIN);
sock->stack->stats.accept_events++;
}
diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c
index 41fe9bf..b7b94e2 100644
--- a/src/lstack/core/lstack_stack_stat.c
+++ b/src/lstack/core/lstack_stack_stat.c
@@ -109,6 +109,10 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_
dfx->data.pkts.send_idle_ring_cnt = rte_ring_count(stack->send_idle_ring);
dfx->data.pkts.call_msg_cnt = rpc_call_msgcnt(stack);
dfx->data.pkts.recv_list = rpc_call_recvlistcnt(stack);
+ dfx->data.pkts.event_list = rpc_call_eventlistcnt(stack);
+ if (stack->wakeup_list) {
+ dfx->data.pkts.wakeup_list = rpc_call_eventlistcnt(stack);
+ }
dfx->data.pkts.conn_num = stack->conn_num;
}
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index b3665a7..2fb24b4 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -177,6 +177,26 @@ int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn)
return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg);
}
+int32_t rpc_call_wakeuplistcnt(struct protocol_stack *stack)
+{
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_wakeuplist_count);
+ if (msg == NULL) {
+ return -1;
+ }
+
+ return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg);
+}
+
+int32_t rpc_call_eventlistcnt(struct protocol_stack *stack)
+{
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_eventlist_count);
+ if (msg == NULL) {
+ return -1;
+ }
+
+ return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg);
+}
+
int32_t rpc_call_recvlistcnt(struct protocol_stack *stack)
{
struct rpc_msg *msg = rpc_msg_alloc(stack, stack_recvlist_count);
@@ -187,6 +207,28 @@ int32_t rpc_call_recvlistcnt(struct protocol_stack *stack)
return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg);
}
+void add_epoll_event(struct netconn *conn, uint32_t event);
+static void rpc_add_event(struct rpc_msg *msg)
+{
+ struct lwip_sock *sock = (struct lwip_sock *)msg->args[MSG_ARG_0].p;
+ if (sock->conn) {
+ add_epoll_event(sock->conn, sock->events);
+ }
+}
+
+void rpc_call_addevent(struct protocol_stack *stack, void *sock)
+{
+ struct rpc_msg *msg = rpc_msg_alloc(stack, rpc_add_event);
+ if (msg == NULL) {
+ return;
+ }
+
+ msg->args[MSG_ARG_0].p = sock;
+
+ msg->self_release = 0;
+ rpc_call(&stack->rpc_queue, msg);
+}
+
static void rpc_replenish_idlembuf(struct rpc_msg *msg)
{
struct protocol_stack *stack = get_protocol_stack();
diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h
index 581b9fe..87442cd 100644
--- a/src/lstack/include/lstack_lwip.h
+++ b/src/lstack/include/lstack_lwip.h
@@ -33,6 +33,8 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags);
ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags);
void read_recv_list(void);
void add_recv_list(int32_t fd);
+void stack_eventlist_count(struct rpc_msg *msg);
+void stack_wakeuplist_count(struct rpc_msg *msg);
void get_lwip_conntable(struct rpc_msg *msg);
void get_lwip_connnum(struct rpc_msg *msg);
void stack_recvlist_count(struct rpc_msg *msg);
@@ -42,5 +44,6 @@ void gazelle_free_pbuf(struct pbuf *pbuf);
ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags);
ssize_t recvmsg_from_stack(int32_t s, struct msghdr *message, int32_t flags);
ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags);
+void add_self_event(struct lwip_sock *sock, uint32_t events);
#endif
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index f289465..dd7633b 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -51,6 +51,8 @@ struct protocol_stack {
struct list_node recv_list;
struct list_node listen_list;
+ struct list_node event_list;
+ struct list_node *wakeup_list;
struct gazelle_stat_pkts stats;
struct gazelle_stack_latency latency;
diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h
index 1365234..cffb273 100644
--- a/src/lstack/include/lstack_thread_rpc.h
+++ b/src/lstack/include/lstack_thread_rpc.h
@@ -50,9 +50,12 @@ struct rpc_msg {
struct protocol_stack;
void poll_rpc_msg(struct protocol_stack *stack);
void rpc_call_replenish_idlembuf(struct protocol_stack *stack);
+void rpc_call_addevent(struct protocol_stack *stack, void *sock);
int32_t rpc_call_msgcnt(struct protocol_stack *stack);
int32_t rpc_call_shadow_fd(struct protocol_stack *stack, int32_t fd, const struct sockaddr *addr, socklen_t addrlen);
int32_t rpc_call_recvlistcnt(struct protocol_stack *stack);
+int32_t rpc_call_eventlistcnt(struct protocol_stack *stack);
+int32_t rpc_call_wakeuplistcnt(struct protocol_stack *stack);
int32_t rpc_call_thread_regphase1(struct protocol_stack *stack, void *conn);
int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn);
int32_t rpc_call_conntable(struct protocol_stack *stack, void *conn_table, uint32_t max_conn);
diff --git a/src/lstack/include/lstack_weakup.h b/src/lstack/include/lstack_weakup.h
index f334a0f..8f7fca2 100644
--- a/src/lstack/include/lstack_weakup.h
+++ b/src/lstack/include/lstack_weakup.h
@@ -22,55 +22,93 @@ struct weakup_poll {
sem_t event_sem;
struct lwip_sock *sock_list[EPOLL_MAX_EVENTS];
struct rte_ring *event_ring;
+ struct rte_ring *self_ring;
};
#define WEAKUP_MAX (32)
-static inline __attribute__((always_inline)) void weakup_attach_sock(struct lwip_sock *sock)
+static inline void wakeup_list_sock(struct list_node *wakeup_list)
{
- struct list_node *list = &(sock->attach_list);
struct list_node *node, *temp;
- struct lwip_sock *attach_sock;
- int32_t ret;
- list_for_each_safe(node, temp, list) {
- attach_sock = container_of(node, struct lwip_sock, attach_list);
- if (attach_sock->weakup == NULL) {
+ list_for_each_safe(node, temp, wakeup_list) {
+ struct lwip_sock *sock = container_of(node, struct lwip_sock, wakeup_list);
+
+ struct weakup_poll *weakup = sock->weakup;
+ struct protocol_stack *stack = sock->stack;
+ if (weakup == NULL || stack == NULL) {
continue;
}
- ret = rte_ring_mp_enqueue(attach_sock->weakup->event_ring, (void *)attach_sock);
+ int32_t ret = rte_ring_mp_enqueue(weakup->event_ring, (void *)sock);
if (ret == 0) {
- sem_post(&attach_sock->weakup->event_sem);
- attach_sock->stack->stats.lwip_events++;
+ list_del_node_init(&sock->event_list);
+ sem_post(&weakup->event_sem);
+ stack->stats.lwip_events++;
+ } else {
+ break;
}
}
}
-static inline __attribute__((always_inline)) void weakup_thread(struct rte_ring *weakup_ring)
+static inline int32_t weakup_attach_sock(struct list_node *attach_list)
+{
+ struct list_node *node, *temp;
+ int32_t wakeuped = -1;
+
+ list_for_each_safe(node, temp, attach_list) {
+ struct lwip_sock *sock = container_of(node, struct lwip_sock, attach_list);
+
+ struct weakup_poll *weakup = sock->weakup;
+ struct protocol_stack *stack = sock->stack;
+ if (weakup == NULL || stack == NULL) {
+ continue;
+ }
+
+ int32_t ret = rte_ring_mp_enqueue(weakup->event_ring, (void *)sock);
+ if (ret == 0) {
+ sem_post(&weakup->event_sem);
+ stack->stats.lwip_events++;
+ wakeuped = 0;
+ }
+ }
+
+ return wakeuped;
+}
+
+static inline void weakup_thread(struct rte_ring *weakup_ring, struct list_node *wakeup_list)
{
struct lwip_sock *sock;
- int32_t ret;
for (uint32_t i = 0; i < WEAKUP_MAX; ++i) {
- ret = rte_ring_sc_dequeue(weakup_ring, (void **)&sock);
+ int32_t ret = rte_ring_sc_dequeue(weakup_ring, (void **)&sock);
if (ret != 0) {
break;
}
- ret = rte_ring_mp_enqueue(sock->weakup->event_ring, (void *)sock);
+ struct weakup_poll *weakup = sock->weakup;
+ struct protocol_stack *stack = sock->stack;
+ if (weakup == NULL || stack == NULL) {
+ continue;
+ }
+
+ ret = rte_ring_mp_enqueue(weakup->event_ring, (void *)sock);
if (ret == 0) {
- sem_post(&sock->weakup->event_sem);
- sock->stack->stats.lwip_events++;
+ sem_post(&weakup->event_sem);
+ stack->stats.lwip_events++;
}
/* listen notice attach sock */
+ int32_t wakeuped = -1;
if (!list_is_empty(&sock->attach_list)) {
- weakup_attach_sock(sock);
+ wakeuped = weakup_attach_sock(&sock->attach_list);
}
- /* event_ring of attach sock may have idle elem */
- if (ret != 0) {
+ /* notice any epoll enough */
+ if (ret != 0 && wakeuped != 0) {
+ if (list_is_empty(&sock->wakeup_list)) {
+ list_add_node(wakeup_list, &sock->wakeup_list);
+ }
break;
}
}
@@ -79,13 +117,7 @@ static inline __attribute__((always_inline)) void weakup_thread(struct rte_ring
static inline __attribute__((always_inline))
int weakup_enqueue(struct rte_ring *weakup_ring, struct lwip_sock *sock)
{
- int ret = rte_ring_sp_enqueue(weakup_ring, (void *)sock);
- if (ret < 0) {
- LSTACK_LOG(ERR, LSTACK, "tid %d, failed\n", gettid());
- return -1;
- }
-
- return 0;
+ return rte_ring_sp_enqueue(weakup_ring, (void *)sock);
}
#endif
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index 451f527..66d6053 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -567,14 +567,20 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat)
printf("weakup_events: %-14"PRIu64" ", lstack_stat->data.pkts.weakup_events);
printf("lwip_events: %-16"PRIu64" ", lstack_stat->data.pkts.lwip_events);
printf("app_events: %-17"PRIu64"\n", lstack_stat->data.pkts.app_events);
+ printf("epoll_pending: %-14"PRIu64" ", lstack_stat->data.pkts.epoll_pending);
+ printf("epoll_self_event: %-11"PRIu64" ", lstack_stat->data.pkts.epoll_self_event);
+ printf("remove_event: %-15"PRIu64" \n", lstack_stat->data.pkts.remove_event);
printf("read_events: %-16"PRIu64" ", lstack_stat->data.pkts.read_events);
printf("write_events: %-15"PRIu64" ", lstack_stat->data.pkts.write_events);
printf("accept_events: %-14"PRIu64" \n", lstack_stat->data.pkts.accept_events);
- printf("call_msg: %-19"PRIu64" ", lstack_stat->data.pkts.call_msg_cnt);
printf("read_null: %-18"PRIu64" ", lstack_stat->data.pkts.read_null);
- printf("call_alloc_fail: %-12"PRIu64" \n", lstack_stat->data.pkts.call_alloc_fail);
- printf("remove_event: %-15"PRIu64" ", lstack_stat->data.pkts.remove_event);
+ printf("wakeup_list: %-16"PRIu64" ", lstack_stat->data.pkts.wakeup_list);
+ printf("event_list: %-17"PRIu64" \n", lstack_stat->data.pkts.event_list);
printf("send_self_rpc: %-14"PRIu64" ", lstack_stat->data.pkts.send_self_rpc);
+ printf("epoll_pending_call: %-9"PRIu64" ", lstack_stat->data.pkts.epoll_pending_call);
+ printf("epoll_self_call: %-12"PRIu64" \n", lstack_stat->data.pkts.epoll_self_call);
+ printf("call_msg: %-19"PRIu64" ", lstack_stat->data.pkts.call_msg_cnt);
+ printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail);
printf("call_null: %-18"PRIu64" \n", lstack_stat->data.pkts.call_null);
}
@@ -866,8 +872,7 @@ static void gazelle_print_lstack_stat_snmp(void *buf, const struct gazelle_stat_
static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_msg_request *req_msg)
{
- int32_t ret;
- uint32_t i, unread_pkts;
+ uint32_t i;
struct in_addr rip;
struct in_addr lip;
char str_ip[GAZELLE_SUBNET_LENGTH_MAX] = {0};
@@ -878,30 +883,33 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_
printf("Active Internet connections (servers and established)\n");
do {
printf("\n------ stack tid: %6u ------\n", stat->tid);
- printf("No. Proto recv_cnt recv_ring in_send send_ring Local Address"
+ printf("No. Proto recv_cnt recv_ring in_send send_ring event self_event Local Address"
" Foreign Address State\n");
- unread_pkts = 0;
+ uint32_t unread_pkts = 0;
+ uint32_t unsend_pkts = 0;
for (i = 0; i < conn->conn_num && i < GAZELLE_LSTACK_MAX_CONN; i++) {
struct gazelle_stat_lstack_conn_info *conn_info = &conn->conn_list[i];
rip.s_addr = conn_info->rip;
lip.s_addr = conn_info->lip;
if ((conn_info->state == GAZELLE_ACTIVE_LIST) || (conn_info->state == GAZELLE_TIME_WAIT_LIST)) {
- printf("%-6utcp %-10u%-11u%-9u%-11u%s:%hu\t%s:%hu\t%s\n", i, conn_info->recv_cnt,
- conn_info->recv_ring_cnt, conn_info->in_send, conn_info->send_ring_cnt,
- inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, inet_ntop(AF_INET, &rip,
- str_rip, sizeof(str_rip)), conn_info->r_port, tcp_state_to_str(conn_info->tcp_sub_state));
+ printf("%-6utcp %-10u%-11u%-9u%-11u%-7u%-12u%s:%hu\t%s:%hu\t%s\n", i, conn_info->recv_cnt,
+ conn_info->recv_ring_cnt, conn_info->in_send, conn_info->send_ring_cnt, conn_info->event_ring_cnt,
+ conn_info->self_ring_cnt, inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port,
+ inet_ntop(AF_INET, &rip, str_rip, sizeof(str_rip)), conn_info->r_port,
+ tcp_state_to_str(conn_info->tcp_sub_state));
} else if (conn_info->state == GAZELLE_LISTEN_LIST) {
- printf("%-6utcp %-41u%s:%hu\t0.0.0.0:*\t\tLISTEN\n", i, conn_info->recv_cnt,
+ printf("%-6utcp %-60u%s:%hu\t0.0.0.0:*\t\tLISTEN\n", i, conn_info->recv_cnt,
inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port);
} else {
printf("Got unknow tcp conn::%s:%5hu, state:%u\n",
inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port, conn_info->state);
}
unread_pkts += conn_info->recv_ring_cnt;
+ unsend_pkts += conn_info->send_ring_cnt;
}
if (conn->conn_num > 0) {
- printf("Total unread pkts: %u \n", unread_pkts);
+ printf("Total unread pkts:%u unsend pkts:%u\n", unread_pkts, unsend_pkts);
}
if (i < conn->total_conn_num) {
@@ -912,7 +920,7 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_
if (stat->eof != 0) {
break;
}
- ret = dfx_stat_read_from_ltran(buf, sizeof(struct gazelle_stack_dfx_data), req_msg->stat_mode);
+ int32_t ret = dfx_stat_read_from_ltran(buf, sizeof(struct gazelle_stack_dfx_data), req_msg->stat_mode);
if (ret != GAZELLE_OK) {
return;
}
--
1.8.3.1

View File

@ -1,420 +0,0 @@
From aa422a75961523de411ec849fd1f4e45da4477ac Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Mon, 14 Mar 2022 20:32:39 +0800
Subject: [PATCH 25/34] fix event miss
---
src/common/gazelle_dfx_msg.h | 1 +
src/lstack/api/lstack_epoll.c | 6 ++--
src/lstack/core/lstack_lwip.c | 54 ++++++++++++++++++++++++++----
src/lstack/core/lstack_protocol_stack.c | 31 +++++++++++++++++
src/lstack/core/lstack_stack_stat.c | 27 +++++++++++----
src/lstack/core/lstack_thread_rpc.c | 38 ++++++---------------
src/lstack/include/lstack_lwip.h | 2 ++
src/lstack/include/lstack_protocol_stack.h | 1 +
src/lstack/include/lstack_thread_rpc.h | 1 +
src/lstack/include/lstack_weakup.h | 2 +-
src/ltran/ltran_dfx.c | 3 +-
11 files changed, 120 insertions(+), 46 deletions(-)
diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h
index ae20436..de669f5 100644
--- a/src/common/gazelle_dfx_msg.h
+++ b/src/common/gazelle_dfx_msg.h
@@ -95,6 +95,7 @@ struct gazelle_stat_pkts {
uint64_t epoll_pending_call;
uint64_t epoll_self_call;
uint64_t epoll_self_event;
+ uint64_t send_list;
};
/* same as define in lwip/stats.h - struct stats_mib2 */
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index a686ddb..cf072b0 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -61,7 +61,7 @@ static inline bool report_events(struct lwip_sock *sock, uint32_t event)
return true;
}
- if (sock->have_event) {
+ if (__atomic_load_n(&sock->have_event, __ATOMIC_ACQUIRE)) {
return false;
}
@@ -92,7 +92,7 @@ void add_epoll_event(struct netconn *conn, uint32_t event)
list_add_node(&sock->stack->event_list, &sock->event_list);
}
} else {
- sock->have_event = true;
+ __atomic_store_n(&sock->have_event, true, __ATOMIC_RELEASE);
sock->stack->stats.weakup_events++;
}
}
@@ -302,7 +302,7 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m
if (sock->stack == NULL) {
return true;
}
- sock->have_event = false;
+ __atomic_store_n(&sock->have_event, false, __ATOMIC_RELEASE);
if (remove_event(etype, weakup->sock_list, event_num, sock)) {
sock->stack->stats.remove_event++;
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index d55f1e6..d35a217 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -112,6 +112,7 @@ void gazelle_init_sock(int32_t fd)
init_list_node(&sock->listen_list);
init_list_node(&sock->event_list);
init_list_node(&sock->wakeup_list);
+ init_list_node(&sock->send_list);
}
void gazelle_clean_sock(int32_t fd)
@@ -130,6 +131,7 @@ void gazelle_clean_sock(int32_t fd)
list_del_node_init(&sock->listen_list);
list_del_node_init(&sock->event_list);
list_del_node_init(&sock->wakeup_list);
+ list_del_node_init(&sock->send_list);
}
void gazelle_free_pbuf(struct pbuf *pbuf)
@@ -280,12 +282,12 @@ void add_self_event(struct lwip_sock *sock, uint32_t events)
sock->events |= events;
- if (sock->have_event) {
+ if (__atomic_load_n(&sock->have_event, __ATOMIC_ACQUIRE)) {
return;
}
if (rte_ring_mp_enqueue(wakeup->self_ring, (void *)sock) == 0) {
- sock->have_event = true;
+ __atomic_store_n(&sock->have_event, true, __ATOMIC_RELEASE);
sem_post(&sock->weakup->event_sem);
stack->stats.epoll_self_event++;
} else {
@@ -346,6 +348,34 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len)
return send_len;
}
+void stack_send(struct rpc_msg *msg)
+{
+ int32_t fd = msg->args[MSG_ARG_0].i;
+ int32_t flags = msg->args[MSG_ARG_2].i;
+
+ struct protocol_stack *stack = get_protocol_stack();
+ struct lwip_sock *sock = get_socket(fd);
+ if (sock == NULL) {
+ msg->result = -1;
+ return;
+ }
+
+ msg->result = write_lwip_data(sock, fd, flags);
+ __atomic_store_n(&sock->have_rpc_send, false, __ATOMIC_RELEASE);
+
+ if (msg->result >= 0 && rte_ring_count(sock->send_ring)) {
+ if (list_is_empty(&sock->send_list)) {
+ __atomic_store_n(&sock->have_rpc_send, true, __ATOMIC_RELEASE);
+ list_add_node(&stack->send_list, &sock->send_list);
+ sock->stack->stats.send_self_rpc++;
+ }
+ }
+
+ if (rte_ring_free_count(sock->send_ring)) {
+ add_epoll_event(sock->conn, EPOLLOUT);
+ }
+}
+
ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags)
{
if (sock->conn->recvmbox == NULL) {
@@ -448,14 +478,19 @@ ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags)
GAZELLE_RETURN(EINVAL);
}
+ sock->send_flags = flags;
ssize_t send = write_stack_data(sock, buf, len);
- if (send < 0 || sock->have_rpc_send) {
- return send;
+
+ ssize_t ret = 0;
+ if (!__atomic_load_n(&sock->have_rpc_send, __ATOMIC_ACQUIRE)) {
+ __atomic_store_n(&sock->have_rpc_send, true, __ATOMIC_RELEASE);
+ ret = rpc_call_send(fd, buf, len, flags);
}
- sock->have_rpc_send = true;
- ssize_t ret = rpc_call_send(fd, buf, len, flags);
- return (ret < 0) ? ret : send;
+ if (send <= 0 || ret < 0) {
+ GAZELLE_RETURN(EAGAIN);
+ }
+ return send;
}
ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags)
@@ -743,6 +778,11 @@ void stack_eventlist_count(struct rpc_msg *msg)
msg->result = get_list_count(&get_protocol_stack()->event_list);
}
+void stack_sendlist_count(struct rpc_msg *msg)
+{
+ msg->result = get_list_count(&get_protocol_stack()->send_list);
+}
+
void stack_recvlist_count(struct rpc_msg *msg)
{
msg->result = get_list_count(&get_protocol_stack()->recv_list);
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 45649fe..4ba851a 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -194,6 +194,7 @@ int32_t init_protocol_stack(void)
init_list_node(&stack->recv_list);
init_list_node(&stack->listen_list);
init_list_node(&stack->event_list);
+ init_list_node(&stack->send_list);
stack_group->stacks[i] = stack;
}
@@ -324,6 +325,7 @@ static void report_stack_event(struct protocol_stack *stack)
sock = container_of(node, struct lwip_sock, event_list);
if (weakup_enqueue(stack->weakup_ring, sock) == 0) {
+ __atomic_store_n(&sock->have_event, true, __ATOMIC_RELEASE);
list_del_node_init(&sock->event_list);
stack->stats.weakup_events++;
} else {
@@ -332,6 +334,33 @@ static void report_stack_event(struct protocol_stack *stack)
}
}
+static void send_stack_list(struct protocol_stack *stack)
+{
+ struct list_node *list = &(stack->send_list);
+ struct list_node *node, *temp;
+ struct lwip_sock *sock;
+
+ list_for_each_safe(node, temp, list) {
+ sock = container_of(node, struct lwip_sock, send_list);
+
+ if (sock->conn == NULL) {
+ continue;
+ }
+
+ ssize_t ret = write_lwip_data(sock, sock->conn->socket, sock->send_flags);
+ __atomic_store_n(&sock->have_rpc_send, false, __ATOMIC_RELEASE);
+ if (ret >= 0 && rte_ring_count(sock->send_ring)) {
+ __atomic_store_n(&sock->have_rpc_send, true, __ATOMIC_RELEASE);
+ } else {
+ list_del_node_init(&sock->send_list);
+ }
+
+ if (rte_ring_free_count(sock->send_ring)) {
+ add_epoll_event(sock->conn, EPOLLOUT);
+ }
+ }
+}
+
static void* gazelle_stack_thread(void *arg)
{
struct protocol_stack *stack = (struct protocol_stack *)arg;
@@ -348,6 +377,8 @@ static void* gazelle_stack_thread(void *arg)
sys_timer_run();
report_stack_event(stack);
+
+ send_stack_list(stack);
}
return NULL;
diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c
index b7b94e2..9a8fd08 100644
--- a/src/lstack/core/lstack_stack_stat.c
+++ b/src/lstack/core/lstack_stack_stat.c
@@ -107,11 +107,22 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_
dfx->data.pkts.call_alloc_fail = stack_group->call_alloc_fail;
dfx->data.pkts.weakup_ring_cnt = rte_ring_count(stack->weakup_ring);
dfx->data.pkts.send_idle_ring_cnt = rte_ring_count(stack->send_idle_ring);
- dfx->data.pkts.call_msg_cnt = rpc_call_msgcnt(stack);
- dfx->data.pkts.recv_list = rpc_call_recvlistcnt(stack);
- dfx->data.pkts.event_list = rpc_call_eventlistcnt(stack);
+
+ int32_t rpc_call_result = rpc_call_msgcnt(stack);
+ dfx->data.pkts.call_msg_cnt = (rpc_call_result < 0) ? 0 : rpc_call_result;
+
+ rpc_call_result = rpc_call_recvlistcnt(stack);
+ dfx->data.pkts.recv_list = (rpc_call_result < 0) ? 0 : rpc_call_result;
+
+ rpc_call_result = rpc_call_eventlistcnt(stack);
+ dfx->data.pkts.event_list = (rpc_call_result < 0) ? 0 : rpc_call_result;
+
+ rpc_call_result = rpc_call_sendlistcnt(stack);
+ dfx->data.pkts.send_list = (rpc_call_result < 0) ? 0 : rpc_call_result;
+
if (stack->wakeup_list) {
- dfx->data.pkts.wakeup_list = rpc_call_eventlistcnt(stack);
+ rpc_call_result = rpc_call_eventlistcnt(stack);
+ dfx->data.pkts.wakeup_list = (rpc_call_result < 0) ? 0 : rpc_call_result;
}
dfx->data.pkts.conn_num = stack->conn_num;
}
@@ -119,6 +130,8 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_
static void get_stack_dfx_data(struct gazelle_stack_dfx_data *dfx, struct protocol_stack *stack,
enum GAZELLE_STAT_MODE stat_mode)
{
+ int32_t rpc_call_result;
+
switch (stat_mode) {
case GAZELLE_STAT_LSTACK_SHOW:
case GAZELLE_STAT_LSTACK_SHOW_RATE:
@@ -129,8 +142,10 @@ static void get_stack_dfx_data(struct gazelle_stack_dfx_data *dfx, struct protoc
sizeof(stack->lwip_stats->mib2));
break;
case GAZELLE_STAT_LSTACK_SHOW_CONN:
- dfx->data.conn.conn_num = rpc_call_conntable(stack, dfx->data.conn.conn_list, GAZELLE_LSTACK_MAX_CONN);
- dfx->data.conn.total_conn_num = rpc_call_connnum(stack);
+ rpc_call_result = rpc_call_conntable(stack, dfx->data.conn.conn_list, GAZELLE_LSTACK_MAX_CONN);
+ dfx->data.conn.conn_num = (rpc_call_result < 0) ? 0 : rpc_call_result;
+ rpc_call_result = rpc_call_connnum(stack);
+ dfx->data.conn.total_conn_num = (rpc_call_result < 0) ? 0 : rpc_call_result;
break;
case GAZELLE_STAT_LSTACK_SHOW_LATENCY:
memcpy_s(&dfx->data.latency, sizeof(dfx->data.latency), &stack->latency, sizeof(stack->latency));
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index 2fb24b4..c95f2c0 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -197,6 +197,16 @@ int32_t rpc_call_eventlistcnt(struct protocol_stack *stack)
return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg);
}
+int32_t rpc_call_sendlistcnt(struct protocol_stack *stack)
+{
+ struct rpc_msg *msg = rpc_msg_alloc(stack, stack_sendlist_count);
+ if (msg == NULL) {
+ return -1;
+ }
+
+ return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg);
+}
+
int32_t rpc_call_recvlistcnt(struct protocol_stack *stack)
{
struct rpc_msg *msg = rpc_msg_alloc(stack, stack_recvlist_count);
@@ -442,34 +452,6 @@ int32_t rpc_call_ioctl(int fd, long cmd, void *argp)
return rpc_sync_call(&stack->rpc_queue, stack->rpc_pool, msg);
}
-static void stack_send(struct rpc_msg *msg)
-{
- int32_t fd = msg->args[MSG_ARG_0].i;
- int32_t flags = msg->args[MSG_ARG_2].i;
-
- struct protocol_stack *stack = get_protocol_stack();
- struct lwip_sock *sock = get_socket(fd);
- if (sock == NULL) {
- msg->result = -1;
- msg->self_release = 0;
- return;
- }
-
- msg->result = write_lwip_data(sock, fd, flags);
- sock->have_rpc_send = false;
-
- if (msg->result >= 0 && rte_ring_count(sock->send_ring)) {
- sock->have_rpc_send = true;
- sock->stack->stats.send_self_rpc++;
- msg->self_release = 1;
- rpc_call(&stack->rpc_queue, msg);
- }
-
- if (rte_ring_free_count(sock->send_ring)) {
- add_epoll_event(sock->conn, EPOLLOUT);
- }
-}
-
ssize_t rpc_call_send(int fd, const void *buf, size_t len, int flags)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h
index 87442cd..cfd454d 100644
--- a/src/lstack/include/lstack_lwip.h
+++ b/src/lstack/include/lstack_lwip.h
@@ -33,11 +33,13 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags);
ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, u8_t apiflags);
void read_recv_list(void);
void add_recv_list(int32_t fd);
+void stack_sendlist_count(struct rpc_msg *msg);
void stack_eventlist_count(struct rpc_msg *msg);
void stack_wakeuplist_count(struct rpc_msg *msg);
void get_lwip_conntable(struct rpc_msg *msg);
void get_lwip_connnum(struct rpc_msg *msg);
void stack_recvlist_count(struct rpc_msg *msg);
+void stack_send(struct rpc_msg *msg);
void stack_replenish_send_idlembuf(struct protocol_stack *stack);
int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs, uint32_t num);
void gazelle_free_pbuf(struct pbuf *pbuf);
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index dd7633b..5b95dc9 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -52,6 +52,7 @@ struct protocol_stack {
struct list_node recv_list;
struct list_node listen_list;
struct list_node event_list;
+ struct list_node send_list;
struct list_node *wakeup_list;
struct gazelle_stat_pkts stats;
diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h
index cffb273..76ba36a 100644
--- a/src/lstack/include/lstack_thread_rpc.h
+++ b/src/lstack/include/lstack_thread_rpc.h
@@ -55,6 +55,7 @@ int32_t rpc_call_msgcnt(struct protocol_stack *stack);
int32_t rpc_call_shadow_fd(struct protocol_stack *stack, int32_t fd, const struct sockaddr *addr, socklen_t addrlen);
int32_t rpc_call_recvlistcnt(struct protocol_stack *stack);
int32_t rpc_call_eventlistcnt(struct protocol_stack *stack);
+int32_t rpc_call_sendlistcnt(struct protocol_stack *stack);
int32_t rpc_call_wakeuplistcnt(struct protocol_stack *stack);
int32_t rpc_call_thread_regphase1(struct protocol_stack *stack, void *conn);
int32_t rpc_call_thread_regphase2(struct protocol_stack *stack, void *conn);
diff --git a/src/lstack/include/lstack_weakup.h b/src/lstack/include/lstack_weakup.h
index 8f7fca2..4f6321e 100644
--- a/src/lstack/include/lstack_weakup.h
+++ b/src/lstack/include/lstack_weakup.h
@@ -16,7 +16,7 @@
#include <rte_ring.h>
#include "lstack_dpdk.h"
-#define EPOLL_MAX_EVENTS 256
+#define EPOLL_MAX_EVENTS 512
struct weakup_poll {
sem_t event_sem;
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index 66d6053..a575c33 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -582,6 +582,7 @@ static void show_lstack_stats(struct gazelle_stack_dfx_data *lstack_stat)
printf("call_msg: %-19"PRIu64" ", lstack_stat->data.pkts.call_msg_cnt);
printf("call_alloc_fail: %-12"PRIu64" ", lstack_stat->data.pkts.call_alloc_fail);
printf("call_null: %-18"PRIu64" \n", lstack_stat->data.pkts.call_null);
+ printf("send_list: %-18"PRIu64" \n", lstack_stat->data.pkts.send_list);
}
static void gazelle_print_lstack_stat_detail(struct gazelle_stack_dfx_data *lstack_stat,
@@ -884,7 +885,7 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_
do {
printf("\n------ stack tid: %6u ------\n", stat->tid);
printf("No. Proto recv_cnt recv_ring in_send send_ring event self_event Local Address"
- " Foreign Address State\n");
+ " Foreign Address State\n");
uint32_t unread_pkts = 0;
uint32_t unsend_pkts = 0;
for (i = 0; i < conn->conn_num && i < GAZELLE_LSTACK_MAX_CONN; i++) {
--
1.8.3.1

View File

@ -1,45 +0,0 @@
From a066142dfb38235ea46307e4b1d3395dcc2694a7 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Tue, 15 Mar 2022 17:47:42 +0800
Subject: [PATCH 26/34] get fin notice app
---
src/lstack/api/lstack_epoll.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index cf072b0..1f0aea8 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -73,6 +73,11 @@ void add_epoll_event(struct netconn *conn, uint32_t event)
/* conn sock nerver null, because lwip call this func */
struct lwip_sock *sock = get_socket(conn->socket);
+ /* close_wait event should be (EPOLLRDHUP | EPOLLIN), but lwip is EPOLLERR */
+ if (event == EPOLLERR && conn->pcb.tcp && conn->pcb.tcp->state == CLOSE_WAIT) {
+ event = EPOLLRDHUP | EPOLLIN | EPOLLERR;
+ }
+
/* shadow_fd event notice listen_fd */
if (sock->shadowed_sock) {
sock = sock->shadowed_sock;
@@ -286,7 +291,6 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m
struct epoll_event *events = (struct epoll_event *)out;
struct pollfd *fds = (struct pollfd *)out;
-
if (etype == TYPE_EPOLL) {
maxevents = LWIP_MIN(EPOLL_MAX_EVENTS, maxevents);
}
@@ -300,7 +304,7 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m
}
/* close sock */
if (sock->stack == NULL) {
- return true;
+ continue;
}
__atomic_store_n(&sock->have_event, false, __ATOMIC_RELEASE);
--
1.8.3.1

View File

@ -1,832 +0,0 @@
From d8c362e9a1af1c5ef50fbcda24fd4a127d591311 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Wed, 16 Mar 2022 16:26:28 +0800
Subject: [PATCH 27/34] fix parse config
---
src/common/dir.mk | 2 +-
src/common/dpdk_common.h | 4 +-
src/common/gazelle_parse_config.c | 64 ++++++++++++++++++++++++++++
src/common/gazelle_parse_config.h | 20 +++++++++
src/common/gazelle_reg_msg.h | 2 +-
src/lstack/Makefile | 2 +-
src/lstack/core/lstack_cfg.c | 67 +++++-------------------------
src/lstack/include/lstack_cfg.h | 14 +++----
src/lstack/include/lstack_compiler.h | 6 +--
src/lstack/include/lstack_control_plane.h | 6 +--
src/lstack/include/lstack_dpdk.h | 8 ++--
src/lstack/include/lstack_ethdev.h | 6 +--
src/lstack/include/lstack_lockless_queue.h | 4 +-
src/lstack/include/lstack_lwip.h | 4 +-
src/lstack/include/lstack_protocol_stack.h | 4 +-
src/lstack/include/lstack_signal.h | 6 +--
src/lstack/include/lstack_thread_rpc.h | 4 +-
src/lstack/include/lstack_vdev.h | 6 +--
src/lstack/include/lstack_weakup.h | 4 +-
src/lstack/include/posix/lstack_epoll.h | 6 +--
src/lstack/include/posix/lstack_fcntl.h | 6 +--
src/lstack/include/posix/lstack_fork.h | 6 +--
src/lstack/include/posix/lstack_socket.h | 6 +--
src/lstack/include/posix/lstack_unistd.h | 6 +--
src/lstack/netif/lstack_ethdev.c | 12 ------
src/ltran/CMakeLists.txt | 3 +-
src/ltran/ltran_base.h | 2 +-
src/ltran/ltran_config.c | 5 ++-
src/ltran/ltran_ethdev.h | 2 +-
src/ltran/ltran_param.c | 33 +++------------
30 files changed, 162 insertions(+), 158 deletions(-)
create mode 100644 src/common/gazelle_parse_config.c
create mode 100644 src/common/gazelle_parse_config.h
diff --git a/src/common/dir.mk b/src/common/dir.mk
index b61edf3..68a2b72 100644
--- a/src/common/dir.mk
+++ b/src/common/dir.mk
@@ -8,6 +8,6 @@
# PURPOSE.
# See the Mulan PSL v2 for more details.
-SRC = dpdk_common.c
+SRC = dpdk_common.c gazelle_parse_config.c
$(eval $(call register_dir, ../common, $(SRC)))
diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h
index e9cacc3..6137bcb 100644
--- a/src/common/dpdk_common.h
+++ b/src/common/dpdk_common.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef __LIBOS_DPDK_COMMON_H__
-#define __LIBOS_DPDK_COMMON_H__
+#ifndef __GAZELLE_DPDK_COMMON_H__
+#define __GAZELLE_DPDK_COMMON_H__
#include <rte_mbuf.h>
diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c
new file mode 100644
index 0000000..bbc8362
--- /dev/null
+++ b/src/common/gazelle_parse_config.c
@@ -0,0 +1,64 @@
+/*
+* 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 <securec.h>
+#include <string.h>
+#include <limits.h>
+
+#include "gazelle_parse_config.h"
+
+static int32_t parse_str_data(char *args, uint32_t *array, int32_t array_size)
+{
+ const char *delim = "-";
+ char *elem = NULL;
+ char *next_token = NULL;
+ char *endptr = NULL;
+ int32_t cnt = 0;
+ int64_t start, end;
+
+ elem = strtok_s(args, delim, &next_token);
+ start = strtol(elem, &endptr, 0);
+
+ elem = strtok_s(NULL, delim, &next_token);
+ if (elem == NULL) {
+ /* just a single data */
+ array[cnt++] = start;
+ return cnt;
+ }
+ end = strtol(elem, &endptr, 0);
+
+ for (int64_t i = start; i <= end && cnt < array_size; i++) {
+ if (i < 0 || i > UINT_MAX) {
+ break;
+ }
+ array[cnt++] = i;
+ }
+
+ return cnt;
+}
+
+/* support '-' and ',' */
+int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size)
+{
+ const char *delim = ",";
+ char *elem = NULL;
+ char *next_token = NULL;
+ int32_t cnt = 0;
+
+ elem = strtok_s(args, delim, &next_token);
+ while (elem != NULL && cnt < array_size) {
+ cnt += parse_str_data(elem, &array[cnt], array_size - cnt);
+ elem = strtok_s(NULL, delim, &next_token);
+ }
+
+ return cnt;
+}
diff --git a/src/common/gazelle_parse_config.h b/src/common/gazelle_parse_config.h
new file mode 100644
index 0000000..0f86d80
--- /dev/null
+++ b/src/common/gazelle_parse_config.h
@@ -0,0 +1,20 @@
+/*
+* 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.
+*/
+
+#ifndef __GAZELLE_PARSE_CONFIG__
+#define __GAZELLE_PARSE_CONFIG__
+
+#include <stdint.h>
+
+int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size);
+
+#endif
\ No newline at end of file
diff --git a/src/common/gazelle_reg_msg.h b/src/common/gazelle_reg_msg.h
index fa8f319..ff846fd 100644
--- a/src/common/gazelle_reg_msg.h
+++ b/src/common/gazelle_reg_msg.h
@@ -18,7 +18,7 @@
#include <lwip/reg_sock.h>
#include <rte_ether.h>
-#define GAZELLE_REG_SOCK_PATHNAME "/var/run/gazelle/libos_client.sock"
+#define GAZELLE_REG_SOCK_PATHNAME "/var/run/gazelle/gazelle_client.sock"
#define GAZELLE_RUN_DIR "/var/run/gazelle/"
#define GAZELLE_FILE_PERMISSION 0700
diff --git a/src/lstack/Makefile b/src/lstack/Makefile
index 7a888de..8fc2435 100644
--- a/src/lstack/Makefile
+++ b/src/lstack/Makefile
@@ -27,7 +27,7 @@ INC = -I$(LSTACK_DIR)/include \
-I$(LSTACK_DIR)/../common \
-I$(LWIP_INCLUDE_FILE)
-CFLAGS = $(OPTIMIZATION) -fno-strict-aliasing $(INC) -DUSE_LIBOS_MEM
+CFLAGS = $(OPTIMIZATION) -fno-strict-aliasing $(INC)
ifeq ($(GAZELLE_COVERAGE_ENABLE), 1)
LDFLAGS += -fprofile-arcs -ftest-coverage
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
index fcc1c0b..ca25b58 100644
--- a/src/lstack/core/lstack_cfg.c
+++ b/src/lstack/core/lstack_cfg.c
@@ -33,6 +33,7 @@
#include "gazelle_reg_msg.h"
#include "lstack_log.h"
#include "gazelle_base_func.h"
+#include "gazelle_parse_config.h"
#include "lstack_protocol_stack.h"
#define DEFAULT_CONF_FILE "/etc/gazelle/lstack.conf"
@@ -189,35 +190,6 @@ static int32_t parse_devices(void)
return ret;
}
-static int32_t turn_str_to_array(char *args, uint16_t *array, int32_t size)
-{
- int32_t val;
- uint16_t cnt = 0;
- const char *delim = ",";
- char *elem = NULL;
- char *next_token = NULL;
-
- memset_s(array, sizeof(*array) * size, 0, sizeof(*array) * size);
-
- elem = strtok_s((char *)args, delim, &next_token);
- while (elem != NULL) {
- if (cnt >= size) {
- return -1;
- }
-
- val = atoi(elem);
- if (val < 0) {
- return -1;
- }
- array[cnt] = (uint16_t)val;
- cnt++;
-
- elem = strtok_s(NULL, delim, &next_token);
- }
-
- return cnt;
-}
-
static int32_t get_param_idx(int32_t argc, char **argv, const char *param)
{
int32_t ret;
@@ -241,9 +213,6 @@ static int32_t parse_stack_cpu_number(void)
const config_setting_t *num_cpus = NULL;
const char *args = NULL;
- int32_t ret;
- int32_t idx;
-
num_cpus = config_lookup(&g_config, "num_cpus");
if (num_cpus == NULL) {
return -EINVAL;
@@ -254,7 +223,7 @@ static int32_t parse_stack_cpu_number(void)
return -EINVAL;
}
- idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST);
+ int32_t idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST);
if (idx < 0) {
g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(OPT_BIND_CORELIST);
g_config_params.dpdk_argc++;
@@ -263,11 +232,14 @@ static int32_t parse_stack_cpu_number(void)
g_config_params.dpdk_argc++;
}
- ret = turn_str_to_array((char *)args, g_config_params.cpus, CFG_MAX_CPUS);
- if (ret <= 0) {
+ char *tmp_arg = strdup(args);
+ int32_t cnt = separate_str_to_array(tmp_arg, g_config_params.cpus, CFG_MAX_CPUS);
+ free(tmp_arg);
+ if (cnt <= 0 || cnt > CFG_MAX_CPUS) {
return -EINVAL;
}
- g_config_params.num_cpu = (uint16_t)ret;
+
+ g_config_params.num_cpu = cnt;
get_protocol_stack_group()->stack_num = g_config_params.num_cpu;
return 0;
@@ -368,7 +340,6 @@ int32_t init_stack_numa_cpuset(void)
return 0;
}
-#ifdef USE_LIBOS_MEM
static int32_t gazelle_parse_base_virtaddr(const char *arg, uintptr_t *base_vaddr)
{
uint64_t viraddr;
@@ -389,14 +360,8 @@ static int32_t gazelle_parse_base_virtaddr(const char *arg, uintptr_t *base_vadd
static int32_t gazelle_parse_socket_mem(const char *arg, struct secondary_attach_arg *sec_attach_arg)
{
size_t mem_size = 0;
- uint8_t count = 0;
char socket_mem[PATH_MAX];
- const char *delim = ",";
- char *mem_elem = NULL;
- char *end = NULL;
- char *next_token = NULL;
-
errno = 0;
if ((arg == NULL) || (sec_attach_arg == NULL)) {
@@ -408,22 +373,13 @@ static int32_t gazelle_parse_socket_mem(const char *arg, struct secondary_attach
return -1;
}
- mem_elem = strtok_s(socket_mem, delim, &next_token);
- while (mem_elem != NULL) {
- if (count >= GAZELLE_MAX_NUMA_NODES) {
- return -1;
- }
- sec_attach_arg->socket_per_size[count] = strtoull(mem_elem, &end, BASE_DEC_SCALE);
+ int32_t count = separate_str_to_array(socket_mem, sec_attach_arg->socket_per_size, GAZELLE_MAX_NUMA_NODES);
+ for (uint32_t i = 0; i < count; i++) {
mem_size += sec_attach_arg->socket_per_size[count];
- if ((errno != 0) || end == NULL || (*end != '\0'))
- return -1;
-
- mem_elem = strtok_s(NULL, delim, &next_token);
- count++;
}
mem_size *= 1024LL;
mem_size *= 1024LL;
- if (mem_size > (UINT64_MAX / 1024LL / 1024LL)) {
+ if (mem_size > (UINT64_MAX / 1024LL / 1024LL) || count > UINT8_MAX) {
return -1;
}
sec_attach_arg->socket_num = count;
@@ -663,7 +619,6 @@ free_dpdk_args:
GAZELLE_FREE(g_config_params.dpdk_argv);
return -EINVAL;
}
-#endif
static int32_t parse_low_power_mode(void)
{
diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h
index 1a59c6c..48b7e44 100644
--- a/src/lstack/include/lstack_cfg.h
+++ b/src/lstack/include/lstack_cfg.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef LIBOS_NET_CFG_H
-#define LIBOS_NET_CFG_H
+#ifndef _GAZELLE_NET_CFG_H_
+#define _GAZELLE_NET_CFG_H_
#include <stdbool.h>
#include <rte_ether.h>
@@ -53,7 +53,7 @@
struct secondary_attach_arg {
uint8_t socket_num;
uint64_t socket_size;
- uint64_t socket_per_size[GAZELLE_MAX_NUMA_NODES];
+ uint32_t socket_per_size[GAZELLE_MAX_NUMA_NODES];
uintptr_t base_virtaddr;
char file_prefix[PATH_MAX];
};
@@ -64,9 +64,9 @@ struct cfg_params {
ip4_addr_t gateway_addr;
struct rte_ether_addr ethdev;
uint16_t num_cpu;
- uint16_t cpus[CFG_MAX_CPUS];
+ uint32_t cpus[CFG_MAX_CPUS];
uint16_t num_wakeup;
- uint16_t weakup[CFG_MAX_CPUS];
+ uint32_t weakup[CFG_MAX_CPUS];
uint8_t num_ports;
uint16_t ports[CFG_MAX_PORTS];
char log_file[PATH_MAX];
@@ -78,9 +78,7 @@ struct cfg_params {
bool kni_switch;
int dpdk_argc;
char **dpdk_argv;
-#ifdef USE_LIBOS_MEM
struct secondary_attach_arg sec_attach_arg;
-#endif
};
struct cfg_params *get_global_cfg_params(void);
@@ -98,4 +96,4 @@ int gazelle_copy_param(const char *param, bool is_double,
int match_host_addr(uint32_t ipv4);
int32_t init_stack_numa_cpuset(void);
-#endif /* LIBOS_NET_CFG_H */
+#endif /* GAZELLE_NET_CFG_H */
diff --git a/src/lstack/include/lstack_compiler.h b/src/lstack/include/lstack_compiler.h
index 1db27ae..c4880a5 100644
--- a/src/lstack/include/lstack_compiler.h
+++ b/src/lstack/include/lstack_compiler.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef LIBOS_COMPILER_H
-#define LIBOS_COMPILER_H
+#ifndef _GAZELLE_COMPILER_H_
+#define _GAZELLE_COMPILER_H_
#ifdef __GNUC__
@@ -43,4 +43,4 @@
#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
#endif
-#endif /* LIBOS_COMPILER_H */
+#endif /* GAZELLE_COMPILER_H */
diff --git a/src/lstack/include/lstack_control_plane.h b/src/lstack/include/lstack_control_plane.h
index 7c267e2..0af891a 100644
--- a/src/lstack/include/lstack_control_plane.h
+++ b/src/lstack/include/lstack_control_plane.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef LIBOS_CONTROL_PLANE_H
-#define LIBOS_CONTROL_PLANE_H
+#ifndef _GAZELLE_CONTROL_PLANE_H_
+#define _GAZELLE_CONTROL_PLANE_H_
#include "lstack_thread_rpc.h"
@@ -33,4 +33,4 @@ bool get_register_state(void);
void thread_register_phase1(struct rpc_msg *msg);
void thread_register_phase2(struct rpc_msg *msg);
-#endif /* LIBOS_CONTROL_PLANE_H */
+#endif /* GAZELLE_CONTROL_PLANE_H */
diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h
index 7b623a7..e76a9a6 100644
--- a/src/lstack/include/lstack_dpdk.h
+++ b/src/lstack/include/lstack_dpdk.h
@@ -10,13 +10,11 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef LIBOS_DPDK_H
-#define LIBOS_DPDK_H
+#ifndef _GAZELLE_DPDK_H_
+#define _GAZELLE_DPDK_H_
-#ifdef USE_LIBOS_MEM
#include <rte_mbuf.h>
#include <rte_mempool.h>
-#endif
#include <lwip/pbuf.h>
#include "lstack_lockless_queue.h"
@@ -70,4 +68,4 @@ int dpdk_ethdev_start(void);
void dpdk_skip_nic_init(void);
int32_t dpdk_init_lstack_kni(void);
-#endif /* LIBOS_DPDK_H */
+#endif /* GAZELLE_DPDK_H */
diff --git a/src/lstack/include/lstack_ethdev.h b/src/lstack/include/lstack_ethdev.h
index 29e0c23..573a413 100644
--- a/src/lstack/include/lstack_ethdev.h
+++ b/src/lstack/include/lstack_ethdev.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef __LIBOS_ETHDEV_H__
-#define __LIBOS_ETHDEV_H__
+#ifndef __GAZELLE_ETHDEV_H__
+#define __GAZELLE_ETHDEV_H__
#include <lwip/ip_addr.h>
#include <lwip/netif.h>
@@ -34,4 +34,4 @@ int32_t eth_dev_poll(void);
uint32_t eth_get_flow_cnt(void);
void eth_dev_recv(struct rte_mbuf *mbuf);
-#endif /* __LIBOS_ETHDEV_H__ */
+#endif /* __GAZELLE_ETHDEV_H__ */
diff --git a/src/lstack/include/lstack_lockless_queue.h b/src/lstack/include/lstack_lockless_queue.h
index e015e93..c70b56a 100644
--- a/src/lstack/include/lstack_lockless_queue.h
+++ b/src/lstack/include/lstack_lockless_queue.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef __LIBOS_LOCKLESS_QUEUE_H__
-#define __LIBOS_LOCKLESS_QUEUE_H__
+#ifndef __GAZELLE_LOCKLESS_QUEUE_H__
+#define __GAZELLE_LOCKLESS_QUEUE_H__
typedef struct lockless_queue_node {
struct lockless_queue_node *volatile next;
diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h
index cfd454d..285095a 100644
--- a/src/lstack/include/lstack_lwip.h
+++ b/src/lstack/include/lstack_lwip.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef __LIBOS_LWIP_H__
-#define __LIBOS_LWIP_H__
+#ifndef __GAZELLE_LWIP_H__
+#define __GAZELLE_LWIP_H__
#include "lstack_thread_rpc.h"
#include "lwipsock.h"
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index 5b95dc9..39052e1 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef __LIBOS_PROTOCOL_STACK_H__
-#define __LIBOS_PROTOCOL_STACK_H__
+#ifndef __GAZELLE_PROTOCOL_STACK_H__
+#define __GAZELLE_PROTOCOL_STACK_H__
#include <semaphore.h>
#include <lwip/list.h>
diff --git a/src/lstack/include/lstack_signal.h b/src/lstack/include/lstack_signal.h
index edc8de5..2541a37 100644
--- a/src/lstack/include/lstack_signal.h
+++ b/src/lstack/include/lstack_signal.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef _LIBOS_SIGNAL_
-#define _LIBOS_SIGNAL_
+#ifndef _GAZELLE_SIGNAL_
+#define _GAZELLE_SIGNAL_
void lstack_signal_init(void);
-#endif // _LIBOS_SIGNAL_
+#endif // _GAZELLE_SIGNAL_
diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h
index 76ba36a..20539d9 100644
--- a/src/lstack/include/lstack_thread_rpc.h
+++ b/src/lstack/include/lstack_thread_rpc.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef __LIBOS_THREAD_RPC_H__
-#define __LIBOS_THREAD_RPC_H__
+#ifndef __GAZELLE_THREAD_RPC_H__
+#define __GAZELLE_THREAD_RPC_H__
#include <pthread.h>
#include <arch/sys_arch.h>
diff --git a/src/lstack/include/lstack_vdev.h b/src/lstack/include/lstack_vdev.h
index 19b97f1..916b1e2 100644
--- a/src/lstack/include/lstack_vdev.h
+++ b/src/lstack/include/lstack_vdev.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef LIBOS_VDEV_H
-#define LIBOS_VDEV_H
+#ifndef _GAZELLE_VDEV_H_
+#define _GAZELLE_VDEV_H_
#include "lstack_ethdev.h"
#include "gazelle_reg_msg.h"
@@ -33,4 +33,4 @@ struct eth_dev_ops;
void vdev_dev_ops_init(struct eth_dev_ops **dev_ops);
int vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple);
-#endif /* LIBOS_VDEV_H */
+#endif /* _GAZELLE_VDEV_H_ */
diff --git a/src/lstack/include/lstack_weakup.h b/src/lstack/include/lstack_weakup.h
index 4f6321e..b051b72 100644
--- a/src/lstack/include/lstack_weakup.h
+++ b/src/lstack/include/lstack_weakup.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef __LIBOS_WEAKUP_THREAD_H__
-#define __LIBOS_WEAKUP_THREAD_H__
+#ifndef __GAZELLE_WEAKUP_THREAD_H__
+#define __GAZELLE_WEAKUP_THREAD_H__
#include <rte_ring.h>
#include "lstack_dpdk.h"
diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/posix/lstack_epoll.h
index c97978f..2b3cff4 100644
--- a/src/lstack/include/posix/lstack_epoll.h
+++ b/src/lstack/include/posix/lstack_epoll.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef LIBOS_EPOLL_H
-#define LIBOS_EPOLL_H
+#ifndef _GAZELLE_EPOLL_H_
+#define _GAZELLE_EPOLL_H_
#ifdef __cplusplus
extern "C" {
@@ -26,4 +26,4 @@ int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout);
}
#endif
-#endif /* LIBOS_EPOLL_H */
+#endif /* _GAZELLE_EPOLL_H_ */
diff --git a/src/lstack/include/posix/lstack_fcntl.h b/src/lstack/include/posix/lstack_fcntl.h
index b3d6797..d1087a6 100644
--- a/src/lstack/include/posix/lstack_fcntl.h
+++ b/src/lstack/include/posix/lstack_fcntl.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef LIBOS_FCNTL_H
-#define LIBOS_FCNTL_H
+#ifndef _GAZELLE_FCNTL_H_
+#define _GAZELLE_FCNTL_H_
#ifdef __cplusplus
extern "C" {
@@ -24,5 +24,5 @@ int lwip_ioctl(int s, int cmd, ...);
}
#endif
-#endif /* LIBOS_FCNTL_H */
+#endif /* _GAZELLE_FCNTL_H_ */
diff --git a/src/lstack/include/posix/lstack_fork.h b/src/lstack/include/posix/lstack_fork.h
index 049903a..939534a 100644
--- a/src/lstack/include/posix/lstack_fork.h
+++ b/src/lstack/include/posix/lstack_fork.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef _LIBOS_FORK_
-#define _LIBOS_FORK_
+#ifndef _GAZELLE_FORK_
+#define _GAZELLE_FORK_
pid_t lstack_fork(void);
-#endif // _LIBOS_FORK_
+#endif // _GAZELLE_FORK_
diff --git a/src/lstack/include/posix/lstack_socket.h b/src/lstack/include/posix/lstack_socket.h
index 6a44d41..776a6ab 100644
--- a/src/lstack/include/posix/lstack_socket.h
+++ b/src/lstack/include/posix/lstack_socket.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef LIBOS_SOCKET_H
-#define LIBOS_SOCKET_H
+#ifndef _GAZELLE_SOCKET_H_
+#define _GAZELLE_SOCKET_H_
#ifdef __cplusplus
extern "C" {
@@ -40,4 +40,4 @@ ssize_t lwip_recv(int s, void *mem, size_t len, int flags);
}
#endif
-#endif /* LIBOS_SOCKET_H */
+#endif /* _GAZELLE_SOCKET_H_ */
diff --git a/src/lstack/include/posix/lstack_unistd.h b/src/lstack/include/posix/lstack_unistd.h
index 8c57d3a..cdd46c9 100644
--- a/src/lstack/include/posix/lstack_unistd.h
+++ b/src/lstack/include/posix/lstack_unistd.h
@@ -10,8 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifndef LIBOS_UNISTD_H
-#define LIBOS_UNISTD_H
+#ifndef _GAZELLE_UNISTD_H_
+#define _GAZELLE_UNISTD_H_
#include "lstack_fork.h"
#ifdef __cplusplus
@@ -24,4 +24,4 @@ int lstack_sigaction(int signum, const struct sigaction *act, struct sigaction *
}
#endif
-#endif /* LIBOS_UNISTD_H */
+#endif /* _GAZELLE_UNISTD_H_ */
diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c
index 026f545..c428bca 100644
--- a/src/lstack/netif/lstack_ethdev.c
+++ b/src/lstack/netif/lstack_ethdev.c
@@ -10,20 +10,8 @@
* See the Mulan PSL v2 for more details.
*/
-#ifdef USE_LIBOS_MEM
#include <rte_ethdev.h>
#include <rte_malloc.h>
-#else
-/* in dpdk 19.11 there is the following inclusion relationship
- * >> rte_ethdev.h
- * >> rte_eth_ctrl.h
- * >> rte_flow.h
- * >> rte_ip.h
- * >> netinet/ip.h
- * avoid conflicts with netinet/ip.h
- */
-#include <lwip/inet.h>
-#endif
#include <lwip/debug.h>
#include <lwip/etharp.h>
diff --git a/src/ltran/CMakeLists.txt b/src/ltran/CMakeLists.txt
index 8662d7c..c21d88a 100644
--- a/src/ltran/CMakeLists.txt
+++ b/src/ltran/CMakeLists.txt
@@ -23,7 +23,8 @@ endif($ENV{GAZELLE_COVERAGE_ENABLE})
add_executable(ltran main.c ltran_param.c ltran_config.c ltran_ethdev.c ltran_stat.c ltran_errno.c
ltran_monitor.c ltran_instance.c ltran_stack.c ltran_tcp_conn.c ltran_tcp_sock.c
- ltran_forward.c ltran_timer.c ${COMMON_DIR}/gazelle_dfx_msg.c ${COMMON_DIR}/dpdk_common.c)
+ ltran_forward.c ltran_timer.c ${COMMON_DIR}/gazelle_dfx_msg.c ${COMMON_DIR}/dpdk_common.c
+ ${COMMON_DIR}/gazelle_parse_config.c)
target_include_directories(ltran PRIVATE ${COMMON_DIR} ${PROJECT_SOURCE_DIR})
target_compile_options(ltran PRIVATE -march=native -fno-strict-aliasing -D__ARM_FEATURE_CRC32=1 -DRTE_MACHINE_CPUFLAG_NEON
diff --git a/src/ltran/ltran_base.h b/src/ltran/ltran_base.h
index 0a284bc..4663257 100644
--- a/src/ltran/ltran_base.h
+++ b/src/ltran/ltran_base.h
@@ -94,6 +94,6 @@
#define GAZELLE_INET_ADDRSTRLEN 16
-#define GAZELLE_DFX_SOCK_PATHNAME "/var/run/gazelle/libos_cmd.sock"
+#define GAZELLE_DFX_SOCK_PATHNAME "/var/run/gazelle/gazelle_cmd.sock"
#endif /* ifndef __GAZELLE_BASE_H__ */
diff --git a/src/ltran/ltran_config.c b/src/ltran/ltran_config.c
index 366f89c..d9c1bd7 100644
--- a/src/ltran/ltran_config.c
+++ b/src/ltran/ltran_config.c
@@ -10,13 +10,14 @@
* See the Mulan PSL v2 for more details.
*/
-#include "ltran_config.h"
-
+#include <sys/types.h>
#include <string.h>
#include <getopt.h>
#include <syslog.h>
#include <securec.h>
+
#include "ltran_log.h"
+#include "ltran_config.h"
#define NO_ARGS 0
#define HAS_ARGS 1
diff --git a/src/ltran/ltran_ethdev.h b/src/ltran/ltran_ethdev.h
index 2a72704..de7cfbb 100644
--- a/src/ltran/ltran_ethdev.h
+++ b/src/ltran/ltran_ethdev.h
@@ -23,7 +23,7 @@ struct port_info {
};
uint32_t get_bond_num(void);
-struct rte_kni* get_libos_kni(void);
+struct rte_kni* get_gazelle_kni(void);
void set_bond_num(const uint32_t bond_num);
struct port_info* get_port_info(void);
uint16_t* get_bond_port(void);
diff --git a/src/ltran/ltran_param.c b/src/ltran/ltran_param.c
index 44785bd..aafbeee 100644
--- a/src/ltran/ltran_param.c
+++ b/src/ltran/ltran_param.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include "ltran_log.h"
+#include "gazelle_parse_config.h"
#include "gazelle_base_func.h"
#define HEX_BASE 16
@@ -310,7 +311,6 @@ static int32_t is_bond_port_prefix_valid(const char *port_str)
static int32_t parse_bond_ports(const config_t *config, const char *key, struct ltran_config *ltran_config)
{
- const char *delim = ",";
const char *port_mask_str = NULL;
int32_t ret;
@@ -334,32 +334,11 @@ static int32_t parse_bond_ports(const config_t *config, const char *key, struct
return GAZELLE_ERR;
}
- char *end = NULL;
- char *tmp = NULL;
- unsigned long one_port_mask;
- char *token = strtok_s(port_str, delim, &tmp);
- while (token != NULL) {
- if (ltran_config->bond.port_num == GAZELLE_MAX_BOND_NUM) {
- free(port_str);
- gazelle_set_errno(GAZELLE_ERANGE);
- return GAZELLE_ERR;
- }
-
- one_port_mask = strtoul(token, &end, HEX_BASE);
- if ((end == NULL) || (*end != '\0')) {
- gazelle_set_errno(GAZELLE_ESTRTOUL);
- free(port_str);
- return GAZELLE_ERR;
- }
- if ((one_port_mask < GAZELLE_BOND_PORT_MASK_MIN) || (one_port_mask > GAZELLE_BOND_PORT_MASK_MAX)) {
- gazelle_set_errno(GAZELLE_ERANGE);
- free(port_str);
- return GAZELLE_ERR;
- }
-
- token = strtok_s(NULL, delim, &tmp);
- ltran_config->bond.portmask[ltran_config->bond.port_num] = (uint32_t)one_port_mask;
- ltran_config->bond.port_num++;
+ ltran_config->bond.port_num = separate_str_to_array(port_str, ltran_config->bond.portmask, GAZELLE_MAX_BOND_NUM);
+ if (ltran_config->bond.port_num >= GAZELLE_MAX_BOND_NUM) {
+ free(port_str);
+ gazelle_set_errno(GAZELLE_ERANGE);
+ return GAZELLE_ERR;
}
free(port_str);
--
1.8.3.1

View File

@ -1,60 +0,0 @@
From 53969ac0be85346d2abd776c66d4ff244c9f5da7 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Mon, 14 Mar 2022 22:41:57 +0800
Subject: [PATCH 28/34] fix lstack show latency
---
src/lstack/core/lstack_init.c | 6 ++++++
src/lstack/core/lstack_stack_stat.c | 5 +++++
src/ltran/ltran_dfx.c | 2 --
3 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c
index df60c4f..17195c8 100644
--- a/src/lstack/core/lstack_init.c
+++ b/src/lstack/core/lstack_init.c
@@ -190,6 +190,12 @@ __attribute__((constructor)) void gazelle_network_init(void)
LSTACK_EXIT(1, "pthread_getaffinity_np failed\n");
}
+ /* to prevent crash , just ignore SIGPIPE when socket is closed */
+ if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
+ LSTACK_PRE_LOG(LSTACK_ERR, "signal error, errno:%d.", errno);
+ LSTACK_EXIT(1, "signal SIGPIPE SIG_IGN\n");
+ }
+
/*
* Phase 6: Init control plane and dpdk init */
pthread_t tid;
diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c
index 9a8fd08..1813906 100644
--- a/src/lstack/core/lstack_stack_stat.c
+++ b/src/lstack/core/lstack_stack_stat.c
@@ -190,6 +190,11 @@ int32_t handle_stack_cmd(int32_t fd, enum GAZELLE_STAT_MODE stat_mode)
struct protocol_stack *stack = stack_group->stacks[i];
get_stack_dfx_data(&dfx, stack, stat_mode);
+ if (!use_ltran() &&
+ (stat_mode == GAZELLE_STAT_LTRAN_START_LATENCY || stat_mode == GAZELLE_STAT_LTRAN_STOP_LATENCY)) {
+ continue;
+ }
+
dfx.tid = stack->tid;
if (i == stack_group->stack_num - 1) {
dfx.eof = 1;
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index a575c33..3baa017 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -1231,8 +1231,6 @@ int32_t main(int32_t argc, char *argv[])
if (!g_use_ltran) {
g_gazelle_dfx_tbl[GAZELLE_STAT_LSTACK_SHOW].recv_size = sizeof(struct gazelle_stack_dfx_data);
- g_gazelle_dfx_tbl[GAZELLE_STAT_LTRAN_START_LATENCY].recv_size =sizeof(struct gazelle_stack_dfx_data);
- g_gazelle_dfx_tbl[GAZELLE_STAT_LTRAN_STOP_LATENCY].recv_size =sizeof(struct gazelle_stack_dfx_data);
ret = check_cmd_support(req_msg, req_msg_num);
if (ret < 0) {
return -1;
--
1.8.3.1

View File

@ -1,217 +0,0 @@
From ce1cdc5e656596b1b70171481a8ce5d523c0b20f Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Wed, 16 Mar 2022 17:30:25 +0800
Subject: [PATCH 29/34] fix code check
---
src/common/dpdk_common.h | 1 -
src/lstack/core/lstack_cfg.c | 30 ++++++------------------------
src/lstack/core/lstack_dpdk.c | 5 +++--
src/lstack/core/lstack_lwip.c | 3 +--
src/lstack/core/lstack_protocol_stack.c | 4 ++--
src/lstack/netif/lstack_ethdev.c | 4 ++--
src/lstack/netif/lstack_vdev.c | 2 +-
src/ltran/ltran_dfx.c | 4 ++--
src/ltran/ltran_forward.c | 1 +
9 files changed, 18 insertions(+), 36 deletions(-)
diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h
index 6137bcb..595e85f 100644
--- a/src/common/dpdk_common.h
+++ b/src/common/dpdk_common.h
@@ -40,7 +40,6 @@ static __rte_always_inline void copy_mbuf(struct rte_mbuf *dst, struct rte_mbuf
uint8_t *dst_data = rte_pktmbuf_mtod(dst, void*);
uint8_t *src_data = rte_pktmbuf_mtod(src, void*);
-
rte_memcpy(dst_data, src_data, data_len);
// copy private date.
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
index ca25b58..53712a8 100644
--- a/src/lstack/core/lstack_cfg.c
+++ b/src/lstack/core/lstack_cfg.c
@@ -269,25 +269,7 @@ static int32_t numa_to_cpusnum(unsigned socket_id, uint32_t *cpulist, int32_t nu
return -1;
}
- int32_t count = 0;
- char *elem = strtok(strbuf, "-");
- while (elem && count < num) {
- while (elem && isspace(*elem)) {
- elem++;
- }
- if (elem == NULL) {
- LSTACK_LOG(ERR, LSTACK, "parse %s failed\n", path);
- return -1;
- }
- cpulist[count++] = (uint32_t)strtol(elem, NULL, 10); // 10 : decimal
-
- if (count % 2 == 0) { // 2 : even
- elem = strtok(NULL, "-");
- } else {
- elem = strtok(NULL, ",");
- }
- }
-
+ int32_t count = separate_str_to_array(strbuf, cpulist, num);
return count;
}
@@ -644,8 +626,6 @@ static int32_t parse_weakup_cpu_number(void)
const config_setting_t *cfg_args = NULL;
const char *args = NULL;
- int32_t ret;
-
g_config_params.num_wakeup = 0;
cfg_args = config_lookup(&g_config, "num_wakeup");
@@ -658,11 +638,13 @@ static int32_t parse_weakup_cpu_number(void)
return 0;
}
- ret = turn_str_to_array((char *)args, g_config_params.weakup, CFG_MAX_CPUS);
- if (ret <= 0) {
+ char *tmp_arg = strdup(args);
+ int32_t cnt = separate_str_to_array(tmp_arg, g_config_params.weakup, CFG_MAX_CPUS);
+ free(tmp_arg);
+ if (cnt <= 0 || cnt > CFG_MAX_CPUS) {
return -EINVAL;
}
- g_config_params.num_wakeup = (uint16_t)ret;
+ g_config_params.num_wakeup = cnt;
return 0;
}
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index fb0e988..430c6e5 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -223,6 +223,7 @@ int32_t create_shared_ring(struct protocol_stack *stack)
if (stack->send_idle_ring == NULL) {
return -1;
}
+ stack->in_replenish = 0;
if (use_ltran()) {
stack->rx_ring = create_ring("RING_RX", VDEV_RX_QUEUE_SZ, RING_F_SP_ENQ | RING_F_SC_DEQ, stack->queue_id);
@@ -255,7 +256,7 @@ int32_t fill_mbuf_to_ring(struct rte_mempool *mempool, struct rte_ring *ring, ui
while (remain > 0) {
batch = LWIP_MIN(remain, FREE_RX_QUEUE_SZ);
- ret = gazelle_alloc_pktmbuf(mempool, free_buf, batch);
+ ret = gazelle_alloc_pktmbuf(mempool, free_buf, batch);
if (ret != 0) {
LSTACK_LOG(ERR, LSTACK, "cannot alloc mbuf for ring, count: %d ret=%d\n", (int32_t)batch, ret);
return -1;
@@ -339,7 +340,7 @@ static int eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_inf
if (rx_ol_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) {
#if CHECKSUM_CHECK_IP_HW
rx_ol |= DEV_RX_OFFLOAD_IPV4_CKSUM;
- LSTACK_LOG(INFO, LSTACK, "DEV_RX_OFFLOAD_IPV4_CKSUM\n");
+ LSTACK_LOG(INFO, LSTACK, "DEV_RX_OFFLOAD_IPV4_CKSUM\n");
#endif
}
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index d35a217..636840f 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -184,7 +184,6 @@ int32_t gazelle_alloc_pktmbuf(struct rte_mempool *pool, struct rte_mbuf **mbufs,
return ret;
}
-
for (uint32_t i = 0; i < num; i++) {
pbuf_custom = mbuf_to_pbuf(mbufs[i]);
pbuf_custom->custom_free_function = gazelle_free_pbuf;
@@ -216,7 +215,7 @@ void stack_replenish_send_idlembuf(struct protocol_stack *stack)
uint32_t replenish_cnt = rte_ring_free_count(stack->send_idle_ring);
for (uint32_t i = 0; i < replenish_cnt; i++) {
- struct pbuf *pbuf = lwip_alloc_pbuf(PBUF_TRANSPORT, MAX_PACKET_SZ - PBUF_TRANSPORT, PBUF_RAM);
+ struct pbuf *pbuf = lwip_alloc_pbuf(PBUF_TRANSPORT, MAX_PACKET_SZ - PBUF_TRANSPORT, PBUF_RAM);
if (pbuf == NULL) {
break;
}
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 4ba851a..e297f7e 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -686,8 +686,8 @@ void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack
if (cur_stack == stack) {
continue;
}
-
- ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, &mbuf_copy, 1);
+
+ ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, &mbuf_copy, 1);
if (ret != 0) {
return;
}
diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c
index c428bca..9cb9cb0 100644
--- a/src/lstack/netif/lstack_ethdev.c
+++ b/src/lstack/netif/lstack_ethdev.c
@@ -45,7 +45,7 @@ void eth_dev_recv(struct rte_mbuf *mbuf)
len = (uint16_t)rte_pktmbuf_pkt_len(m);
payload = rte_pktmbuf_mtod(m, void *);
pc = mbuf_to_pbuf(m);
- pc->custom_free_function = gazelle_free_pbuf;
+ pc->custom_free_function = gazelle_free_pbuf;
next = pbuf_alloced_custom(PBUF_RAW, (uint16_t)len, PBUF_RAM, pc, payload, (uint16_t)len);
if (next == NULL) {
stack->stats.rx_allocmbuf_fail++;
@@ -139,7 +139,7 @@ static err_t eth_dev_output(struct netif *netif, struct pbuf *pbuf)
stack->stats.tx += sent_pkts;
if (sent_pkts < 1) {
stack->stats.tx_drop++;
- rte_pktmbuf_free(mbuf);
+ rte_pktmbuf_free(mbuf);
return ERR_MEM;
}
diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c
index a2f89fa..57d3bce 100644
--- a/src/lstack/netif/lstack_vdev.c
+++ b/src/lstack/netif/lstack_vdev.c
@@ -47,7 +47,7 @@ static uint32_t ltran_rx_poll(struct protocol_stack *stack, struct rte_mbuf **pk
stack->rx_ring_used += rcvd_pkts;
if (unlikely(stack->rx_ring_used >= USED_RX_PKTS_WATERMARK)) {
uint32_t free_cnt = LWIP_MIN(stack->rx_ring_used, DPDK_PKT_BURST_SIZE);
- int32_t ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, (struct rte_mbuf **)free_buf, free_cnt);
+ int32_t ret = gazelle_alloc_pktmbuf(stack->rx_pktmbuf_pool, (struct rte_mbuf **)free_buf, free_cnt);
if (likely(ret == 0)) {
nr_pkts = rte_ring_en_enqueue_bulk(stack->rx_ring, (void **)free_buf, free_cnt);
stack->rx_ring_used -= nr_pkts;
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index 3baa017..8db5791 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -111,8 +111,8 @@ static pid_t ltran_process_exist(void)
char line[LINE];
FILE *cmd = popen("pidof ltran", "r");
- if(fgets(line, LINE, cmd) == NULL) {
- return 0;
+ if (fgets(line, LINE, cmd) == NULL) {
+ return 0;
}
pid_t pid = strtoul(line, NULL, BASE_DEC_SCALE);
diff --git a/src/ltran/ltran_forward.c b/src/ltran/ltran_forward.c
index 9d1188e..b264ad3 100644
--- a/src/ltran/ltran_forward.c
+++ b/src/ltran/ltran_forward.c
@@ -82,6 +82,7 @@ static __rte_always_inline void flush_rx_mbuf(struct gazelle_stack *stack, struc
calculate_ltran_latency(stack, src);
}
rte_pktmbuf_free(src);
+ src = NULL;
}
static __rte_always_inline void backup_bufs_enque_rx_ring(struct gazelle_stack *stack)
--
1.8.3.1

View File

@ -1,120 +0,0 @@
From 2da25e25b9553dfc014faaf9a3ebb869454615fd Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Tue, 15 Mar 2022 22:55:09 +0800
Subject: [PATCH 30/34] fix accept init sock faile
---
src/lstack/core/lstack_lwip.c | 23 +++++++++++++++++++++--
src/lstack/core/lstack_protocol_stack.c | 29 ++++++++++++++++++-----------
src/lstack/include/lstack_lwip.h | 1 +
3 files changed, 40 insertions(+), 13 deletions(-)
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 636840f..9766a87 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -657,19 +657,38 @@ static inline void clone_lwip_socket_opt(struct lwip_sock *dst_sock, struct lwip
dst_sock->conn->flags = src_sock->conn->flags;
}
+int32_t gazelle_socket(int domain, int type, int protocol)
+{
+ int32_t fd = lwip_socket(AF_INET, SOCK_STREAM, 0);
+ if (fd < 0) {
+ return fd;
+ }
+
+ gazelle_init_sock(fd);
+
+ struct lwip_sock *sock = get_socket(fd);
+ if (sock == NULL || sock->stack == NULL) {
+ lwip_close(fd);
+ gazelle_clean_sock(fd);
+ posix_api->close_fn(fd);
+ return -1;
+ }
+
+ return fd;
+}
+
void create_shadow_fd(struct rpc_msg *msg)
{
int32_t fd = msg->args[MSG_ARG_0].i;
struct sockaddr *addr = msg->args[MSG_ARG_1].p;
socklen_t addr_len = msg->args[MSG_ARG_2].socklen;
- int32_t clone_fd = lwip_socket(AF_INET, SOCK_STREAM, 0);
+ int32_t clone_fd = gazelle_socket(AF_INET, SOCK_STREAM, 0);
if (clone_fd < 0) {
LSTACK_LOG(ERR, LSTACK, "clone socket failed clone_fd=%d errno=%d\n", clone_fd, errno);
msg->result = clone_fd;
return;
}
- gazelle_init_sock(clone_fd);
struct lwip_sock *sock = get_socket_by_fd(fd);
struct lwip_sock *clone_sock = get_socket_by_fd(clone_fd);
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index e297f7e..3193eeb 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -426,14 +426,10 @@ void stack_arp(struct rpc_msg *msg)
void stack_socket(struct rpc_msg *msg)
{
- int32_t fd = lwip_socket(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].i);
- msg->result = fd;
- if (fd < 0) {
- LSTACK_LOG(ERR, LSTACK, "tid %ld, %d socket failed\n", get_stack_tid(), fd);
- return;
+ msg->result = gazelle_socket(msg->args[MSG_ARG_0].i, msg->args[MSG_ARG_1].i, msg->args[MSG_ARG_2].i);
+ if (msg->result < 0) {
+ LSTACK_LOG(ERR, LSTACK, "tid %ld, %ld socket failed\n", get_stack_tid(), msg->result);
}
-
- gazelle_init_sock(fd);
}
static inline bool is_real_close(int32_t fd)
@@ -589,11 +585,22 @@ void stack_accept(struct rpc_msg *msg)
}
fd = sock->attach_fd;
- msg->result = lwip_accept(fd, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p);
- if (msg->result <= 0) {
- LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d attach_fd %d failed %ld\n", get_stack_tid(), msg->args[MSG_ARG_0].i,
- fd, msg->result);
+ int32_t accept_fd = lwip_accept(fd, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p);
+ if (accept_fd > 0) {
+ sock = get_socket(accept_fd);
+ if (sock && sock->stack) {
+ msg->result = accept_fd;
+ return;
+ }
+
+ lwip_close(accept_fd);
+ gazelle_clean_sock(accept_fd);
+ posix_api->close_fn(accept_fd);
}
+
+ LSTACK_LOG(ERR, LSTACK, "tid %ld, fd %d attach_fd %d failed %d\n", get_stack_tid(), msg->args[MSG_ARG_0].i,
+ fd, accept_fd);
+ msg->result = -1;
}
void stack_connect(struct rpc_msg *msg)
diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h
index 285095a..ffd3b80 100644
--- a/src/lstack/include/lstack_lwip.h
+++ b/src/lstack/include/lstack_lwip.h
@@ -26,6 +26,7 @@
void create_shadow_fd(struct rpc_msg *msg);
void listen_list_add_node(int32_t head_fd, int32_t add_fd);
void gazelle_init_sock(int32_t fd);
+int32_t gazelle_socket(int domain, int type, int protocol);
void gazelle_clean_sock(int32_t fd);
ssize_t write_lwip_data(struct lwip_sock *sock, int32_t fd, int32_t flags);
ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len);
--
1.8.3.1

View File

@ -1,153 +0,0 @@
From 40ac9666796bbc0cee5d52acfb14d6cc88a196b2 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Wed, 16 Mar 2022 11:02:45 +0800
Subject: [PATCH 31/34] fix reuse ip listen event don't notice
---
src/lstack/api/lstack_epoll.c | 61 +++++++++++++++++++++++--------------------
1 file changed, 33 insertions(+), 28 deletions(-)
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index 1f0aea8..e54d496 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -78,11 +78,6 @@ void add_epoll_event(struct netconn *conn, uint32_t event)
event = EPOLLRDHUP | EPOLLIN | EPOLLERR;
}
- /* shadow_fd event notice listen_fd */
- if (sock->shadowed_sock) {
- sock = sock->shadowed_sock;
- }
-
if ((event & sock->epoll_events) == 0) {
return;
}
@@ -111,14 +106,9 @@ static void raise_pending_events(struct lwip_sock *sock)
return;
}
- struct lwip_sock *attach_sock = NULL;
- if (sock->attach_fd > 0 && sock->attach_fd != conn->socket) {
- attach_sock = get_socket_by_fd(sock->attach_fd);
- if (attach_sock == NULL) {
- return;
- }
- } else {
- attach_sock = sock;
+ struct lwip_sock *attach_sock = (sock->attach_fd > 0) ? get_socket_by_fd(sock->attach_fd) : sock;
+ if (attach_sock == NULL) {
+ return;
}
conn = attach_sock->conn;
@@ -144,20 +134,20 @@ static void raise_pending_events(struct lwip_sock *sock)
}
}
- if (sock->errevent > 0) {
+ if (attach_sock->errevent > 0) {
event |= POLLERR | POLLIN;
}
if (event == 0) {
return;
}
- sock->events |= event;
+ attach_sock->events |= event;
if (rte_ring_mp_enqueue(wakeup->event_ring, (void *)sock) == 0 ||
rte_ring_mp_enqueue(wakeup->self_ring, (void *)sock) == 0) {
sem_post(&wakeup->event_sem);
stack->stats.epoll_pending++;
} else {
- rpc_call_addevent(stack, sock);
+ rpc_call_addevent(stack, attach_sock);
stack->stats.epoll_pending_call++;
}
}
@@ -260,13 +250,14 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even
return 0;
}
-static inline int32_t save_poll_event(struct pollfd *fds, uint32_t maxevents, struct lwip_sock *sock, int32_t event_num)
+static inline int32_t save_poll_event(struct pollfd *fds, uint32_t maxevents, int32_t fd, uint32_t events)
{
+ int32_t event_num = 0;
for (uint32_t i = 0; i < maxevents; i++) {
/* fds[i].revents != 0, the events is kernel events */
- if (fds[i].fd == sock->conn->socket && fds[i].revents == 0) {
- fds[i].revents = sock->events;
- event_num++;
+ if (fds[i].fd == fd && fds[i].revents == 0) {
+ fds[i].revents = events;
+ event_num = 1;
break;
}
}
@@ -274,7 +265,8 @@ static inline int32_t save_poll_event(struct pollfd *fds, uint32_t maxevents, st
return event_num;
}
-static bool remove_event(enum POLL_TYPE etype, struct lwip_sock **sock_list, int32_t event_num, struct lwip_sock *sock)
+static bool remove_event(enum POLL_TYPE etype, struct lwip_sock **sock_list, int32_t event_num, struct lwip_sock *sock,
+ struct lwip_sock *attach_sock)
{
/* remove duplicate event */
for (uint32_t i = 0; i < event_num && etype == TYPE_EPOLL; i++) {
@@ -283,7 +275,7 @@ static bool remove_event(enum POLL_TYPE etype, struct lwip_sock **sock_list, int
}
}
- return !check_event_vaild(sock, sock->events);
+ return !check_event_vaild(attach_sock, attach_sock->events);
}
static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t maxevents, enum POLL_TYPE etype)
@@ -302,25 +294,38 @@ static int32_t get_lwip_events(struct weakup_poll *weakup, void *out, uint32_t m
rte_ring_sc_dequeue(weakup->event_ring, (void **)&sock)) {
break;
}
- /* close sock */
+ __atomic_store_n(&sock->have_event, false, __ATOMIC_RELEASE);
+
+ /* sock->stack == NULL mean close sock */
if (sock->stack == NULL) {
continue;
}
- __atomic_store_n(&sock->have_event, false, __ATOMIC_RELEASE);
- if (remove_event(etype, weakup->sock_list, event_num, sock)) {
+ /* attach listen is empty, all event in attached listen. attached listen attach_fd is self */
+ struct lwip_sock *attach_sock = (sock->attach_fd > 0) ? get_socket(sock->attach_fd) : sock;
+ if (attach_sock == NULL) {
+ continue;
+ }
+
+ if (remove_event(etype, weakup->sock_list, event_num, sock, attach_sock)) {
sock->stack->stats.remove_event++;
continue;
}
if (etype == TYPE_EPOLL) {
- events[event_num].events = sock->events;
+ events[event_num].events = attach_sock->events;
events[event_num].data = sock->ep_data;
weakup->sock_list[event_num] = sock;
event_num++;
} else {
- /* save one event at a time */
- event_num = save_poll_event(fds, maxevents, sock, event_num);
+ /* shadow_fd event notice listen_fd */
+ if (attach_sock->shadowed_sock) {
+ attach_sock = attach_sock->shadowed_sock;
+ }
+
+ if (sock->conn) {
+ event_num += save_poll_event(fds, maxevents, sock->conn->socket, attach_sock->events);
+ }
}
sock->stack->stats.app_events++;
--
1.8.3.1

View File

@ -1,24 +0,0 @@
From cb29e0124945480fc8e017dfd426926ddfebd754 Mon Sep 17 00:00:00 2001
From: jinag12 <jiangheng12@huawei.com>
Date: Wed, 16 Mar 2022 11:12:17 +0000
Subject: [PATCH 32/34] modify readme to add constraint
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index f2a933c..e914b26 100644
--- a/README.md
+++ b/README.md
@@ -252,6 +252,7 @@ Usage: gazellectl [-h | help]
- 虚拟机网卡不支持多队列。
- 不使用ltran模式kni网口只支持本地通讯使用且需要启动前配置NetworkManager不管理kni网卡
- 虚拟kni网口的ip及mac地址需要与lstack配置文件保持一致
+- gazelle运行过程中不允许删除运行文件如果删除需要重启gazelle
## Security risk note
gazelle有如下安全风险用户需要评估使用场景风险
--
1.8.3.1

View File

@ -1,75 +0,0 @@
From 40531107531c4891defa71f899cbe96d30db9c6e Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Wed, 16 Mar 2022 16:05:46 +0800
Subject: [PATCH 33/34] fix accept check remain conn
---
src/lstack/core/lstack_protocol_stack.c | 27 +++++++++++++--------------
1 file changed, 13 insertions(+), 14 deletions(-)
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 3193eeb..4a46044 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -577,17 +577,9 @@ void stack_accept(struct rpc_msg *msg)
{
int32_t fd = msg->args[MSG_ARG_0].i;
- /* listen sock attach_fd is self */
- struct lwip_sock *sock = get_socket(fd);
- if (sock == NULL) {
- msg->result = -1;
- return;
- }
- fd = sock->attach_fd;
-
int32_t accept_fd = lwip_accept(fd, msg->args[MSG_ARG_1].p, msg->args[MSG_ARG_2].p);
if (accept_fd > 0) {
- sock = get_socket(accept_fd);
+ struct lwip_sock *sock = get_socket(accept_fd);
if (sock && sock->stack) {
msg->result = accept_fd;
return;
@@ -773,13 +765,19 @@ int32_t stack_broadcast_listen(int32_t fd, int32_t backlog)
/* ergodic the protocol stack thread to find the connection, because all threads are listening */
int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *addrlen)
{
- struct lwip_sock *min_sock = NULL;
+ struct lwip_sock *sock = get_socket(fd);
+ if (sock == NULL) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ fd = sock->attach_fd;
int32_t head_fd = fd;
- int32_t min_fd = fd;
- int32_t ret = -1;
+ struct lwip_sock *min_sock = NULL;
+ int32_t min_fd = fd;
while (fd > 0) {
- struct lwip_sock *sock = get_socket(fd);
+ sock = get_socket(fd);
if (sock == NULL) {
GAZELLE_RETURN(EINVAL);
}
@@ -797,13 +795,14 @@ int32_t stack_broadcast_accept(int32_t fd, struct sockaddr *addr, socklen_t *add
fd = sock->nextfd;
}
+ int32_t ret = -1;
if (min_sock) {
ret = rpc_call_accept(min_fd, addr, addrlen);
}
- struct lwip_sock *sock = get_socket(head_fd);
if (have_accept_event(head_fd)) {
add_self_event(sock, EPOLLIN);
+ sock = get_socket(head_fd);
sock->stack->stats.accept_events++;
}
--
1.8.3.1

View File

@ -1,59 +0,0 @@
From e991d6a693af629e466f549cdd322ac11fc80f2e Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Wed, 16 Mar 2022 21:40:01 +0800
Subject: [PATCH 34/34] fix wakeup list dead loop
---
src/lstack/core/lstack_lwip.c | 1 -
src/lstack/core/lstack_protocol_stack.c | 3 ++-
src/lstack/include/lstack_weakup.h | 3 ++-
3 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 9766a87..7bab92f 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -130,7 +130,6 @@ void gazelle_clean_sock(int32_t fd)
list_del_node_init(&sock->attach_list);
list_del_node_init(&sock->listen_list);
list_del_node_init(&sock->event_list);
- list_del_node_init(&sock->wakeup_list);
list_del_node_init(&sock->send_list);
}
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 4a46044..1de546d 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -343,7 +343,8 @@ static void send_stack_list(struct protocol_stack *stack)
list_for_each_safe(node, temp, list) {
sock = container_of(node, struct lwip_sock, send_list);
- if (sock->conn == NULL) {
+ if (sock->conn == NULL || sock->stack == NULL) {
+ list_del_node_init(&sock->send_list);
continue;
}
diff --git a/src/lstack/include/lstack_weakup.h b/src/lstack/include/lstack_weakup.h
index b051b72..77f3b9d 100644
--- a/src/lstack/include/lstack_weakup.h
+++ b/src/lstack/include/lstack_weakup.h
@@ -37,12 +37,13 @@ static inline void wakeup_list_sock(struct list_node *wakeup_list)
struct weakup_poll *weakup = sock->weakup;
struct protocol_stack *stack = sock->stack;
if (weakup == NULL || stack == NULL) {
+ list_del_node_init(&sock->wakeup_list);
continue;
}
int32_t ret = rte_ring_mp_enqueue(weakup->event_ring, (void *)sock);
if (ret == 0) {
- list_del_node_init(&sock->event_list);
+ list_del_node_init(&sock->wakeup_list);
sem_post(&weakup->event_sem);
stack->stats.lwip_events++;
} else {
--
1.8.3.1

View File

@ -1,27 +0,0 @@
From 35c5052da432255f3756d5bdc46c67597545908a Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Thu, 17 Mar 2022 16:10:51 +0800
Subject: [PATCH] add check for stack params
---
src/lstack/core/lstack_thread_rpc.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index c95f2c0..2a67333 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -29,6 +29,10 @@ struct rpc_msg *rpc_msg_alloc(struct protocol_stack *stack, rpc_msg_func func)
int32_t ret;
struct rpc_msg *msg = NULL;
+ if (stack == NULL) {
+ return NULL;
+ }
+
ret = rte_mempool_get(stack->rpc_pool, (void **)&msg);
if (ret < 0) {
get_protocol_stack_group()->call_alloc_fail++;
--
1.8.3.1

View File

@ -1,50 +0,0 @@
From 6b05f21de47d2e3a49e6d99ee8a6af773266f117 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Fri, 18 Mar 2022 14:54:37 +0800
Subject: [PATCH] the sending of sock last data is triggered by lstack
---
src/lstack/core/lstack_lwip.c | 5 +++--
src/lstack/core/lstack_protocol_stack.c | 3 ++-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 7bab92f..b4d75d2 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -214,7 +214,7 @@ void stack_replenish_send_idlembuf(struct protocol_stack *stack)
uint32_t replenish_cnt = rte_ring_free_count(stack->send_idle_ring);
for (uint32_t i = 0; i < replenish_cnt; i++) {
- struct pbuf *pbuf = lwip_alloc_pbuf(PBUF_TRANSPORT, MAX_PACKET_SZ - PBUF_TRANSPORT, PBUF_RAM);
+ struct pbuf *pbuf = lwip_alloc_pbuf(PBUF_TRANSPORT, TCP_MSS, PBUF_RAM);
if (pbuf == NULL) {
break;
}
@@ -361,7 +361,8 @@ void stack_send(struct rpc_msg *msg)
msg->result = write_lwip_data(sock, fd, flags);
__atomic_store_n(&sock->have_rpc_send, false, __ATOMIC_RELEASE);
- if (msg->result >= 0 && rte_ring_count(sock->send_ring)) {
+ if (msg->result >= 0 &&
+ (rte_ring_count(sock->send_ring) || sock->send_lastdata)) {
if (list_is_empty(&sock->send_list)) {
__atomic_store_n(&sock->have_rpc_send, true, __ATOMIC_RELEASE);
list_add_node(&stack->send_list, &sock->send_list);
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 1de546d..e5761a4 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -350,7 +350,8 @@ static void send_stack_list(struct protocol_stack *stack)
ssize_t ret = write_lwip_data(sock, sock->conn->socket, sock->send_flags);
__atomic_store_n(&sock->have_rpc_send, false, __ATOMIC_RELEASE);
- if (ret >= 0 && rte_ring_count(sock->send_ring)) {
+ if (ret >= 0 &&
+ (rte_ring_count(sock->send_ring) || sock->send_lastdata)) {
__atomic_store_n(&sock->have_rpc_send, true, __ATOMIC_RELEASE);
} else {
list_del_node_init(&sock->send_list);
--
1.8.3.1

View File

@ -1,25 +0,0 @@
From 0a62cc1547009c6e382c08d7e99c8727201dd56a Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Mon, 21 Mar 2022 09:50:49 +0800
Subject: [PATCH] addd gazellectl lstack constraint
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index e914b26..eef6362 100644
--- a/README.md
+++ b/README.md
@@ -199,7 +199,7 @@ redis-server redis.conf
liblstack.so编译进应用程序后wrap网络编程标准接口应用程序无需修改代码。
### 9. gazellectl
-- 不使用ltran模式时不支持gazellectl ltran xxx 命令
+- 不使用ltran模式时不支持gazellectl ltran xxx命令以及-r, rate命令
```
Usage: gazellectl [-h | help]
or: gazellectl ltran {quit | show} [LTRAN_OPTIONS] [time]
--
1.8.3.1

File diff suppressed because it is too large Load Diff

View File

@ -1,91 +0,0 @@
From 5c3c268268e30ca494c6ceb154dbc67b3df2dce5 Mon Sep 17 00:00:00 2001
From: colordev <colordev@hotmail.com>
Date: Thu, 19 May 2022 12:30:12 +0800
Subject: [PATCH] update license lockless queue
---
...Third_Party_Open_Source_Software_Notice.md | 36 ++++++++++++++++---
src/lstack/include/lstack_lockless_queue.h | 10 +-----
2 files changed, 32 insertions(+), 14 deletions(-)
diff --git a/License/Third_Party_Open_Source_Software_Notice.md b/License/Third_Party_Open_Source_Software_Notice.md
index 8812524..325cdbe 100644
--- a/License/Third_Party_Open_Source_Software_Notice.md
+++ b/License/Third_Party_Open_Source_Software_Notice.md
@@ -129,7 +129,7 @@ lwIP is freely available under a BSD license.
*
*/
- **Software:** libpcap 1.9.1
+**Software:** libpcap 1.9.1
**Copyright notice:**
@@ -153,9 +153,9 @@ THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- **Software:** libconfig 1.7.2
+**Software:** libconfig 1.7.2
- **Copyright notice:**
+**Copyright notice:**
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
@@ -681,5 +681,31 @@ Author: Andi Kleen, SUSE Labs
Version 2.0.0 by Cliff Wickman (cpw@sgi.com), Christoph Lameter (clameter@sgi.com) and Lee Schermerhorn (lee.schermerhorn@hp.com).
- **Copyright notice:**
- Please see above.
+**Copyright notice:**
+Please see above.
+
+**Software:** lockless queue
+
+**License:**
+Copyright (c) 2010-2011 Dmitry Vyukov. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice, this list of
+
+ conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list
+
+ of conditions and the following disclaimer in the documentation and/or other materials
+
+ provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY DMITRY VYUKOV "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DMITRY VYUKOV OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Dmitry Vyukov.
+
+If not stated otherwise, all non-source-code text and images on this site are provided under the terms of the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. Source code is covered by the Simplified BSD License and by Apache License, Version 2.0. The opinions expressed on this site are my own and do not necessarily reflect the views of Google.
+
+**Copyright notice:**
+Please see above.
diff --git a/src/lstack/include/lstack_lockless_queue.h b/src/lstack/include/lstack_lockless_queue.h
index c70b56a..c00d3a2 100644
--- a/src/lstack/include/lstack_lockless_queue.h
+++ b/src/lstack/include/lstack_lockless_queue.h
@@ -1,13 +1,5 @@
/*
-* 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.
+* Copyright (c) 2010-2011 Dmitry Vyukov. All rights reserved.
*/
#ifndef __GAZELLE_LOCKLESS_QUEUE_H__
--
2.27.0

View File

@ -1,35 +0,0 @@
From 912ac954d0f462418bb09d2ad91e7092d5ad37be Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Tue, 19 Apr 2022 19:10:10 +0800
Subject: [PATCH 01/18] fix sock invalid address
sockets pointer is allocated memory in gazelle_network_init().
if invoke select_path before sockets pointer be initialized, sock is invalid
---
src/lstack/api/lstack_wrap.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c
index 6ee5639..0164069 100644
--- a/src/lstack/api/lstack_wrap.c
+++ b/src/lstack/api/lstack_wrap.c
@@ -52,10 +52,15 @@ static inline enum KERNEL_LWIP_PATH select_path(int fd)
}
return PATH_KERNEL;
}
+
+ if (unlikely(posix_api->is_chld)) {
+ return PATH_KERNEL;
+ }
+
struct lwip_sock *sock = posix_api->get_socket(fd);
/* AF_UNIX case */
- if (!sock || unlikely(posix_api->is_chld)) {
+ if (!sock) {
return PATH_KERNEL;
}
--
2.23.0

View File

@ -1,70 +0,0 @@
From 336703252c327d82f49d40f79b1d1e4e65a9281e Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Tue, 19 Apr 2022 19:49:06 +0800
Subject: [PATCH 02/18] exit lstack process after ltran instance logout
close fd is to notify ltran to execute the lstack instance logout.
200ms is an empirical value of instance logout.
---
src/lstack/api/lstack_signal.c | 4 +++-
src/lstack/core/lstack_control_plane.c | 9 +++++++++
src/lstack/include/lstack_control_plane.h | 1 +
3 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/src/lstack/api/lstack_signal.c b/src/lstack/api/lstack_signal.c
index f4763e8..87cbdda 100644
--- a/src/lstack/api/lstack_signal.c
+++ b/src/lstack/api/lstack_signal.c
@@ -19,8 +19,9 @@
#include <lwip/posix_api.h>
#include "lstack_log.h"
+#include "lstack_control_plane.h"
-static int g_hijack_signal[] = { SIGTERM, SIGINT, SIGSEGV, SIGBUS, SIGFPE, SIGILL };
+static int g_hijack_signal[] = { SIGTERM, SIGINT, SIGSEGV, SIGBUS, SIGFPE, SIGILL, SIGKILL};
#define HIJACK_SIGNAL_COUNT (sizeof(g_hijack_signal) / sizeof(g_hijack_signal[0]))
#define BACKTRACE_SIZE 64
static void dump_stack(void)
@@ -54,6 +55,7 @@ static inline bool match_hijack_signal(int sig)
static void lstack_sig_default_handler(int sig)
{
LSTACK_LOG(ERR, LSTACK, "lstack dumpedcaught signal%d\n", sig);
+ control_fd_close();
dump_stack();
lwip_exit();
(void)kill(getpid(), sig);
diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c
index c782d51..01b2ff0 100644
--- a/src/lstack/core/lstack_control_plane.c
+++ b/src/lstack/core/lstack_control_plane.c
@@ -446,6 +446,15 @@ int32_t client_reg_thrd_ring(void)
return 0;
}
+void control_fd_close(void)
+{
+ if (g_data_fd != 0) {
+ close(g_data_fd);
+ /* 200ms: wait ltran instance logout */
+ rte_delay_ms(200);
+ }
+}
+
int32_t control_init_client(bool is_reconnect)
{
int32_t ret;
diff --git a/src/lstack/include/lstack_control_plane.h b/src/lstack/include/lstack_control_plane.h
index 0af891a..1fa84e6 100644
--- a/src/lstack/include/lstack_control_plane.h
+++ b/src/lstack/include/lstack_control_plane.h
@@ -32,5 +32,6 @@ void control_server_thread(void *arg);
bool get_register_state(void);
void thread_register_phase1(struct rpc_msg *msg);
void thread_register_phase2(struct rpc_msg *msg);
+void control_fd_close(void);
#endif /* GAZELLE_CONTROL_PLANE_H */
--
2.23.0

View File

@ -1,78 +0,0 @@
From 900685bd99e25f832c4aeac202dfb7d5f5075833 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Tue, 19 Apr 2022 20:01:34 +0800
Subject: [PATCH 03/18] use atomic variales to count
name_tick and pool_index are shared by mutiple threads.
atomic variables are required.
---
src/lstack/core/lstack_lwip.c | 9 +++++----
src/lstack/core/lstack_thread_rpc.c | 3 ++-
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 887464d..4143f2f 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -11,6 +11,7 @@
*/
#include <sys/types.h>
+#include <stdatomic.h>
#include <lwip/sockets.h>
#include <lwip/tcp.h>
#include <lwipsock.h>
@@ -138,25 +139,25 @@ void gazelle_init_sock(int32_t fd)
reset_sock_data(sock);
- sock->recv_ring = create_ring("sock_recv", SOCK_RECV_RING_SIZE, 0, name_tick++);
+ sock->recv_ring = create_ring("sock_recv", SOCK_RECV_RING_SIZE, 0, atomic_fetch_add(&name_tick, 1));
if (sock->recv_ring == NULL) {
LSTACK_LOG(ERR, LSTACK, "sock_recv create failed. errno: %d.\n", rte_errno);
return;
}
- sock->recv_wait_free = create_ring("wait_free", SOCK_RECV_RING_SIZE, 0, name_tick++);
+ sock->recv_wait_free = create_ring("wait_free", SOCK_RECV_RING_SIZE, 0, atomic_fecth_add(&name_tick, 1));
if (sock->recv_wait_free == NULL) {
LSTACK_LOG(ERR, LSTACK, "wait_free create failed. errno: %d.\n", rte_errno);
return;
}
- sock->send_ring = create_ring("sock_send", SOCK_SEND_RING_SIZE, 0, name_tick++);
+ sock->send_ring = create_ring("sock_send", SOCK_SEND_RING_SIZE, 0, atomic_fecth_add(&name_tick, 1));
if (sock->send_ring == NULL) {
LSTACK_LOG(ERR, LSTACK, "sock_send create failed. errno: %d.\n", rte_errno);
return;
}
- sock->send_idle_ring = create_ring("idle_send", SOCK_SEND_RING_SIZE, 0, name_tick++);
+ sock->send_idle_ring = create_ring("idle_send", SOCK_SEND_RING_SIZE, 0, atomic_fetch_add(&name_tick, 1));
if (sock->send_idle_ring == NULL) {
LSTACK_LOG(ERR, LSTACK, "idle_send create failed. errno: %d.\n", rte_errno);
return;
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index 26725f7..312e192 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -10,6 +10,7 @@
* See the Mulan PSL v2 for more details.
*/
#include <sys/types.h>
+#include <stdatomic.h>
#include <lwip/sockets.h>
#include <lwipsock.h>
#include <rte_mempool.h>
@@ -36,7 +37,7 @@ struct rpc_msg *rpc_msg_alloc(struct protocol_stack *stack, rpc_msg_func func)
static uint16_t pool_index = 0;
if (rpc_pool == NULL) {
- rpc_pool = create_rpc_mempool("rpc_msg", pool_index++);
+ rpc_pool = create_rpc_mempool("rpc_msg", atomic_fetch_add(&pool_index, 1));
if (rpc_pool == NULL) {
return NULL;
}
--
2.23.0

View File

@ -1,45 +0,0 @@
From 7f4143cd462cba5499cda0434fedd498c0967623 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng12@huawei.com>
Date: Tue, 19 Apr 2022 21:28:00 +0800
Subject: [PATCH 04/18] re-arrange the program to invoke rte_eth_dev_start
before rss_setup
in rss_setup(), the program invokes rte_eth_dev_rss_reta_update().
this API should be invoked after rte_eth_dev_start().
---
src/lstack/core/lstack_dpdk.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index 3f446ea..a5b2ddc 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -495,6 +495,12 @@ int32_t dpdk_ethdev_init(void)
return ret;
}
+ ret = dpdk_ethdev_start();
+ if (ret < 0) {
+ LSTACK_LOG(ERR, LSTACK, "dpdk_ethdev_start failed\n");
+ return ret;
+ }
+
if (rss_enable) {
rss_setup(port_id, nb_queues);
}
@@ -604,12 +610,6 @@ int32_t init_dpdk_ethdev(void)
return -1;
}
- ret = dpdk_ethdev_start();
- if (ret < 0) {
- LSTACK_LOG(ERR, LSTACK, "dpdk_ethdev_start failed\n");
- return -1;
- }
-
if (get_global_cfg_params()->kni_switch) {
ret = dpdk_init_lstack_kni();
if (ret < 0) {
--
2.23.0

View File

@ -1,183 +0,0 @@
From f3059a5a1e2fcf5b7bfa2ad50865598f79eccf16 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Thu, 21 Apr 2022 15:24:20 +0800
Subject: [PATCH 05/18] delete redundant file
---
src/lstack/include/lstack_lstack.h | 32 --------
src/lstack/include/lstack_weakup.h | 124 -----------------------------
2 files changed, 156 deletions(-)
delete mode 100644 src/lstack/include/lstack_lstack.h
delete mode 100644 src/lstack/include/lstack_weakup.h
diff --git a/src/lstack/include/lstack_lstack.h b/src/lstack/include/lstack_lstack.h
deleted file mode 100644
index c2e6733..0000000
--- a/src/lstack/include/lstack_lstack.h
+++ /dev/null
@@ -1,32 +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.
-*/
-
-#ifndef _LSTACK_H
-#define _LSTACK_H
-
-#if defined __GNUC__
-#define LSTACK_EXPORT_SYMBOL __attribute__((visibility("default")))
-
-#elif defined(_MSC_VER)
-#define LSTACK_EXPORT_SYMBOL extern __declspec(dllexport)
-
-#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
-#define LSTACK_EXPORT_SYMBOL __global
-
-#else
-#define LSTACK_EXPORT_SYMBOL /* unknown compiler */
-#endif
-
-/* Return string describing version of currently running lstack. */
-LSTACK_EXPORT_SYMBOL const char *get_lstack_version(void);
-
-#endif /* lstack.h */
diff --git a/src/lstack/include/lstack_weakup.h b/src/lstack/include/lstack_weakup.h
deleted file mode 100644
index 77f3b9d..0000000
--- a/src/lstack/include/lstack_weakup.h
+++ /dev/null
@@ -1,124 +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.
-*/
-
-#ifndef __GAZELLE_WEAKUP_THREAD_H__
-#define __GAZELLE_WEAKUP_THREAD_H__
-
-#include <rte_ring.h>
-#include "lstack_dpdk.h"
-
-#define EPOLL_MAX_EVENTS 512
-
-struct weakup_poll {
- sem_t event_sem;
- struct lwip_sock *sock_list[EPOLL_MAX_EVENTS];
- struct rte_ring *event_ring;
- struct rte_ring *self_ring;
-};
-
-#define WEAKUP_MAX (32)
-
-static inline void wakeup_list_sock(struct list_node *wakeup_list)
-{
- struct list_node *node, *temp;
-
- list_for_each_safe(node, temp, wakeup_list) {
- struct lwip_sock *sock = container_of(node, struct lwip_sock, wakeup_list);
-
- struct weakup_poll *weakup = sock->weakup;
- struct protocol_stack *stack = sock->stack;
- if (weakup == NULL || stack == NULL) {
- list_del_node_init(&sock->wakeup_list);
- continue;
- }
-
- int32_t ret = rte_ring_mp_enqueue(weakup->event_ring, (void *)sock);
- if (ret == 0) {
- list_del_node_init(&sock->wakeup_list);
- sem_post(&weakup->event_sem);
- stack->stats.lwip_events++;
- } else {
- break;
- }
- }
-}
-
-static inline int32_t weakup_attach_sock(struct list_node *attach_list)
-{
- struct list_node *node, *temp;
- int32_t wakeuped = -1;
-
- list_for_each_safe(node, temp, attach_list) {
- struct lwip_sock *sock = container_of(node, struct lwip_sock, attach_list);
-
- struct weakup_poll *weakup = sock->weakup;
- struct protocol_stack *stack = sock->stack;
- if (weakup == NULL || stack == NULL) {
- continue;
- }
-
- int32_t ret = rte_ring_mp_enqueue(weakup->event_ring, (void *)sock);
- if (ret == 0) {
- sem_post(&weakup->event_sem);
- stack->stats.lwip_events++;
- wakeuped = 0;
- }
- }
-
- return wakeuped;
-}
-
-static inline void weakup_thread(struct rte_ring *weakup_ring, struct list_node *wakeup_list)
-{
- struct lwip_sock *sock;
-
- for (uint32_t i = 0; i < WEAKUP_MAX; ++i) {
- int32_t ret = rte_ring_sc_dequeue(weakup_ring, (void **)&sock);
- if (ret != 0) {
- break;
- }
-
- struct weakup_poll *weakup = sock->weakup;
- struct protocol_stack *stack = sock->stack;
- if (weakup == NULL || stack == NULL) {
- continue;
- }
-
- ret = rte_ring_mp_enqueue(weakup->event_ring, (void *)sock);
- if (ret == 0) {
- sem_post(&weakup->event_sem);
- stack->stats.lwip_events++;
- }
-
- /* listen notice attach sock */
- int32_t wakeuped = -1;
- if (!list_is_empty(&sock->attach_list)) {
- wakeuped = weakup_attach_sock(&sock->attach_list);
- }
-
- /* notice any epoll enough */
- if (ret != 0 && wakeuped != 0) {
- if (list_is_empty(&sock->wakeup_list)) {
- list_add_node(wakeup_list, &sock->wakeup_list);
- }
- break;
- }
- }
-}
-
-static inline __attribute__((always_inline))
-int weakup_enqueue(struct rte_ring *weakup_ring, struct lwip_sock *sock)
-{
- return rte_ring_sp_enqueue(weakup_ring, (void *)sock);
-}
-
-#endif
--
2.23.0

View File

@ -1,297 +0,0 @@
From 625c01d808ffd9a21bcd5705b7237d00acd7ee66 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Thu, 21 Apr 2022 15:34:36 +0800
Subject: [PATCH 06/18] lstack:all exit move to init
---
src/lstack/core/lstack_control_plane.c | 5 +--
src/lstack/core/lstack_dpdk.c | 23 ++++++++------
src/lstack/core/lstack_init.c | 20 +++++++++++-
src/lstack/core/lstack_lwip.c | 4 +--
src/lstack/core/lstack_protocol_stack.c | 37 ++++++++++++----------
src/lstack/include/lstack_dpdk.h | 2 +-
src/lstack/include/lstack_protocol_stack.h | 4 ++-
7 files changed, 61 insertions(+), 34 deletions(-)
diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c
index 01b2ff0..13a2ed3 100644
--- a/src/lstack/core/lstack_control_plane.c
+++ b/src/lstack/core/lstack_control_plane.c
@@ -699,12 +699,13 @@ void control_server_thread(void *arg)
{
int32_t listenfd = control_init_server();
if (listenfd < 0) {
- LSTACK_EXIT(1, "control_init_server failed\n");
+ LSTACK_LOG(ERR, LSTACK, "control_init_server failed\n");
+ return;
}
int32_t epfd = init_epoll(listenfd);
if (epfd < 0) {
- LSTACK_EXIT(1, "init_epoll failed\n");
+ LSTACK_LOG(ERR, LSTACK, "control_init_server failed\n");
return;
}
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index a5b2ddc..aa91201 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -86,21 +86,26 @@ int32_t thread_affinity_init(int32_t cpu_id)
return 0;
}
-void dpdk_eal_init(void)
+int32_t dpdk_eal_init(void)
{
int32_t ret;
struct cfg_params *global_params = get_global_cfg_params();
ret = rte_eal_init(global_params->dpdk_argc, global_params->dpdk_argv);
if (ret < 0) {
- if (rte_errno == EALREADY)
+ if (rte_errno == EALREADY) {
LSTACK_PRE_LOG(LSTACK_INFO, "rte_eal_init aleady init\n");
- else
+ /* maybe other program inited, merge init param share init */
+ ret = 0;
+ }
+ else {
LSTACK_PRE_LOG(LSTACK_ERR, "rte_eal_init failed init, rte_errno %d\n", rte_errno);
-
- LSTACK_EXIT(1, "pthread_getaffinity_np failed\n");
+ }
+ } else {
+ LSTACK_PRE_LOG(LSTACK_INFO, "dpdk_eal_init success\n");
}
- LSTACK_PRE_LOG(LSTACK_INFO, "dpdk_eal_init success\n");
+
+ return ret;
}
static struct rte_mempool *create_pktmbuf_mempool(const char *name, uint32_t nb_mbuf,
@@ -116,13 +121,11 @@ static struct rte_mempool *create_pktmbuf_mempool(const char *name, uint32_t nb_
}
/* time stamp before pbuf_custom as priv_data */
- pthread_mutex_lock(get_mem_mutex());
pool = rte_pktmbuf_pool_create(pool_name, nb_mbuf, mbuf_cache_size,
sizeof(struct pbuf_custom) + GAZELLE_MBUFF_PRIV_SIZE, MBUF_SZ, rte_socket_id());
if (pool == NULL) {
LSTACK_LOG(ERR, LSTACK, "cannot create %s pool rte_err=%d\n", pool_name, rte_errno);
}
- pthread_mutex_unlock(get_mem_mutex());
return pool;
}
@@ -136,13 +139,13 @@ struct rte_mempool *create_rpc_mempool(const char *name, uint16_t queue_id)
if (ret < 0) {
return NULL;
}
- pthread_mutex_lock(get_mem_mutex());
+
pool = rte_mempool_create(pool_name, CALL_POOL_SZ, sizeof(struct rpc_msg), 0, 0, NULL, NULL, NULL,
NULL, rte_socket_id(), 0);
if (pool == NULL) {
LSTACK_LOG(ERR, LSTACK, "cannot create %s pool rte_err=%d\n", pool_name, rte_errno);
}
- pthread_mutex_unlock(get_mem_mutex());
+
return pool;
}
diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c
index 774d0f3..335d834 100644
--- a/src/lstack/core/lstack_init.c
+++ b/src/lstack/core/lstack_init.c
@@ -48,6 +48,13 @@
#define LSTACK_PRELOAD_NAME_LEN PATH_MAX
#define LSTACK_PRELOAD_ENV_PROC "GAZELLE_BIND_PROCNAME"
+static volatile int32_t g_init_fail = 0;
+
+void set_init_fail(void)
+{
+ g_init_fail = 1;
+}
+
struct lstack_preload {
int32_t preload_switch;
char env_procname[LSTACK_PRELOAD_NAME_LEN];
@@ -207,7 +214,11 @@ __attribute__((constructor)) void gazelle_network_init(void)
}
ret = pthread_create(&tid, NULL, (void *(*)(void *))control_client_thread, NULL);
} else {
- dpdk_eal_init();
+ ret = dpdk_eal_init();
+ if (ret < 0) {
+ LSTACK_EXIT(1, "dpdk_eal_init failed ret=%d errno=%d\n", ret, errno);
+ }
+
ret = pthread_create(&tid, NULL, (void *(*)(void *))control_server_thread, NULL);
}
if (ret != 0) {
@@ -248,7 +259,14 @@ __attribute__((constructor)) void gazelle_network_init(void)
* Phase 10: register core sig handler func to dumped stack */
lstack_signal_init();
+ /* wait stack thread and kernel_event thread init finish */
+ wait_sem_value(&get_protocol_stack_group()->all_init, get_protocol_stack_group()->stack_num);
+ if (g_init_fail) {
+ LSTACK_EXIT(1, "stack thread or kernel_event thread failed\n");
+ }
+
lstack_prelog_uninit();
posix_api->is_chld = 0;
LSTACK_LOG(INFO, LSTACK, "gazelle_network_init success\n");
+ rte_smp_mb();
}
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 4143f2f..00a82fb 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -145,13 +145,13 @@ void gazelle_init_sock(int32_t fd)
return;
}
- sock->recv_wait_free = create_ring("wait_free", SOCK_RECV_RING_SIZE, 0, atomic_fecth_add(&name_tick, 1));
+ sock->recv_wait_free = create_ring("wait_free", SOCK_RECV_RING_SIZE, 0, atomic_fetch_add(&name_tick, 1));
if (sock->recv_wait_free == NULL) {
LSTACK_LOG(ERR, LSTACK, "wait_free create failed. errno: %d.\n", rte_errno);
return;
}
- sock->send_ring = create_ring("sock_send", SOCK_SEND_RING_SIZE, 0, atomic_fecth_add(&name_tick, 1));
+ sock->send_ring = create_ring("sock_send", SOCK_SEND_RING_SIZE, 0, atomic_fetch_add(&name_tick, 1));
if (sock->send_ring == NULL) {
LSTACK_LOG(ERR, LSTACK, "sock_send create failed. errno: %d.\n", rte_errno);
return;
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index da320e2..8f0b785 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -39,19 +39,14 @@
static PER_THREAD uint16_t g_stack_idx = PROTOCOL_STACK_MAX;
static struct protocol_stack_group g_stack_group = {0};
static PER_THREAD long g_stack_tid = 0;
-static pthread_mutex_t g_mem_mutex = PTHREAD_MUTEX_INITIALIZER;
+void set_init_fail(void);
typedef void *(*stack_thread_func)(void *arg);
#ifdef GAZELLE_USE_EPOLL_EVENT_STACK
void update_stack_events(struct protocol_stack *stack);
#endif
-pthread_mutex_t *get_mem_mutex(void)
-{
- return &g_mem_mutex;
-}
-
int32_t bind_to_stack_numa(struct protocol_stack *stack)
{
int32_t ret;
@@ -248,6 +243,14 @@ static void init_stack_value(struct protocol_stack *stack, uint16_t queue_id)
stack_group->stacks[queue_id] = stack;
}
+void wait_sem_value(sem_t *sem, int32_t wait_value)
+{
+ int32_t sem_val;
+ do {
+ sem_getvalue(sem, &sem_val);
+ } while (sem_val < wait_value);
+}
+
static struct protocol_stack * stack_thread_init(uint16_t queue_id)
{
struct protocol_stack_group *stack_group = get_protocol_stack_group();
@@ -304,10 +307,10 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id)
sem_post(&stack_group->thread_phase1);
- int32_t sem_val;
- do {
- sem_getvalue(&stack_group->ethdev_init, &sem_val);
- } while (!sem_val && !use_ltran());
+ if (!use_ltran()) {
+ wait_sem_value(&stack_group->ethdev_init, 1);
+ }
+
ret = ethdev_init(stack);
if (ret != 0) {
@@ -332,10 +335,13 @@ static void* gazelle_stack_thread(void *arg)
struct protocol_stack *stack = stack_thread_init(queue_id);
if (stack == NULL) {
- pthread_mutex_lock(&g_mem_mutex);
- LSTACK_EXIT(1, "stack_thread_init failed\n");
- pthread_mutex_unlock(&g_mem_mutex);
+ /* exit in main thread, avoid create mempool and exit at the same time */
+ set_init_fail();
+ sem_post(&get_protocol_stack_group()->all_init);
+ LSTACK_LOG(ERR, LSTACK, "stack_thread_init failed queue_id=%d\n", queue_id);
+ return NULL;
}
+ sem_post(&get_protocol_stack_group()->all_init);
LSTACK_LOG(INFO, LSTACK, "stack_%02d init success\n", queue_id);
for (;;) {
@@ -386,10 +392,7 @@ int32_t init_protocol_stack(void)
}
}
- int32_t thread_inited_num;
- do {
- sem_getvalue(&stack_group->thread_phase1, &thread_inited_num);
- } while (thread_inited_num < stack_group->stack_num);
+ wait_sem_value(&stack_group->thread_phase1, stack_group->stack_num);
ret = init_stack_numa_cpuset();
if (ret < 0) {
diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h
index e8080e1..4295f01 100644
--- a/src/lstack/include/lstack_dpdk.h
+++ b/src/lstack/include/lstack_dpdk.h
@@ -58,7 +58,7 @@ int thread_affinity_default(void);
int thread_affinity_init(int cpu_id);
int32_t fill_mbuf_to_ring(struct rte_mempool *mempool, struct rte_ring *ring, uint32_t mbuf_num);
-void dpdk_eal_init(void);
+int32_t dpdk_eal_init(void);
int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num);
struct rte_ring *create_ring(const char *name, uint32_t count, uint32_t flags, int32_t queue_id);
int32_t create_shared_ring(struct protocol_stack *stack);
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index 9753385..9852878 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -64,6 +64,7 @@ struct protocol_stack_group {
uint16_t port_id;
sem_t thread_phase1;
sem_t ethdev_init;
+ sem_t all_init;
struct rte_mempool *kni_pktmbuf_pool;
struct eth_params *eth_params;
struct protocol_stack *stacks[PROTOCOL_STACK_MAX];
@@ -82,7 +83,6 @@ struct wakeup_poll {
};
long get_stack_tid(void);
-pthread_mutex_t *get_mem_mutex(void);
struct protocol_stack *get_protocol_stack(void);
struct protocol_stack *get_protocol_stack_by_fd(int32_t fd);
struct protocol_stack *get_minconn_protocol_stack(void);
@@ -92,6 +92,8 @@ int32_t init_protocol_stack(void);
int32_t bind_to_stack_numa(struct protocol_stack *stack);
int32_t init_dpdk_ethdev(void);
+void wait_sem_value(sem_t *sem, int32_t wait_value);
+
/* any protocol stack thread receives arp packet and sync it to other threads so that it can have the arp table */
void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack);
--
2.23.0

View File

@ -1,356 +0,0 @@
From 77a8fb02a7c4352fee106d0aa83500d81c20d315 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Thu, 21 Apr 2022 16:42:01 +0800
Subject: [PATCH 07/18] clean code:fix huge func
---
src/lstack/core/lstack_control_plane.c | 2 +-
src/lstack/core/lstack_init.c | 101 +++++++++++++-----------
src/lstack/core/lstack_protocol_stack.c | 89 +++++++++++----------
3 files changed, 105 insertions(+), 87 deletions(-)
diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c
index 13a2ed3..26a1b1c 100644
--- a/src/lstack/core/lstack_control_plane.c
+++ b/src/lstack/core/lstack_control_plane.c
@@ -705,7 +705,7 @@ void control_server_thread(void *arg)
int32_t epfd = init_epoll(listenfd);
if (epfd < 0) {
- LSTACK_LOG(ERR, LSTACK, "control_init_server failed\n");
+ LSTACK_LOG(ERR, LSTACK, "init_epoll failed\n");
return;
}
diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c
index 335d834..037b8fd 100644
--- a/src/lstack/core/lstack_init.c
+++ b/src/lstack/core/lstack_init.c
@@ -155,12 +155,52 @@ __attribute__((destructor)) void gazelle_network_exit(void)
}
}
-__attribute__((constructor)) void gazelle_network_init(void)
+static void create_control_thread(void)
{
int32_t ret;
+ pthread_t tid;
+ if (use_ltran()) {
+ dpdk_skip_nic_init();
+ if (control_init_client(false) != 0) {
+ LSTACK_EXIT(1, "control_init_client failed\n");
+ }
+ ret = pthread_create(&tid, NULL, (void *(*)(void *))control_client_thread, NULL);
+ } else {
+ ret = dpdk_eal_init();
+ if (ret < 0) {
+ LSTACK_EXIT(1, "dpdk_eal_init failed ret=%d errno=%d\n", ret, errno);
+ }
+
+ ret = pthread_create(&tid, NULL, (void *(*)(void *))control_server_thread, NULL);
+ }
+ if (ret != 0) {
+ LSTACK_EXIT(1, "pthread_create failed ret=%d errno=%d\n", ret, errno);
+ }
+
+ if (pthread_setname_np(tid, CONTROL_THREAD_NAME) != 0) {
+ LSTACK_LOG(ERR, LSTACK, "pthread_setname_np failed errno=%d\n", errno);
+ }
+ LSTACK_LOG(INFO, LSTACK, "create control_easy_thread success\n");
+}
+
+static void gazelle_signal_init(void)
+{
+ /* to prevent crash , just ignore SIGPIPE when socket is closed */
+ if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
+ LSTACK_PRE_LOG(LSTACK_ERR, "signal error, errno:%d.", errno);
+ LSTACK_EXIT(1, "signal SIGPIPE SIG_IGN\n");
+ }
+
+ /*
+ * register core sig handler func to dumped stack */
+ lstack_signal_init();
+}
+
+__attribute__((constructor)) void gazelle_network_init(void)
+{
/*
- * Phase 1: Init POSXI API and prelog */
+ * Init POSXI API and prelog */
lstack_prelog_init("LSTACK");
if (posix_api_init() != 0) {
LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n");
@@ -168,7 +208,7 @@ __attribute__((constructor)) void gazelle_network_init(void)
}
/*
- * Phase 2: Init LD_PRELOAD */
+ * Init LD_PRELOAD */
if (preload_info_init() < 0) {
return;
}
@@ -177,7 +217,7 @@ __attribute__((constructor)) void gazelle_network_init(void)
}
/*
- * Phase 3: Read configure from lstack.cfg */
+ * Read configure from lstack.cfg */
if (cfg_init() != 0) {
LSTACK_PRE_LOG(LSTACK_ERR, "cfg_init failed\n");
LSTACK_EXIT(1, "cfg_init failed\n");
@@ -185,87 +225,56 @@ __attribute__((constructor)) void gazelle_network_init(void)
LSTACK_PRE_LOG(LSTACK_INFO, "cfg_init success\n");
/*
- * Phase 4: check conflict */
+ * check conflict */
if (check_process_conflict() < 0) {
LSTACK_PRE_LOG(LSTACK_INFO, "Have another same primary process. WARNING: Posix API will use kernel mode!\n");
return;
}
/*
- * Phase 5: save initial affinity */
+ * save initial affinity */
if (thread_affinity_default() < 0) {
LSTACK_PRE_LOG(LSTACK_ERR, "pthread_getaffinity_np failed\n");
LSTACK_EXIT(1, "pthread_getaffinity_np failed\n");
}
- /* to prevent crash , just ignore SIGPIPE when socket is closed */
- if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
- LSTACK_PRE_LOG(LSTACK_ERR, "signal error, errno:%d.", errno);
- LSTACK_EXIT(1, "signal SIGPIPE SIG_IGN\n");
- }
+ gazelle_signal_init();
/*
- * Phase 6: Init control plane and dpdk init */
- pthread_t tid;
- if (use_ltran()) {
- dpdk_skip_nic_init();
- if (control_init_client(false) != 0) {
- LSTACK_EXIT(1, "control_init_client failed\n");
- }
- ret = pthread_create(&tid, NULL, (void *(*)(void *))control_client_thread, NULL);
- } else {
- ret = dpdk_eal_init();
- if (ret < 0) {
- LSTACK_EXIT(1, "dpdk_eal_init failed ret=%d errno=%d\n", ret, errno);
- }
-
- ret = pthread_create(&tid, NULL, (void *(*)(void *))control_server_thread, NULL);
- }
- if (ret != 0) {
- LSTACK_EXIT(1, "pthread_create failed errno=%d\n", errno);
- }
- if (pthread_setname_np(tid, CONTROL_THREAD_NAME) != 0) {
- LSTACK_LOG(ERR, LSTACK, "pthread_setname_np failed errno=%d\n", errno);
- }
- LSTACK_LOG(INFO, LSTACK, "create control_easy_thread success\n");
+ * Init control plane and dpdk init */
+ create_control_thread();
/*
- * Phase 7: cancel the core binding from DPDK initialization */
+ * cancel the core binding from DPDK initialization */
if (thread_affinity_default() < 0) {
LSTACK_EXIT(1, "pthread_setaffinity_np failed\n");
}
lstack_log_level_init();
+ lstack_prelog_uninit();
- ret = init_protocol_stack();
- if (ret != 0) {
+ if (init_protocol_stack() != 0) {
LSTACK_EXIT(1, "init_protocol_stack failed\n");
}
/*
- * Phase 8: nic */
+ * nic */
if (!use_ltran()) {
- ret = init_dpdk_ethdev();
- if (ret != 0) {
+ if (init_dpdk_ethdev() != 0) {
LSTACK_EXIT(1, "init_dpdk_ethdev failed\n");
}
}
/*
- * Phase 9: lwip initialization */
+ * lwip initialization */
lwip_sock_init();
- /*
- * Phase 10: register core sig handler func to dumped stack */
- lstack_signal_init();
-
/* wait stack thread and kernel_event thread init finish */
wait_sem_value(&get_protocol_stack_group()->all_init, get_protocol_stack_group()->stack_num);
if (g_init_fail) {
LSTACK_EXIT(1, "stack thread or kernel_event thread failed\n");
}
- lstack_prelog_uninit();
posix_api->is_chld = 0;
LSTACK_LOG(INFO, LSTACK, "gazelle_network_init success\n");
rte_smp_mb();
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 8f0b785..565d19b 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -217,7 +217,7 @@ static void* gazelle_weakup_thread(void *arg)
return NULL;
}
-static void init_stack_value(struct protocol_stack *stack, uint16_t queue_id)
+static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id)
{
struct protocol_stack_group *stack_group = get_protocol_stack_group();
@@ -241,6 +241,31 @@ static void init_stack_value(struct protocol_stack *stack, uint16_t queue_id)
stack_stat_init();
stack_group->stacks[queue_id] = stack;
+
+ cpu_set_t cpuset;
+ CPU_ZERO(&cpuset);
+ CPU_SET(stack->cpu_id, &cpuset);
+ if (rte_thread_set_affinity(&cpuset) != 0) {
+ LSTACK_LOG(ERR, LSTACK, "rte_thread_set_affinity failed\n");
+ return -1;
+ }
+ RTE_PER_LCORE(_lcore_id) = stack->cpu_id;
+
+ stack->socket_id = numa_node_of_cpu(stack->cpu_id);
+ if (stack->socket_id < 0) {
+ LSTACK_LOG(ERR, LSTACK, "numa_node_of_cpu failed\n");
+ return -1;
+ }
+
+ if (pktmbuf_pool_init(stack, stack_group->stack_num) != 0) {
+ return -1;
+ }
+
+ if (create_shared_ring(stack) != 0) {
+ return -1;
+ }
+
+ return 0;
}
void wait_sem_value(sem_t *sem, int32_t wait_value)
@@ -260,33 +285,8 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id)
LSTACK_LOG(ERR, LSTACK, "malloc stack failed\n");
return NULL;
}
- init_stack_value(stack, queue_id);
-
- cpu_set_t cpuset;
- CPU_ZERO(&cpuset);
- CPU_SET(stack->cpu_id, &cpuset);
- if (rte_thread_set_affinity(&cpuset) != 0) {
- LSTACK_LOG(ERR, LSTACK, "rte_thread_set_affinity failed\n");
- free(stack);
- return NULL;
- }
- RTE_PER_LCORE(_lcore_id) = stack->cpu_id;
-
- stack->socket_id = numa_node_of_cpu(stack->cpu_id);
- if (stack->socket_id < 0) {
- LSTACK_LOG(ERR, LSTACK, "numa_node_of_cpu failed\n");
- free(stack);
- return NULL;
- }
- int32_t ret = pktmbuf_pool_init(stack, stack_group->stack_num);
- if (ret != 0) {
- free(stack);
- return NULL;
- }
-
- ret = create_shared_ring(stack);
- if (ret != 0) {
+ if (init_stack_value(stack, queue_id) != 0) {
free(stack);
return NULL;
}
@@ -298,8 +298,7 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id)
tcpip_init(NULL, NULL);
if (use_ltran()) {
- ret = client_reg_thrd_ring();
- if (ret != 0) {
+ if (client_reg_thrd_ring() != 0) {
free(stack);
return NULL;
}
@@ -311,15 +310,13 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id)
wait_sem_value(&stack_group->ethdev_init, 1);
}
-
- ret = ethdev_init(stack);
- if (ret != 0) {
+ if (ethdev_init(stack) != 0) {
free(stack);
return NULL;
}
if (stack_group->wakeup_enable) {
- ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_weakup_thread);
+ int32_t ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_weakup_thread);
if (ret != 0) {
free(stack);
return NULL;
@@ -363,25 +360,37 @@ static void* gazelle_stack_thread(void *arg)
return NULL;
}
-int32_t init_protocol_stack(void)
+static int32_t init_protocol_sem(void)
{
- struct protocol_stack_group *stack_group = get_protocol_stack_group();
int32_t ret;
-
- stack_group->stack_num = get_global_cfg_params()->num_cpu;
- stack_group->wakeup_enable = (get_global_cfg_params()->num_wakeup > 0) ? true : false;
+ struct protocol_stack_group *stack_group = get_protocol_stack_group();
if (!use_ltran()) {
ret = sem_init(&stack_group->ethdev_init, 0, 0);
if (ret < 0) {
- LSTACK_LOG(ERR, PORT, "sem_init failed\n");
+ LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno);
return -1;
}
}
ret = sem_init(&stack_group->thread_phase1, 0, 0);
if (ret < 0) {
- LSTACK_LOG(ERR, PORT, "sem_init failed\n");
+ LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno);
+ return -1;
+ }
+
+ return 0;
+}
+
+int32_t init_protocol_stack(void)
+{
+ struct protocol_stack_group *stack_group = get_protocol_stack_group();
+ int32_t ret;
+
+ stack_group->stack_num = get_global_cfg_params()->num_cpu;
+ stack_group->wakeup_enable = (get_global_cfg_params()->num_wakeup > 0) ? true : false;
+
+ if (init_protocol_sem() != 0) {
return -1;
}
--
2.23.0

View File

@ -1,58 +0,0 @@
From 17fa541e456acccae61669fcc403b44e4aabb2d5 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Thu, 21 Apr 2022 16:59:44 +0800
Subject: [PATCH 08/18] add kernel path in epoll funcs
---
src/lstack/api/lstack_wrap.c | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c
index 0164069..f623da3 100644
--- a/src/lstack/api/lstack_wrap.c
+++ b/src/lstack/api/lstack_wrap.c
@@ -77,6 +77,15 @@ static inline enum KERNEL_LWIP_PATH select_path(int fd)
static inline int32_t do_epoll_create(int32_t size)
{
+ if (posix_api == NULL) {
+ /* link liblstack.so using LD_PRELOAD mode will read liblstack.so,
+ poisx_api need to be initialized here */
+ if (posix_api_init() != 0) {
+ LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n");
+ }
+ return posix_api->epoll_create_fn(size);
+ }
+
if (unlikely(posix_api->is_chld)) {
return posix_api->epoll_create_fn(size);
}
@@ -90,16 +99,22 @@ static inline int32_t do_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct
return posix_api->epoll_ctl_fn(epfd, op, fd, event);
}
+ struct lwip_sock *sock = get_socket_by_fd(epfd);
+ if (sock == NULL || sock->wakeup == NULL) {
+ return posix_api->epoll_ctl_fn(epfd, op, fd, event);
+ }
+
return lstack_epoll_ctl(epfd, op, fd, event);
}
static inline int32_t do_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxevents, int32_t timeout)
{
- if (events == NULL || maxevents == 0) {
- GAZELLE_RETURN(EINVAL);
+ if (unlikely(posix_api->is_chld)) {
+ return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout);
}
- if (unlikely(posix_api->is_chld)) {
+ struct lwip_sock *sock = get_socket_by_fd(epfd);
+ if (sock == NULL || sock->wakeup == NULL) {
return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout);
}
--
2.23.0

View File

@ -1,836 +0,0 @@
From a74d5b38b2021397d13b13aaa30f41f69be6f475 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Thu, 21 Apr 2022 17:21:59 +0800
Subject: [PATCH 09/18] refactor kernel event poll/epoll
---
src/lstack/api/lstack_epoll.c | 343 +++++++++++++++------
src/lstack/api/lstack_wrap.c | 21 +-
src/lstack/core/lstack_dpdk.c | 4 +-
src/lstack/core/lstack_init.c | 2 +-
src/lstack/core/lstack_lwip.c | 1 +
src/lstack/core/lstack_protocol_stack.c | 85 ++++-
src/lstack/include/lstack_cfg.h | 1 -
src/lstack/include/lstack_protocol_stack.h | 8 +-
src/lstack/include/posix/lstack_epoll.h | 24 ++
9 files changed, 350 insertions(+), 139 deletions(-)
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index b8d53f6..cba67ea 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -15,6 +15,7 @@
#include <sys/epoll.h>
#include <time.h>
#include <poll.h>
+#include <stdatomic.h>
#include <lwip/lwipsock.h>
#include <lwip/sockets.h>
@@ -32,10 +33,14 @@
#include "gazelle_base_func.h"
#include "lstack_lwip.h"
#include "lstack_protocol_stack.h"
+#include "posix/lstack_epoll.h"
#define EPOLL_KERNEL_INTERVAL 10 /* ms */
-#define EPOLL_NSEC_TO_SEC 1000000000
+#define SEC_TO_NSEC 1000000000
+#define SEC_TO_MSEC 1000
+#define MSEC_TO_NSEC 1000000
#define EPOLL_MAX_EVENTS 512
+#define POLL_KERNEL_EVENTS 32
static PER_THREAD struct wakeup_poll g_wakeup_poll = {0};
static bool g_use_epoll = false; /* FIXME: when no epoll close prepare event for performance testing */
@@ -149,12 +154,12 @@ int32_t lstack_epoll_create(int32_t size)
posix_api->close_fn(fd);
GAZELLE_RETURN(EINVAL);
}
-
memset_s(wakeup, sizeof(struct wakeup_poll), 0, sizeof(struct wakeup_poll));
- sem_init(&wakeup->event_sem, 0, 0);
- sock->wakeup = wakeup;
init_list_node(&wakeup->event_list);
+ wakeup->epollfd = fd;
+ sem_init(&wakeup->event_sem, 0, 0);
+ sock->wakeup = wakeup;
g_use_epoll = true;
return fd;
@@ -162,6 +167,8 @@ int32_t lstack_epoll_create(int32_t size)
int32_t lstack_epoll_close(int32_t fd)
{
+ posix_api->close_fn(fd);
+
struct lwip_sock *sock = get_socket_by_fd(fd);
if (sock == NULL) {
LSTACK_LOG(ERR, LSTACK, "fd=%d sock is NULL errno=%d\n", fd, errno);
@@ -176,6 +183,43 @@ int32_t lstack_epoll_close(int32_t fd)
return 0;
}
+static uint16_t find_max_cnt_stack(int32_t *stack_count, uint16_t stack_num, struct protocol_stack *last_stack)
+{
+ uint16_t max_index = 0;
+ bool all_same_cnt = true;
+
+ for (uint16_t i = 1; i < stack_num; i++) {
+ if (stack_count[i] != stack_count[0]) {
+ all_same_cnt = false;
+ }
+
+ if (stack_count[i] > stack_count[max_index]) {
+ max_index = i;
+ }
+ }
+
+ /* all stack same, don't change */
+ if (all_same_cnt && last_stack) {
+ return last_stack->queue_id;
+ }
+
+ /* first bind and all stack same. choice tick as queue_id, avoid all bind to statck_0.*/
+ static uint16_t tick = 0;
+ if (all_same_cnt && stack_num) {
+ max_index = atomic_fetch_add(&tick, 1) % stack_num;
+ }
+
+ return max_index;
+}
+
+static void update_epoll_max_stack(struct wakeup_poll *wakeup)
+{
+ struct protocol_stack_group *stack_group = get_protocol_stack_group();
+ uint16_t bind_id = find_max_cnt_stack(wakeup->stack_fd_cnt, stack_group->stack_num, wakeup->max_stack);
+
+ wakeup->max_stack = stack_group->stacks[bind_id];
+}
+
int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event *event)
{
LSTACK_LOG(DEBUG, LSTACK, "op=%d events: fd: %d\n", op, fd);
@@ -185,35 +229,38 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even
GAZELLE_RETURN(EINVAL);
}
+ struct lwip_sock *epoll_sock = get_socket_by_fd(epfd);
+ if (epoll_sock == NULL || epoll_sock->wakeup == NULL) {
+ return posix_api->epoll_ctl_fn(epfd, op, fd, event);
+ }
+
struct lwip_sock *sock = get_socket(fd);
if (sock == NULL) {
+ epoll_sock->wakeup->have_kernel_fd = true;
return posix_api->epoll_ctl_fn(epfd, op, fd, event);
}
if (CONN_TYPE_HAS_HOST(sock->conn)) {
+ epoll_sock->wakeup->have_kernel_fd = true;
int32_t ret = posix_api->epoll_ctl_fn(epfd, op, fd, event);
if (ret < 0) {
return ret;
}
}
- struct lwip_sock *epoll_sock = get_socket_by_fd(epfd);
- if (epoll_sock == NULL || epoll_sock->wakeup == NULL) {
- LSTACK_LOG(ERR, LSTACK, "epfd=%d\n", fd);
- GAZELLE_RETURN(EINVAL);
- }
-
- uint32_t events = event->events | EPOLLERR | EPOLLHUP;
do {
switch (op) {
case EPOLL_CTL_ADD:
sock->wakeup = epoll_sock->wakeup;
+ if (sock->stack) {
+ epoll_sock->wakeup->stack_fd_cnt[sock->stack->queue_id]++;
+ }
if (list_is_empty(&sock->event_list)) {
list_add_node(&sock->wakeup->event_list, &sock->event_list);
}
/* fall through */
case EPOLL_CTL_MOD:
- sock->epoll_events = events;
+ sock->epoll_events = event->events | EPOLLERR | EPOLLHUP;
sock->ep_data = event->data;
if (sock->conn && NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
raise_pending_events(sock);
@@ -222,6 +269,9 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even
case EPOLL_CTL_DEL:
list_del_node_init(&sock->event_list);
sock->epoll_events = 0;
+ if (sock->stack) {
+ epoll_sock->wakeup->stack_fd_cnt[sock->stack->queue_id]--;
+ }
break;
default:
GAZELLE_RETURN(EINVAL);
@@ -230,6 +280,7 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even
sock = get_socket(fd);
} while (fd > 0 && sock != NULL);
+ update_epoll_max_stack(epoll_sock->wakeup);
return 0;
}
@@ -346,129 +397,196 @@ static int32_t poll_lwip_event(struct pollfd *fds, nfds_t nfds)
return event_num;
}
-static inline bool have_kernel_fd(int32_t epfd, struct pollfd *fds, nfds_t nfds)
+static void ms_to_timespec(struct timespec *timespec, int32_t timeout)
{
- /* when epfd > 0 is epoll type */
- for (uint32_t i = 0; i < nfds && epfd < 0; i++) {
- if (get_socket(fds[i].fd) == NULL) {
- return true;
+ clock_gettime(CLOCK_REALTIME, timespec);
+ timespec->tv_sec += timeout / SEC_TO_MSEC;
+ timespec->tv_nsec += (timeout % SEC_TO_MSEC) * MSEC_TO_NSEC;
+ timespec->tv_sec += timespec->tv_nsec / SEC_TO_NSEC;
+ timespec->tv_nsec = timespec->tv_nsec % SEC_TO_NSEC;
+}
+
+static void change_epollfd_kernel_thread(struct wakeup_poll *wakeup, struct protocol_stack *old_stack,
+ struct protocol_stack *new_stack)
+{
+ if (old_stack) {
+ if (posix_api->epoll_ctl_fn(old_stack->epollfd, EPOLL_CTL_DEL, wakeup->epollfd, NULL) != 0) {
+ LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno);
}
}
- return false;
+ /* avoid kernel thread post too much, use EPOLLET */
+ struct epoll_event event;
+ event.data.ptr = &wakeup->event_sem;
+ event.events = EPOLLIN | EPOLLOUT | EPOLLERR | EPOLLHUP | EPOLLET;
+ if (posix_api->epoll_ctl_fn(new_stack->epollfd, EPOLL_CTL_ADD, wakeup->epollfd, &event) != 0) {
+ LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno);
+ }
}
-static inline int32_t poll_kernel_event(struct pollfd *fds, nfds_t nfds)
+static void epoll_bind_statck(struct wakeup_poll *wakeup)
{
- int32_t event_num = 0;
-
- for (uint32_t i = 0; i < nfds; i++) {
- /* lwip event */
- if (get_socket(fds[i].fd) != NULL || fds[i].fd < 0) {
- continue;
- }
-
- int32_t ret = posix_api->poll_fn(&fds[i], 1, 0);
- if (ret < 0) {
- if (errno != EINTR) {
- return ret;
- }
- } else {
- event_num += ret;
- }
+ /* all fd is kernel, set rand stack */
+ if (wakeup->bind_stack == NULL && wakeup->max_stack== NULL) {
+ update_epoll_max_stack(wakeup);
}
- return event_num;
+ if (wakeup->bind_stack != wakeup->max_stack && wakeup->max_stack) {
+ bind_to_stack_numa(wakeup->max_stack);
+ change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, wakeup->max_stack);
+ wakeup->bind_stack = wakeup->max_stack;
+ }
}
-static int32_t get_event(struct wakeup_poll *wakeup, int32_t epfd, void *out, int32_t maxevents, int32_t timeout)
+int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxevents, int32_t timeout)
{
- struct pollfd *fds = (struct pollfd *)out;
- struct epoll_event *events = (struct epoll_event *)out;
- bool have_kernel = have_kernel_fd(epfd, fds, maxevents);
+ struct lwip_sock *sock = get_socket_by_fd(epfd);
+ if (sock == NULL || sock->wakeup == NULL) {
+ return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout);
+ }
+
int32_t event_num = 0;
- int32_t poll_time = 0;
int32_t ret;
- /* when epfd > 0 is epoll type */
+ struct timespec epoll_time;
+ if (timeout >= 0) {
+ ms_to_timespec(&epoll_time, timeout);
+ }
+
+ epoll_bind_statck(sock->wakeup);
+
do {
- event_num += (epfd > 0) ? epoll_lwip_event(wakeup, &events[event_num], maxevents - event_num) :
- poll_lwip_event(fds, maxevents);
-
- if (have_kernel) {
- int32_t event_kernel_num = (epfd > 0) ?
- posix_api->epoll_wait_fn(epfd, &events[event_num], maxevents - event_num, 0) :
- poll_kernel_event(fds, maxevents);
- if (event_kernel_num < 0) {
- return event_kernel_num;
- }
- event_num += event_kernel_num;
- if (timeout >= 0 && poll_time >= timeout) {
- break;
- }
- poll_time += EPOLL_KERNEL_INTERVAL;
+ event_num += epoll_lwip_event(sock->wakeup, &events[event_num], maxevents - event_num);
+
+ if (sock->wakeup->have_kernel_fd) {
+ event_num += posix_api->epoll_wait_fn(epfd, &events[event_num], maxevents - event_num, 0);
}
if (event_num > 0) {
break;
}
- int32_t interval = (have_kernel) ? EPOLL_KERNEL_INTERVAL : timeout;
- struct timespec epoll_interval;
- clock_gettime(CLOCK_REALTIME, &epoll_interval);
- epoll_interval.tv_sec += interval / 1000;
- epoll_interval.tv_nsec += (interval % 1000) * 1000000;
- epoll_interval.tv_sec += epoll_interval.tv_nsec / 1000000000;
- epoll_interval.tv_nsec = epoll_interval.tv_nsec % 1000000000;
-
- if (timeout < 0 && !have_kernel) {
- ret = sem_wait(&wakeup->event_sem);
+ if (timeout < 0) {
+ ret = sem_wait(&sock->wakeup->event_sem);
} else {
- ret = sem_timedwait(&wakeup->event_sem, &epoll_interval);
+ ret = sem_timedwait(&sock->wakeup->event_sem, &epoll_time);
}
-
- if (!have_kernel && ret < 0) {
- break;
- }
- } while (event_num <= maxevents);
+ } while (ret == 0);
return event_num;
}
-int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxevents, int32_t timeout)
+static void init_poll_wakeup_data(struct wakeup_poll *wakeup)
{
- /* avoid the starvation of epoll events from both netstack */
- maxevents = LWIP_MIN(LWIP_EPOOL_MAX_EVENTS, maxevents);
+ sem_init(&wakeup->event_sem, 0, 0);
- struct lwip_sock *sock = get_socket_by_fd(epfd);
- if (sock == NULL) {
- GAZELLE_RETURN(EINVAL);
+ wakeup->last_fds = calloc(POLL_KERNEL_EVENTS, sizeof(struct pollfd));
+ if (wakeup->last_fds == NULL) {
+ LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno);
}
- if (sock->wakeup == NULL) {
- return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout);
+ wakeup->events = calloc(POLL_KERNEL_EVENTS, sizeof(struct epoll_event));
+ if (wakeup->events == NULL) {
+ LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno);
}
- return get_event(sock->wakeup, epfd, events, maxevents, timeout);
+ wakeup->last_max_nfds = POLL_KERNEL_EVENTS;
+
+ wakeup->epollfd = posix_api->epoll_create_fn(POLL_KERNEL_EVENTS);
+ if (wakeup->epollfd < 0) {
+ LSTACK_LOG(ERR, LSTACK, "epoll_create_fn errno=%d\n", errno);
+ }
}
-static void poll_init(struct pollfd *fds, nfds_t nfds, struct wakeup_poll *wakeup)
+static void resize_kernel_poll(struct wakeup_poll *wakeup, nfds_t nfds)
{
- int32_t stack_count[PROTOCOL_STACK_MAX] = {0};
+ wakeup->last_fds = realloc(wakeup->last_fds, nfds * sizeof(struct pollfd));
+ if (wakeup->last_fds == NULL) {
+ LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno);
+ }
+
+ wakeup->events = realloc(wakeup->events, nfds * sizeof(struct epoll_event));
+ if (wakeup->events == NULL) {
+ LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno);
+ }
+
+ wakeup->last_max_nfds = nfds;
+ memset_s(wakeup->last_fds, nfds * sizeof(struct pollfd), 0, nfds * sizeof(struct pollfd));
+}
+
+static void poll_bind_statck(struct wakeup_poll *wakeup, int32_t *stack_count)
+{
+ struct protocol_stack_group *stack_group = get_protocol_stack_group();
+ uint16_t bind_id = find_max_cnt_stack(stack_count, stack_group->stack_num, wakeup->bind_stack);
+
+ if (wakeup->bind_stack && wakeup->bind_stack->queue_id == bind_id) {
+ return;
+ }
+ change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, stack_group->stacks[bind_id]);
+ bind_to_stack_numa(stack_group->stacks[bind_id]);
+ wakeup->bind_stack = stack_group->stacks[bind_id];
+}
+
+static void update_kernel_poll(struct wakeup_poll *wakeup, uint32_t index, struct pollfd *new_fd)
+{
+ posix_api->epoll_ctl_fn(wakeup->epollfd, EPOLL_CTL_DEL, wakeup->last_fds[index].fd, NULL);
+
+ if (new_fd == NULL) {
+ return;
+ }
+
+ struct epoll_event event;
+ event.data.u32 = index;
+ event.events = new_fd->events;
+ if (posix_api->epoll_ctl_fn(wakeup->epollfd, EPOLL_CTL_ADD, new_fd->fd, &event) != 0) {
+ LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno);
+ }
+
+ wakeup->last_fds[index].fd = new_fd->fd;
+ wakeup->last_fds[index].events = new_fd->events;
+
+ wakeup->have_kernel_fd = true;
+}
+
+static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfds)
+{
if (!wakeup->init) {
wakeup->init = true;
- sem_init(&wakeup->event_sem, 0, 0);
+ init_poll_wakeup_data(wakeup);
} else {
while (sem_trywait(&wakeup->event_sem) == 0) {}
}
+ if (nfds > wakeup->last_max_nfds) {
+ resize_kernel_poll(wakeup, nfds);
+ }
+
+ int32_t stack_count[PROTOCOL_STACK_MAX] = {0};
+ int32_t poll_change = 0;
+
+ /* poll fds num less, del old fd */
+ for (uint32_t i = nfds; i < wakeup->last_nfds; i++) {
+ update_kernel_poll(wakeup, i, NULL);
+ poll_change = 1;
+ }
+
for (uint32_t i = 0; i < nfds; i++) {
- int32_t fd = fds[i].fd;
fds[i].revents = 0;
+ if (fds[i].fd == wakeup->last_fds[i].fd && fds[i].events == wakeup->last_fds[i].events) {
+ continue;
+ }
+ poll_change = 1;
+
+ int32_t fd = fds[i].fd;
+ struct lwip_sock *sock = get_socket(fd);
+ if (sock == NULL || CONN_TYPE_HAS_HOST(sock->conn)) {
+ update_kernel_poll(wakeup, i, fds + i);
+ }
+
do {
- struct lwip_sock *sock = get_socket(fd);
+ sock = get_socket(fd);
if (sock == NULL || sock->conn == NULL) {
break;
}
@@ -481,25 +599,50 @@ static void poll_init(struct pollfd *fds, nfds_t nfds, struct wakeup_poll *wakeu
} while (fd > 0);
}
- if (wakeup->bind_stack) {
+ wakeup->last_nfds = nfds;
+ if (poll_change == 0) {
return;
}
- struct protocol_stack_group *stack_group = get_protocol_stack_group();
- uint32_t bind_id = 0;
- for (uint32_t i = 0; i < stack_group->stack_num; i++) {
- if (stack_count[i] > stack_count[bind_id]) {
- bind_id = i;
- }
- }
-
- bind_to_stack_numa(stack_group->stacks[bind_id]);
- wakeup->bind_stack = stack_group->stacks[bind_id];
+ poll_bind_statck(wakeup, stack_count);
}
int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout)
{
- poll_init(fds, nfds, &g_wakeup_poll);
+ poll_init(&g_wakeup_poll, fds, nfds);
- return get_event(&g_wakeup_poll, -1, fds, nfds, timeout);
+ int32_t event_num = 0;
+ int32_t ret;
+
+ struct timespec poll_time;
+ if (timeout >= 0) {
+ ms_to_timespec(&poll_time, timeout);
+ }
+
+ /* when epfd > 0 is epoll type */
+ do {
+ event_num += poll_lwip_event(fds, nfds);
+
+ /* reduce syscall epoll_wait */
+ if (g_wakeup_poll.have_kernel_fd) {
+ int32_t kernel_num = posix_api->epoll_wait_fn(g_wakeup_poll.epollfd, g_wakeup_poll.events, nfds, 0);
+ for (int32_t i = 0; i < kernel_num; i++) {
+ uint32_t index = g_wakeup_poll.events[i].data.u32;
+ fds[index].revents = g_wakeup_poll.events[i].events;
+ }
+ event_num += kernel_num >= 0 ? kernel_num : 0;
+ }
+
+ if (event_num > 0) {
+ break;
+ }
+
+ if (timeout < 0) {
+ ret = sem_wait(&g_wakeup_poll.event_sem);
+ } else {
+ ret = sem_timedwait(&g_wakeup_poll.event_sem, &poll_time);
+ }
+ } while (ret == 0);
+
+ return event_num;
}
diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c
index f623da3..bf5dcb4 100644
--- a/src/lstack/api/lstack_wrap.c
+++ b/src/lstack/api/lstack_wrap.c
@@ -45,8 +45,7 @@ enum KERNEL_LWIP_PATH {
static inline enum KERNEL_LWIP_PATH select_path(int fd)
{
if (posix_api == NULL) {
- /* link liblstack.so using LD_PRELOAD mode will read liblstack.so,
- poisx_api need to be initialized here */
+ /* posix api maybe call before gazelle init */
if (posix_api_init() != 0) {
LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n");
}
@@ -78,8 +77,7 @@ static inline enum KERNEL_LWIP_PATH select_path(int fd)
static inline int32_t do_epoll_create(int32_t size)
{
if (posix_api == NULL) {
- /* link liblstack.so using LD_PRELOAD mode will read liblstack.so,
- poisx_api need to be initialized here */
+ /* posix api maybe call before gazelle init */
if (posix_api_init() != 0) {
LSTACK_PRE_LOG(LSTACK_ERR, "posix_api_init failed\n");
}
@@ -99,11 +97,6 @@ static inline int32_t do_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct
return posix_api->epoll_ctl_fn(epfd, op, fd, event);
}
- struct lwip_sock *sock = get_socket_by_fd(epfd);
- if (sock == NULL || sock->wakeup == NULL) {
- return posix_api->epoll_ctl_fn(epfd, op, fd, event);
- }
-
return lstack_epoll_ctl(epfd, op, fd, event);
}
@@ -113,11 +106,6 @@ static inline int32_t do_epoll_wait(int32_t epfd, struct epoll_event* events, in
return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout);
}
- struct lwip_sock *sock = get_socket_by_fd(epfd);
- if (sock == NULL || sock->wakeup == NULL) {
- return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout);
- }
-
if (epfd < 0) {
GAZELLE_RETURN(EBADF);
}
@@ -362,6 +350,11 @@ static inline ssize_t do_sendmsg(int32_t s, const struct msghdr *message, int32_
static inline int32_t do_close(int32_t s)
{
+ struct lwip_sock *sock = get_socket_by_fd(s);
+ if (sock && sock->wakeup && sock->wakeup->epollfd == s) {
+ return lstack_epoll_close(s);
+ }
+
if (select_path(s) == PATH_KERNEL) {
return posix_api->close_fn(s);
}
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index aa91201..cdd2c05 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -95,8 +95,8 @@ int32_t dpdk_eal_init(void)
if (ret < 0) {
if (rte_errno == EALREADY) {
LSTACK_PRE_LOG(LSTACK_INFO, "rte_eal_init aleady init\n");
- /* maybe other program inited, merge init param share init */
- ret = 0;
+ /* maybe other program inited, merge init param share init */
+ ret = 0;
}
else {
LSTACK_PRE_LOG(LSTACK_ERR, "rte_eal_init failed init, rte_errno %d\n", rte_errno);
diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c
index 037b8fd..f8e96bf 100644
--- a/src/lstack/core/lstack_init.c
+++ b/src/lstack/core/lstack_init.c
@@ -270,7 +270,7 @@ __attribute__((constructor)) void gazelle_network_init(void)
lwip_sock_init();
/* wait stack thread and kernel_event thread init finish */
- wait_sem_value(&get_protocol_stack_group()->all_init, get_protocol_stack_group()->stack_num);
+ wait_sem_value(&get_protocol_stack_group()->all_init, get_protocol_stack_group()->stack_num * 2);
if (g_init_fail) {
LSTACK_EXIT(1, "stack thread or kernel_event thread failed\n");
}
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 00a82fb..8544ef7 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -29,6 +29,7 @@
#include "lstack_log.h"
#include "lstack_dpdk.h"
#include "lstack_stack_stat.h"
+#include "posix/lstack_epoll.h"
#include "lstack_lwip.h"
#define HALF_DIVISOR (2)
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 565d19b..eb975c0 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -35,6 +35,7 @@
#define READ_LIST_MAX 32
#define SEND_LIST_MAX 32
#define HANDLE_RPC_MSG_MAX 32
+#define KERNEL_EPOLL_MAX 256
static PER_THREAD uint16_t g_stack_idx = PROTOCOL_STACK_MAX;
static struct protocol_stack_group g_stack_group = {0};
@@ -43,9 +44,6 @@ static PER_THREAD long g_stack_tid = 0;
void set_init_fail(void);
typedef void *(*stack_thread_func)(void *arg);
-#ifdef GAZELLE_USE_EPOLL_EVENT_STACK
-void update_stack_events(struct protocol_stack *stack);
-#endif
int32_t bind_to_stack_numa(struct protocol_stack *stack)
{
@@ -206,6 +204,10 @@ static void* gazelle_weakup_thread(void *arg)
LSTACK_LOG(INFO, LSTACK, "weakup_%02d start\n", stack->queue_id);
for (;;) {
+ if (rte_ring_count(stack->wakeup_ring) == 0) {
+ continue;
+ }
+
sem_t *event_sem;
if (rte_ring_sc_dequeue(stack->wakeup_ring, (void **)&event_sem)) {
continue;
@@ -268,6 +270,61 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id)
return 0;
}
+static void* gazelle_kernel_event(void *arg)
+{
+ uint16_t queue_id = *(uint16_t *)arg;
+
+ int32_t epoll_fd = posix_api->epoll_create_fn(GAZELLE_LSTACK_MAX_CONN);
+ if (epoll_fd < 0) {
+ LSTACK_LOG(ERR, LSTACK, "queue_id=%d epoll_fd=%d errno=%d\n", queue_id, epoll_fd, errno);
+ /* exit in main thread, avoid create mempool and exit at the same time */
+ set_init_fail();
+ sem_post(&get_protocol_stack_group()->all_init);
+ return NULL;
+ }
+
+ struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id];
+ stack->epollfd = epoll_fd;
+
+ sem_post(&get_protocol_stack_group()->all_init);
+ LSTACK_LOG(INFO, LSTACK, "kernel_event_%02d start\n", stack->queue_id);
+
+ struct epoll_event events[KERNEL_EPOLL_MAX];
+ for (;;) {
+ int32_t event_num = posix_api->epoll_wait_fn(epoll_fd, events, KERNEL_EPOLL_MAX, -1);
+ if (event_num <= 0) {
+ continue;
+ }
+
+ for (int32_t i = 0; i < event_num; i++) {
+ if (events[i].data.ptr) {
+ sem_post((sem_t *)events[i].data.ptr);
+ }
+ }
+ }
+
+ return NULL;
+}
+
+static int32_t create_companion_thread(struct protocol_stack_group *stack_group, struct protocol_stack *stack)
+{
+ int32_t ret;
+
+ if (stack_group->wakeup_enable) {
+ ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_weakup_thread);
+ if (ret != 0) {
+ LSTACK_LOG(ERR, LSTACK, "gazelleweakup ret=%d errno=%d\n", ret, errno);
+ return ret;
+ }
+ }
+
+ ret = create_thread(stack->queue_id, "gazellekernel", gazelle_kernel_event);
+ if (ret != 0) {
+ LSTACK_LOG(ERR, LSTACK, "gazellekernelEvent ret=%d errno=%d\n", ret, errno);
+ }
+ return ret;
+}
+
void wait_sem_value(sem_t *sem, int32_t wait_value)
{
int32_t sem_val;
@@ -315,12 +372,9 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id)
return NULL;
}
- if (stack_group->wakeup_enable) {
- int32_t ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_weakup_thread);
- if (ret != 0) {
- free(stack);
- return NULL;
- }
+ if (create_companion_thread(stack_group, stack) != 0) {
+ free(stack);
+ return NULL;
}
return stack;
@@ -338,6 +392,7 @@ static void* gazelle_stack_thread(void *arg)
LSTACK_LOG(ERR, LSTACK, "stack_thread_init failed queue_id=%d\n", queue_id);
return NULL;
}
+
sem_post(&get_protocol_stack_group()->all_init);
LSTACK_LOG(INFO, LSTACK, "stack_%02d init success\n", queue_id);
@@ -351,10 +406,6 @@ static void* gazelle_stack_thread(void *arg)
send_stack_list(stack, SEND_LIST_MAX);
sys_timer_run();
-
-#ifdef GAZELLE_USE_EPOLL_EVENT_STACK
- update_stack_events(stack);
-#endif
}
return NULL;
@@ -378,7 +429,13 @@ static int32_t init_protocol_sem(void)
LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno);
return -1;
}
-
+
+ ret = sem_init(&stack_group->all_init, 0, 0);
+ if (ret < 0) {
+ LSTACK_LOG(ERR, PORT, "sem_init failed ret=%d errno=%d\n", ret, errno);
+ return -1;
+ }
+
return 0;
}
diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h
index 345a373..987828d 100644
--- a/src/lstack/include/lstack_cfg.h
+++ b/src/lstack/include/lstack_cfg.h
@@ -33,7 +33,6 @@
#define LOG_DIR_PATH PATH_MAX
#define LOG_LEVEL_LEN 16
#define GAZELLE_MAX_NUMA_NODES 8
-#define LWIP_EPOOL_MAX_EVENTS 512
/* Default value of low power mode parameters */
#define LSTACK_LPM_DETECT_MS_MIN (5 * 1000)
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index 9852878..bc4e4bd 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -51,6 +51,7 @@ struct protocol_stack {
struct list_node send_list;
struct list_node event_list;
pthread_spinlock_t event_lock;
+ int32_t epollfd; /* kernel event thread epoll fd */
struct gazelle_stat_pkts stats;
struct gazelle_stack_latency latency;
@@ -75,13 +76,6 @@ struct protocol_stack_group {
uint64_t call_alloc_fail;
};
-struct wakeup_poll {
- bool init;
- struct protocol_stack *bind_stack;
- struct list_node event_list; /* epoll temp use poll */
- sem_t event_sem;
-};
-
long get_stack_tid(void);
struct protocol_stack *get_protocol_stack(void);
struct protocol_stack *get_protocol_stack_by_fd(int32_t fd);
diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/posix/lstack_epoll.h
index cac640b..a83f41f 100644
--- a/src/lstack/include/posix/lstack_epoll.h
+++ b/src/lstack/include/posix/lstack_epoll.h
@@ -18,6 +18,30 @@ extern "C" {
#endif
#include <poll.h>
+#include <stdbool.h>
+#include <semaphore.h>
+
+#include "lstack_protocol_stack.h"
+
+struct wakeup_poll {
+ bool init;
+ struct protocol_stack *bind_stack;
+ sem_t event_sem;
+
+ int32_t epollfd;
+ bool have_kernel_fd;
+
+ /* poll */
+ struct pollfd *last_fds;
+ nfds_t last_nfds;
+ nfds_t last_max_nfds;
+ struct epoll_event *events;
+
+ /* epoll */
+ int32_t stack_fd_cnt[PROTOCOL_STACK_MAX];
+ struct protocol_stack *max_stack;
+ struct list_node event_list; /* epoll temp use */
+};
int32_t lstack_epoll_create(int32_t size);
int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event *event);
--
2.23.0

View File

@ -1,39 +0,0 @@
From e0d26480fc3919affe10b55ccbb5837aa88c5c57 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng14@huawei.com>
Date: Mon, 16 May 2022 18:34:55 +0800
Subject: [PATCH 10/18] post thread_phase1 sem to avoid block main thread when
stack error
---
src/lstack/core/lstack_protocol_stack.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index eb975c0..88513ba 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -339,11 +339,13 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id)
struct protocol_stack *stack = malloc(sizeof(*stack));
if (stack == NULL) {
+ sem_post(&stack_group->thread_phase1);
LSTACK_LOG(ERR, LSTACK, "malloc stack failed\n");
return NULL;
}
if (init_stack_value(stack, queue_id) != 0) {
+ sem_post(&stack_group->thread_phase1);
free(stack);
return NULL;
}
@@ -356,6 +358,7 @@ static struct protocol_stack * stack_thread_init(uint16_t queue_id)
if (use_ltran()) {
if (client_reg_thrd_ring() != 0) {
+ sem_post(&stack_group->thread_phase1);
free(stack);
return NULL;
}
--
2.23.0

View File

@ -1,46 +0,0 @@
From 98f76a2d2d512338d40cd435b4a75f6989aa13bf Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng14@huawei.com>
Date: Mon, 16 May 2022 18:49:18 +0800
Subject: [PATCH 11/18] adjust the number of RX/TX mbufs of each stack thread
---
src/lstack/core/lstack_dpdk.c | 4 ++--
src/lstack/include/lstack_dpdk.h | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index cdd2c05..df0332b 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -175,13 +175,13 @@ int32_t pktmbuf_pool_init(struct protocol_stack *stack, uint16_t stack_num)
return -1;
}
- stack->rx_pktmbuf_pool = create_pktmbuf_mempool("rx_mbuf", RX_NB_MBUF / stack_num, RX_MBUF_CACHE_SZ,
+ stack->rx_pktmbuf_pool = create_pktmbuf_mempool("rx_mbuf", RX_NB_MBUF, RX_MBUF_CACHE_SZ,
stack->queue_id);
if (stack->rx_pktmbuf_pool == NULL) {
return -1;
}
- stack->tx_pktmbuf_pool = create_pktmbuf_mempool("tx_mbuf", TX_NB_MBUF / stack_num, TX_MBUF_CACHE_SZ,
+ stack->tx_pktmbuf_pool = create_pktmbuf_mempool("tx_mbuf", TX_NB_MBUF, TX_MBUF_CACHE_SZ,
stack->queue_id);
if (stack->tx_pktmbuf_pool == NULL) {
return -1;
diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h
index 4295f01..bb9be21 100644
--- a/src/lstack/include/lstack_dpdk.h
+++ b/src/lstack/include/lstack_dpdk.h
@@ -23,7 +23,7 @@
#include "dpdk_common.h"
struct protocol_stack;
-#define RX_NB_MBUF ((5 * MAX_CLIENTS) + (VDEV_RX_QUEUE_SZ * DEFAULT_BACKUP_RING_SIZE_FACTOR))
+#define RX_NB_MBUF ((5 * (MAX_CLIENTS / 4)) + (VDEV_RX_QUEUE_SZ * DEFAULT_BACKUP_RING_SIZE_FACTOR))
#define RX_MBUF_CACHE_SZ (VDEV_RX_QUEUE_SZ)
#define TX_NB_MBUF (128 * DEFAULT_RING_SIZE)
#define TX_MBUF_CACHE_SZ (DEFAULT_RING_SIZE)
--
2.23.0

View File

@ -1,365 +0,0 @@
From 981a5ddaa7708b7e2c34fc52dae592b703fd64f2 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng14@huawei.com>
Date: Fri, 20 May 2022 17:14:07 +0800
Subject: [PATCH 2/6] modify readme
---
README.md | 262 ++++++++++++++++++++++++----------------------------
2 files changed, 121 insertions(+), 404 deletions(-)
delete mode 100644 Gazelle.md
diff --git a/README.md b/README.md
index 5a99633..61f298c 100644
--- a/README.md
+++ b/README.md
@@ -1,90 +1,75 @@
-<img src="doc/logo.png" alt="gazelle" style="zoom:20%;" />
+# 用户态协议栈Gazelle用户指南
-# gazelle
+## 简介
-## Introduction
-gazelle是高性能的用户态协议栈通过dpdk在用户态直接读写网卡报文共享大页内存传递报文并使用轻量级lwip协议栈。能够大幅提高应用的网络IO吞吐能力.
+Gazelle是一款高性能用户态协议栈。它基于DPDK在用户态直接读写网卡报文共享大页内存传递报文使用轻量级LwIP协议栈。能够大幅提高应用的网络I/O吞吐能力。专注于数据库网络性能加速如MySQL、redis等。
+- 高性能
+报文零拷贝无锁灵活scale-out自适应调度。
+- 通用性
+完全兼容POSIX零修改适用不同类型的应用。
-## Compile
-- 编译依赖软件包
-cmake gcc-c++ lwip dpdk-devel(>=21.11-2)
-numactl-devel libpcap-devel libconfig-devel libboundscheck rpm-build
-- 编译
-``` sh
-#创建目录
-mkdir -p ~/rpmbuild/SPECS
-mkdir -p ~/rpmbuild/SOURCES
-
-#创建压缩包
-mkdir gazelle-1.0.0
-mv build gazelle-1.0.0
-mv src gazelle-1.0.0
-tar zcvf gazelle-1.0.0.tar.gz gazelle-1.0.0/
-
-#编包
-mv gazelle-1.0.0.tar.gz ~/rpmbuild/SPECS
-cp gazelle.spec ~/rpmbuild/SPECS
-cd ~/rpmbuild/SPECS
-rpmbuild -bb gazelle.spec
-
-#编出的包
-ls ~/rpmbuild/RPMS
-```
+单进程且网卡支持多队列时只需使用liblstack.so有更短的报文路径。其余场景使用ltran进程分发报文到各个线程。
-## Install
-``` sh
+## 安装
+配置openEuler的yum源直接使用yum命令安装
+```sh
#dpdk >= 21.11-2
yum install dpdk
yum install libconfig
-yum install numacttl
+yum install numactl
yum install libboundscheck
yum install libpcap
yum install gazelle
-
```
-## Use
-### 1. 安装ko模块
+## 使用方法
+配置运行环境使用Gazelle加速应用程序步骤如下
+### 1. 使用root权限安装ko
+根据实际情况选择使用ko提供虚拟网口、绑定网卡到用户态功能。
+若使用虚拟网口功能则使用rte_kni.ko
``` sh
-modprobe uio
-insmod /usr/lib/modules/5.10.0-54.0.0.27.oe1.x86_64/extra/dpdk/igb_uio.ko
-insmod /usr/lib/modules/5.10.0-54.0.0.27.oe1.x86_64/extra/dpdk/rte_kni.ko carrier="on"
+modprobe rte_kni carrier="on"
+```
+网卡从内核驱动绑为用户态驱动的ko根据实际情况选择一种
+``` sh
+#若IOMMU能使用
+modprobe vfio-pci
+
+#若IOMMU不能使用且VFIO支持noiommu
+modprobe vfio enable_unsafe_noiommu_mode=1
+modprobe vfio-pci
+
+#其它情况
+modprobe igb_uio
```
+
### 2. dpdk绑定网卡
-- 对于虚拟网卡或一般物理网卡绑定到驱动igb_uio
+将网卡绑定到步骤1选择的驱动。为用户态网卡驱动提供网卡资源访问接口。
``` sh
+#使用vfio-pci
+dpdk-devbind -b vfio-pci enp3s0
+
+#使用igb_uio
dpdk-devbind -b igb_uio enp3s0
```
-- 1822网卡绑定到驱动vfio-pci由kernel提供
+
+### 3. 大页内存配置
+Gazelle使用大页内存提高效率。使用root权限配置系统预留大页内存可选用任意页大小。因每页内存都需要一个fd使用内存较大时建议使用1G的大页避免占用过多fd。
+根据实际情况,选择一种页大小,配置足够的大页内存即可。配置大页操作如下:
``` sh
-modprobe vfio-pci
-dpdk-devbind -b vfio-pci enp3s0
-```
+#配置2M大页内存在node0上配置 2M * 1024 = 2G
+echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
-### 3. 大页内存配置
-dpdk提供了高效的大页内存管理和共享机制gazelle的报文数据、无锁队列等都使用了大页内存。大页内存需要root用户配置。2M或1G大页按实际需要配置推荐使用2M大页内存该内存是本机上ltran和所有lstack可以使用的总内存具体方法如下
-- 2M大页配置
- - 配置系统大页数量
- ``` sh
- #示例在node0上配置2M * 2000 = 4000M
- echo 2000 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
- echo 0 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
- echo 0 > /sys/devices/system/node/node2/hugepages/hugepages-2048kB/nr_hugepages
- echo 0 > /sys/devices/system/node/node3/hugepages/hugepages-2048kB/nr_hugepages
- # 查看配置结果
- grep Huge /proc/meminfo
- ```
-- 1G大页配置
-1G大页配置方法与2M类似
- - 配置系统大页数量
- ``` sh
- #示例在node0上配置1G * 5 = 5G
- echo 5 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages
- ```
+#配置1G大页内存在node0上配置1G * 5 = 5G
+echo 5 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages
+
+#查看配置结果
+grep Huge /proc/meminfo
+```
### 4. 挂载大页内存
-创建两个目录分别给lstack的进程、ltran进程使用。操作步骤如下
+创建两个目录分别给lstack的进程、ltran进程访问大页内存使用。操作步骤如下
``` sh
mkdir -p /mnt/hugepages
mkdir -p /mnt/hugepages-2M
@@ -94,34 +79,35 @@ mount -t hugetlbfs nodev /mnt/hugepages
mount -t hugetlbfs nodev /mnt/hugepages-2M
```
-### 5. 应用程序从内核协议栈切换至用户态协议栈
-+ 一种方式:重新编译程序
-修改应用的makefile文件使其链接liblstack.so。示例如下
-``` makefile
-#在makefile中添加
-ifdef USE_GAZELLE
- -include /etc/gazelle/lstack.Makefile
-endif
-gcc test.c -o test $(LSTACK_LIBS)
+### 5. 应用程序使用Gazelle
+有两种使能Gazelle方法根据需要选择其一
+- 重新编译应用程序链接Gazelle的库
+修改应用makefile文件链接liblstack.so示例如下
```
+#makefile中添加Gazelle的Makefile
+-include /etc/gazelle/lstack.Makefile
-+ 另一个方式使用LD_PRELOAD
+#编译添加LSTACK_LIBS变量
+gcc test.c -o test ${LSTACK_LIBS}
```
-GAZELLE_BIND_PROCNAME=test(具体进程名) LD_PRELOAD=/usr/lib64/liblstack.so ./test
+
+- 使用LD_PRELOAD加载Gazelle的库
+GAZELLE_BIND_PROCNAME环境变量指定进程名LD_PRELOAD指定Gazelle库路径
+```
+GAZELLE_BIND_PROCNAME=test LD_PRELOAD=/usr/lib64/liblstack.so ./test
```
### 6. 配置文件
-- lstack.conf用于指定lstack的启动参数Gazelle发布件会包括ltran.conf供用户参考路径为/etc/gazelle/lstack.conf, 配置文件参数如下
+- lstack.conf用于指定lstack的启动参数默认路径为/etc/gazelle/lstack.conf, 配置文件参数如下
|选项|参数格式|说明|
|:---|:---|:---|
|dpdk_args|--socket-mem必需<br>--huge-dir必需<br>--proc-type必需<br>--legacy-mem<br>--map-perfect<br>等|dpdk初始化参数参考dpdk说明|
|use_ltran| 0/1 | 是否使用ltran |
-|num_cpus|"0,2,4 ..."|lstack线程绑定的cpu编号编号的数量为lstack线程个数(小于等于网卡多队列数量),仅在use_ltran=0时生效,如果机器不支持网卡多队列lstack线程数量应该为1|
-|num_weakup|"1,3,5 ..."|weakup线程绑定的cpu编号编号的数量为weakup线程个数与lstack线程的数量保持一致|
-|numa_bind|0/1|是否支持将用户线程绑定到与某lstack线程相同numa内|
+|num_cpus|"0,2,4 ..."|lstack线程绑定的cpu编号编号的数量为lstack线程个数(小于等于网卡多队列数量)。可按NUMA选择cpu|
+|num_wakeup|"1,3,5 ..."|wakeup线程绑定的cpu编号编号的数量为wakeup线程个数与lstack线程的数量保持一致。与numcpus选择对应NUMA的cpu。不配置则为不使用唤醒线程|
|low_power_mode|0/1|是否开启低功耗模式,暂不支持|
-|kni_swith|0/1|rte_kni开关默认为0|
+|kni_swith|0/1|rte_kni开关默认为0。只有不使用ltran时才能开启|
|host_addr|"192.168.xx.xx"|协议栈的IP地址必须和redis-server配置<br>文件里的“bind”字段保存一致。|
|mask_addr|"255.255.xx.xx"|掩码地址|
|gateway_addr|"192.168.xx.1"|网关地址|
@@ -137,10 +123,8 @@ kni_switch=0
low_power_mode=0
-num_cpus="2"
-num_weakup="3"
-
-numa_bind=1
+num_cpus="2,22"
+num_wakeup="3,23"
host_addr="192.168.1.10"
mask_addr="255.255.255.0"
@@ -148,7 +132,7 @@ gateway_addr="192.168.1.1"
devices="aa:bb:cc:dd:ee:ff"
```
-- ltran.conf用于指定ltran启动的参数Gazelle发布件会包括ltran.conf供用户参考路径为/etc/gazelle/ltran.conf仅在lstack.conf内配置use_ltran=1时生效,配置文件格式如下
+- ltran.conf用于指定ltran启动的参数默认路径为/etc/gazelle/ltran.conf。使用ltran时lstack.conf内配置use_ltran=1,配置参数如下:
|功能分类|选项|参数格式|说明|
|:---|:---|:---|:---|
@@ -182,24 +166,26 @@ bond_macs="aa:bb:cc:dd:ee:ff"
bond_ports="0x1"
tcp_conn_scan_interval=10
-```
-### 7. 启动
-- 不使用ltran模式(use_ltran=0)时不需要启动ltran
-- 启动ltran如果不指定--config-file则使用默认路径/etc/gazelle/ltran.conf
+```
+### 7. 启动应用程序
+- 启动ltran进程
+单进程且网卡支持多队列则直接使用网卡多队列分发报文到各线程不启动ltran进程lstack.conf的use_ltran配置为0.
+启动ltran时不使用-config-file指定配置文件则使用默认路径/etc/gazelle/ltran.conf
``` sh
ltran --config-file ./ltran.conf
```
-- 启动redis如果不指定环境变量LSTACK_CONF_PATH则使用默认路径/etc/gazelle/lstack.conf
+- 启动应用程序
+启动应用程序前不使用环境变量LSTACK_CONF_PATH指定配置文件则使用默认路径/etc/gazelle/lstack.conf
``` sh
export LSTACK_CONF_PATH=./lstack.conf
-redis-server redis.conf
+LD_PRELOAD=/usr/lib64/liblstack.so GAZELLE_BIND_PROCNAME=redis-server redis-server redis.conf
```
### 8. API
-liblstack.so编译进应用程序后wrap网络编程标准接口应用程序无需修改代码。
+Gazelle wrap应用程序POSIX接口应用程序无需修改代码。
-### 9. gazellectl
-- 不使用ltran模式时不支持gazellectl ltran xxx命令以及-r, rate命令
+### 9. 调测命令
+- 不使用ltran模式时不支持gazellectl ltran xxx命令以及lstack -r命令
```
Usage: gazellectl [-h | help]
or: gazellectl ltran {quit | show} [LTRAN_OPTIONS] [time]
@@ -228,56 +214,50 @@ Usage: gazellectl [-h | help]
#### 1. dpdk配置文件的位置
如果是root用户dpdk启动后的配置文件将会放到/var/run/dpdk目录下;
如果是非root用户dpdk配置文件的路径将由环境变量XDG_RUNTIME_DIR决定
-+ 如果XDG_RUNTIME_DIR为空dpdk配置文件放到/tmp/dpdk目录下
-+ 如果XDG_RUNTIME_DIR不为空dpdk配置文件放到变量XDG_RUNTIME_DIR下
-+ 注意有些机器会默认设置XDG_RUNTIME_DIR
+- 如果XDG_RUNTIME_DIR为空dpdk配置文件放到/tmp/dpdk目录下
+- 如果XDG_RUNTIME_DIR不为空dpdk配置文件放到变量XDG_RUNTIME_DIR下
+- 注意有些机器会默认设置XDG_RUNTIME_DIR
+
+## 约束限制
-## Constraints
-- 提供的命令行、配置文件以及配置大页内存需要root权限执行或修改。非root用户使用需先提权以及修改文件权限。
-- 若要把用户态网卡绑回内核驱动必须先将Gazelle退出。
+使用 Gazelle 存在一些约束限制:
+#### 功能约束
- 不支持accept阻塞模式或者connect阻塞模式。
-- 最多只支持1500个连接。
-- 协议栈当前只支持tcp、icmp、arp、ipv4。
-- 大页内存不支持在挂载点里创建子目录重新挂载。
-- 在对端ping时要求指定报文长度小于等于14000。
+- 最多支持1500个TCP连接。
+- 当前仅支持TCP、ICMP、ARP、IPv4 协议。
+- 在对端ping Gazelle时要求指定报文长度小于等于14000B。
- 不支持使用透明大页。
-- 需要保证ltran的可用大页内存 >=1G
-- 需要保证应用实例协议栈线程的可用大页内存 >=800M
-- 不支持32位系统使用。
- ltran不支持使用多种类型的网卡混合组bond。
- ltran的bond1主备模式只支持链路层故障主备切换例如网线断开不支持物理层故障主备切换例如网卡下电、拔网卡
-- 构建X86版本使用-march=native选项基于构建环境的CPUIntel® Xeon® Gold 5118 CPU @ 2.30GHz指令集进行优化。要求运行环境CPU支持SSE4.2、AVX、AVX2、AVX-512指令集。
-- 最大IP分片数为10ping最大包长14790TCP协议不使用IP分片。
-- sysctl配置网卡rp_filter参数为1否则可能使用内核协议栈
-- 虚拟机网卡不支持多队列。
-- 不使用ltran模式kni网口只支持本地通讯使用且需要启动前配置NetworkManager不管理kni网卡
-- 虚拟kni网口的ip及mac地址需要与lstack配置文件保持一致
-- gazelle运行过程中不允许删除运行文件如果删除需要重启gazelle
-- lstack配置的ip需要与应用程序的ip保持一致
-
-## Security risk note
-gazelle有如下安全风险用户需要评估使用场景风险
-1. 共享内存
+- 虚拟机网卡不支持多队列。
+#### 操作约束
+- 提供的命令行、配置文件默认root权限。非root用户使用需先提权以及修改文件所有者。
+- 将用户态网卡绑回到内核驱动必须先退出Gazelle。
+- 大页内存不支持在挂载点里创建子目录重新挂载。
+- ltran需要最低大页内存为1GB。
+- 每个应用实例协议栈线程最低大页内存为800MB 。
+- 仅支持64位系统。
+- 构建x86版本的Gazelle使用了-march=native选项基于构建环境的CPUIntel® Xeon® Gold 5118 CPU @ 2.30GHz指令集进行优化。要求运行环境CPU支持 SSE4.2、AVX、AVX2、AVX-512 指令集。
+- 最大IP分片数为10ping 最大包长14790BTCP协议不使用IP分片。
+- sysctl配置网卡rp_filter参数为1否则可能不按预期使用Gazelle协议栈而是依然使用内核协议栈。
+- 不使用ltran模式KNI网口不可配置只支持本地通讯使用且需要启动前配置NetworkManager不管理KNI网卡。
+- 虚拟KNI网口的IP及mac地址需要与lstack.conf配置文件保持一致 。
+
+## 风险提示
+Gazelle可能存在如下安全风险用户需要根据使用场景评估风险。
+
+**共享内存**
- 现状
-大页内存mount至/mnt/hugepages-2M目录链接liblstack.so的进程初始化时在/mnt/hugepages-2M目录下创建文件每个文件对应2M大页内存并mmap这些文件。ltran在收到lstask的注册信息后根据大页内存配置信息也mmap目录下文件实现大页内存共享。
-ltran在/mnt/hugepages目录的大页内存同理。
-- 当前消减措施
-大页文件权限600只有OWNER用户才能访问文件默认root用户支持配置成其它用户
-大页文件有dpdk文件锁不能直接写或者mmap。
-- 风险点
-属于同一用户的恶意进程模仿DPDK实现逻辑通过大页文件共享大页内存写破坏大页内存导致gazelle程序crash。建议用户下的进程属于同一信任域。
-2. 流量限制
-- 风险点
-gazelle没有做流量限制用户有能力发送最大网卡线速流量的报文到网络。
-3. 进程仿冒
-- 风险点
-合法注册到ltran的两个lstack进程进程A可仿冒进程B发送仿冒消息给ltran修改ltran的转发控制信息造成进程B通讯异常进程B报文转发给进程A等问题。建议lstack进程都为可信任进程。
-
-## How to Contribute
-We are happy to provide guidance for the new contributors.
-Please sign the CLA before contributing.
-
-## Licensing
-gazelle is licensed under the Mulan PSL v2.
-
-
+ 大页内存 mount 至 /mnt/hugepages-2M 目录,链接 liblstack.so 的进程初始化时在 /mnt/hugepages-2M 目录下创建文件,每个文件对应 2M 大页内存,并 mmap 这些文件。ltran 在收到 lstask 的注册信息后,根据大页内存配置信息也 mmap 目录下文件,实现大页内存共享。
+ ltran 在 /mnt/hugepages 目录的大页内存同理。
+- 当前消减措施
+ 大页文件权限 600只有 OWNER 用户才能访问文件,默认 root 用户,支持配置成其它用户;
+ 大页文件有 DPDK 文件锁,不能直接写或者映射。
+- 风险点
+ 属于同一用户的恶意进程模仿DPDK实现逻辑通过大页文件共享大页内存写破坏大页内存导致Gazelle程序crash。建议用户下的进程属于同一信任域。
+
+**流量限制**
+Gazelle没有做流量限制用户有能力发送最大网卡线速流量的报文到网络可能导致网络流量拥塞。
+
+**进程仿冒**
+合法注册到ltran的两个lstack进程进程A可仿冒进程B发送仿冒消息给ltran修改ltran的转发控制信息造成进程B通讯异常进程B报文转发给进程A信息泄露等问题。建议lstack进程都为可信任进程。
--
2.23.0

View File

@ -1,40 +0,0 @@
From 94a5043e03d3d83b661af64c3723d5f775c10706 Mon Sep 17 00:00:00 2001
From: zhangqiang <zhangqiang@kylinos.cn>
Date: Fri, 1 Jul 2022 01:26:09 +0800
Subject: [PATCH 3/6] =?UTF-8?q?<bugfix><https://gitee.com/src-openeuler/ga?=
=?UTF-8?q?zelle/issues/I5643C>=20=E6=8C=89=E7=85=A7POSIX=E6=A0=87?=
=?UTF-8?q?=E5=87=86,sigaction=E5=87=BD=E6=95=B0act=3D=3DNULL,=E8=B0=83?=
=?UTF-8?q?=E7=94=A8=E8=80=85=E5=8F=AF=E4=BB=A5=E9=80=9A=E8=BF=87oldact?=
=?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=B9=8B=E5=89=8D=E7=9A=84=E4=BF=A1=E5=8F=B7?=
=?UTF-8?q?action=20=E6=8C=89=E7=85=A7lstack=E7=9A=84=E7=90=86=E8=A7=A3,?=
=?UTF-8?q?=E5=AE=83HOOK=20sigaction=E5=87=BD=E6=95=B0,=E6=98=AF=E5=BD=93?=
=?UTF-8?q?=E8=B0=83=E7=94=A8=E8=80=85=E8=AE=BE=E7=BD=AE=E6=96=B0=E7=9A=84?=
=?UTF-8?q?=E4=BF=A1=E5=8F=B7=E5=87=BD=E6=95=B0=E4=B8=BA=E7=BC=BA=E7=9C=81?=
=?UTF-8?q?=E5=A4=84=E7=BD=AE=E8=A1=8C=E4=B8=BA=E6=97=B6,=E5=AF=B9?=
=?UTF-8?q?=E6=8C=87=E5=AE=9A=E4=BF=A1=E5=8F=B7=E8=BF=9B=E8=A1=8C=E6=8B=A6?=
=?UTF-8?q?=E6=88=AA,=E8=AF=A5=E6=94=B9=E5=8A=A8=E4=B8=8D=E5=BD=B1?=
=?UTF-8?q?=E5=93=8D=E5=8E=9F=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/lstack/api/lstack_signal.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lstack/api/lstack_signal.c b/src/lstack/api/lstack_signal.c
index 87cbdda..4dba472 100644
--- a/src/lstack/api/lstack_signal.c
+++ b/src/lstack/api/lstack_signal.c
@@ -78,7 +78,7 @@ int lstack_sigaction(int sig_num, const struct sigaction *action, struct sigacti
{
struct sigaction new_action;
- if ((match_hijack_signal(sig_num) != 0) && (action->sa_handler == SIG_DFL)) {
+ if ((match_hijack_signal(sig_num) != 0) && (action && action->sa_handler == SIG_DFL)) {
new_action = *action;
new_action.sa_flags |= SA_RESETHAND;
new_action.sa_handler = lstack_sig_default_handler;
--
2.23.0

View File

@ -1,332 +0,0 @@
From 5249ab9e033d2f02ca78eca1b96db540f9990641 Mon Sep 17 00:00:00 2001
From: xiusailong <xiusailong@huawei.com>
Date: Wed, 29 Jun 2022 11:28:10 +0800
Subject: [PATCH 4/6] update README.md
---
README.md | 10 +-
...50\346\210\267\346\214\207\345\215\227.md" | 159 +++++++-----------
2 files changed, 62 insertions(+), 107 deletions(-)
diff --git a/README.md b/README.md
index 61f298c..3c1487c 100644
--- a/README.md
+++ b/README.md
@@ -75,12 +75,12 @@ mkdir -p /mnt/hugepages
mkdir -p /mnt/hugepages-2M
chmod -R 700 /mnt/hugepages
chmod -R 700 /mnt/hugepages-2M
-mount -t hugetlbfs nodev /mnt/hugepages
-mount -t hugetlbfs nodev /mnt/hugepages-2M
+mount -t hugetlbfs nodev /mnt/hugepages -o pagesize=2M
+mount -t hugetlbfs nodev /mnt/hugepages-2M -o pagesize=2M
```
### 5. 应用程序使用Gazelle
-有两种使能Gazelle方法根据需要选择其一
+有两种使用Gazelle方法根据需要选择其一
- 重新编译应用程序链接Gazelle的库
修改应用makefile文件链接liblstack.so示例如下
```
@@ -256,8 +256,8 @@ Gazelle可能存在如下安全风险用户需要根据使用场景评估风
- 风险点
属于同一用户的恶意进程模仿DPDK实现逻辑通过大页文件共享大页内存写破坏大页内存导致Gazelle程序crash。建议用户下的进程属于同一信任域。
-**流量限制**
+**流量限制**
Gazelle没有做流量限制用户有能力发送最大网卡线速流量的报文到网络可能导致网络流量拥塞。
-**进程仿冒**
+**进程仿冒**
合法注册到ltran的两个lstack进程进程A可仿冒进程B发送仿冒消息给ltran修改ltran的转发控制信息造成进程B通讯异常进程B报文转发给进程A信息泄露等问题。建议lstack进程都为可信任进程。
diff --git "a/doc/gazelle-\347\224\250\346\210\267\346\214\207\345\215\227.md" "b/doc/gazelle-\347\224\250\346\210\267\346\214\207\345\215\227.md"
index bfe0f7c..3f40bf1 100644
--- "a/doc/gazelle-\347\224\250\346\210\267\346\214\207\345\215\227.md"
+++ "b/doc/gazelle-\347\224\250\346\210\267\346\214\207\345\215\227.md"
@@ -1,54 +1,52 @@
-[toc]
+# gazelle-用户指南
-# 1 简介
+## 1 简介
EulerOS提供了利用Gazelle runtime优化数据库服务性能的完整解决方案Gazelle
runtime基于bypass内核的架构设计能够提供更高性能运行环境优化服务软件性
能,可以很好地满足产品的性能需求。
本文主要介绍Gazelle软件如何安装使用。
-# 2 安装软件包编译应用程序以redis 为例)
+## 2 安装软件包编译应用程序以redis 为例)
-1. 在使用之前需要安装Gazelle软件包。
+在使用之前需要安装Gazelle软件包。
-#### 操作步骤
+### 操作步骤
- Gazelle是高性能用户态协议栈软件包使用如下命令安装Gazelle软件包
+Gazelle是高性能用户态协议栈软件包使用如下命令安装Gazelle软件包
```
- yum install gazelle
+yum install gazelle
```
-#### 安装正确性验证
+### 安装正确性验证
- 1. 安装完成后使用“rpm -qa | grep -E gazelle”命令确认是否已经正确安装。示例如下
+1. 安装完成后使用“rpm -qa | grep -E gazelle”命令确认是否已经正确安装。示例如下
- 如果已正确安装则结果显示如下:
+如果已正确安装则结果显示如下:
```
- gazelle-1.0.0-h1.eulerosv2r10.aarch64
+gazelle-1.0.0-h1.eulerosv2r10.aarch64
```
2. 确认以下dpdk组件是否存在
```
-
- /lib/modules/4.19.90-vhulk2007.2.0.h188.eulerosv2r10.aarch64/extra/dpdk/igb_uio.ko
- /usr/share/dpdk
- /usr/share/dpdk/usertools/dpdk-devbind.py
+rpm -ql dpdk | grep igb_uio
+/usr/share/dpdk
+/usr/share/dpdk/usertools/dpdk-devbind.py
```
3. 确认以下Gazelle组件是否存在
-
-```
- /usr/bin/gazellectl
- /usr/bin/ltran
- /usr/lib64/liblstack.so
- /etc/gazelle/ltran.conf
- /etc/gazelle/lstack.conf
- /etc/gazelle/lstack.Makefile
+```
+/usr/bin/gazellectl
+/usr/bin/ltran
+/usr/lib64/liblstack.so
+/etc/gazelle/ltran.conf
+/etc/gazelle/lstack.conf
+/etc/gazelle/lstack.Makefile
```
-#### 链接Gazelle编译redis-server
+### 链接Gazelle编译redis-server
1. 获取开源redis代码更改redis/src/Makefile文件使其链接lstack示例如下
@@ -78,10 +76,10 @@ index 4b2a31c..92fa17d 100644
2. 编译redis
- ```
- localhost:/euler/zyk/serverless/lredis/src # make distclean
- localhost:/euler/zyk/serverless/lredis/src # make USE_GAZELLE=1 -j32
- ```
+ ```
+ localhost:/euler/zyk/serverless/lredis/src # make distclean
+ localhost:/euler/zyk/serverless/lredis/src # make USE_GAZELLE=1 -j32
+ ```
#### 注意
@@ -89,7 +87,7 @@ index 4b2a31c..92fa17d 100644
支持LD_PRELOAD方式免编译使用gazelle可跳过编译应用程序步骤。
-#3 设置配置文件以redis为例
+## 3 设置配置文件以redis为例
安装完软件包后运行Gazelle服务需要设置必要的配置文件。
@@ -168,13 +166,13 @@ tcp_conn_scan_interval=10
redis.conf为redis服务的配置文件可以参考开源的配置文件需要注意的是redis.conf侦听的ip必须和其使用的lstack.conf里面的host_addr值保持一致。
-# 4 环境初始化
+## 4 环境初始化
配置文件完成后需要配置大页、插入igb_uio.ko、绑定dpdk网卡等环境初始化工作才可以运行Gazelle服务。
**说明igb_uio.ko依赖于uio.ko需要用户先确保已安装uio.ko模块。**
-#### 操作步骤
+### 操作步骤
1. **配置大页内存**
@@ -203,68 +201,24 @@ tcp_conn_scan_interval=10
将需要通信的网卡绑定到dpdk示例如下
```
- [root@ARM159server usertools]# ./dpdk-devbind.py --bind=igb_uio eth4
+[root@ARM159server usertools]# dpdk-devbind.py --bind=igb_uio eth4
```
如果是1822网卡必须绑定vfio-pci驱动
-```
- [root@ARM159server usertools]# ./dpdk-devbind.py --bind=vfio-pci eth4
-```
-
-4. **一键部署脚本使用**
-
- 提供gazelle_setup脚本用于快速自动化部署gazelle运行环境。
-
- 一键部署脚本执行示例:
-
-```
- gazelle_setup.sh i/--nic eth0 n/--numa 1024,1024 d/--daemon 1/0 k/--kni 1/0 l/--lowpower 1/0 --ltrancore 0,1 --lstackcore 2-3
-```
-
- 参数描述:
-
- -i/--nic设置待绑定网卡此参数必须配置且网卡需要有ip、路由和网关等必须参数否则会读取配置失败必选。
-
- -n/--numalstack大页内存不包括ltran的ltran默认为1024Msetup脚本不对其做修改根据numa节点配置并用","(英文的逗号)分离这里需要根据系统环境内存配置对应的大小默认为1024 可选。
-
- -d/--daemon是否开启deamon模式开启为1关闭为0默认为1可选。
-
- -k/--kni是否开启kni开启为1关闭为0默认为0可选。
-
- -l/--lowpower是否开启低功耗模式开启为1关闭为0默认为0可选。
-
- --ltrancoreltran的绑核参数参考dpdk的参数配置此处不做参数校验默认为0,1可选。
-
- --lstackcorelstack的绑核参数同--ltrancore默认为2可选。
-
- **说明**
-
- 1. gazelle_setup.sh支持非root用户启动即执行脚本对应的用户及用户组
- 2. 默认配置文件的目录为:/etc/gazelle。
- 3. gazelle_setup.sh会按照启动参数生成lstack.conf对于lstack多进程场景若多进程要使用不同配置文件则需要自己拷贝修改每个进程的lstack.conf。
- 4. 部署脚本会启动ltran进程。
-
- 一键退出脚本执行实例:
```
- gazelle_exit.sh
+[root@ARM159server usertools]# dpdk-devbind.py --bind=vfio-pci eth4
```
- **说明**
-
- 若启动了ltran的守护任务gazelle_setup.sh指定了 -d/--daemon 1那么在杀死ltran之后守护任务仍会将ltran拉起所以此时若要完全退出ltran需要执行gazelle_exit.sh。
-
-
+## 5 运行Gazelle
-# 5 运行Gazelle
-
-#### 前提条件
+### 前提条件
- 已完成软件包的安装。
- 已设置完配置文件。
- 已初始化环境。
-#### 操作步骤
+### 操作步骤
1. **启动ltran**
@@ -275,21 +229,22 @@ tcp_conn_scan_interval=10
**说明一键部署脚本已启动ltran若使用一键部署脚本无需此步骤。**
```
- [root@localhost deploy_open_source]# ltran --config-file /usr/share/gazelle/ltran.confEAL: Detected 96 lcore(s)
- EAL: Detected 4 NUMA nodes
- EAL: Multi-process socket /var/run/dpdk/(null)/mp_socket
- EAL: Selected IOVA mode 'PA'
- EAL: No free hugepages reported in hugepages-2048kB
- EAL: No free hugepages reported in hugepages-2048kB
- EAL: No free hugepages reported in hugepages-2048kB
- EAL: No available hugepages reported in hugepages-1048576kB
- EAL: Probing VFIO support...
- EAL: VFIO support initialized
- EAL: PCI device 0000:03:00.0 on NUMA socket 0......
- EAL: Finished Process ltran_core_init.
- EAL: Finished Process ctrl_thread_fn.
- EAL: Finished Process client_rx_buf_init.
- EAL: Runing Process forward.
+[root@localhost deploy_open_source]# ltran --config-file /usr/share/gazelle/ltran.conf
+EAL: Detected 96 lcore(s)
+EAL: Detected 4 NUMA nodes
+EAL: Multi-process socket /var/run/dpdk/(null)/mp_socket
+EAL: Selected IOVA mode 'PA'
+EAL: No free hugepages reported in hugepages-2048kB
+EAL: No free hugepages reported in hugepages-2048kB
+EAL: No free hugepages reported in hugepages-2048kB
+EAL: No available hugepages reported in hugepages-1048576kB
+EAL: Probing VFIO support...
+EAL: VFIO support initialized
+EAL: PCI device 0000:03:00.0 on NUMA socket 0......
+EAL: Finished Process ltran_core_init.
+EAL: Finished Process ctrl_thread_fn.
+EAL: Finished Process client_rx_buf_init.
+EAL: Runing Process forward.
```
2. **启动redis**
@@ -367,7 +322,7 @@ GAZELLE_BIND_PROCNAME=benchmark_ker GAZELLE_BIND_THREADNAME=disp LD_PRELOAD=/lib
1. 不支持使用export方式单独声明LD_PRELOAD环境变量。
2. GAZELLE_BIND_PROCNAME指定lstack绑定的进程名称GAZELLE_BIND_THREADNAME指定lstack绑定的进程中的具体线程名且支持字串匹配如设置disp表示进程中所有线程名包含disp 字串的线程都会绑定lstack。
-# 6 最佳性能配置
+## 6 最佳性能配置
为获得最佳的性能Gazelle在启动时对cpu和内存配置有一定要求。最佳性能配置如下
@@ -377,7 +332,7 @@ GAZELLE_BIND_PROCNAME=benchmark_ker GAZELLE_BIND_THREADNAME=disp LD_PRELOAD=/lib
4. 应用进程绑核可提高性能与网卡同一个numa节点对应的核如果有空闲应当优先绑定。
5. Gazelle的网络高性能只有在远程访问的时候才有保证本机的tcp连接功能也支持但如果本机有频繁的数据访问会导致实例整体性能下降不建议这么部署。
-# 7 使用约束
+## 7 使用约束
1. Gazelle提供的命令行及配置文件仅root权限开源执行或修改。配置大页内存需要root用户执行操作。
2. 在将网卡绑定到igb_uio后禁止将网卡绑回ixgbe。
@@ -408,7 +363,7 @@ GAZELLE_BIND_PROCNAME=benchmark_ker GAZELLE_BIND_THREADNAME=disp LD_PRELOAD=/lib
-# 8 升级说明
+## 8 升级说明
后续升级需要变更的组件包括ltran、liblstack.so、gazellectl、lstack.Makefile、lstack.conf、ltran.conf、gazelle_setup.sh、gazelle_exit.sh、gazelle_crontab.sh、gazelle_common.sh。
@@ -436,9 +391,9 @@ GAZELLE_BIND_PROCNAME=benchmark_ker GAZELLE_BIND_THREADNAME=disp LD_PRELOAD=/lib
-#9 调测工具
+## 9 调测工具
-##9.1 获取ltran统计数据说明
+### 9.1 获取ltran统计数据说明
#### 概述
@@ -501,7 +456,7 @@ GAZELLE_BIND_PROCNAME=benchmark_ker GAZELLE_BIND_THREADNAME=disp LD_PRELOAD=/lib
-## 9.2 获取Lstack统计数据说明
+### 9.2 获取Lstack统计数据说明
#### 概述
@@ -553,4 +508,4 @@ lstack作为网络协议栈底座使用时必须指定需要获取的lstack
```
gazellectl lstack set {client_ip} lowpower {0 | 1}1:enable lowpower mode
-```
\ No newline at end of file
+```
--
2.23.0

View File

@ -1,28 +0,0 @@
From 0f37499d7922d59fa46b7961bde36ab0b20eac62 Mon Sep 17 00:00:00 2001
From: Honggang LI <honggangli@163.com>
Date: Thu, 23 Jun 2022 13:56:31 +0800
Subject: [PATCH 5/6] ltran: fix use-after-free issue
Signed-off-by: Honggang LI <honggangli@163.com>
---
src/ltran/ltran_timer.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ltran/ltran_timer.c b/src/ltran/ltran_timer.c
index 29b307c..1327203 100644
--- a/src/ltran/ltran_timer.c
+++ b/src/ltran/ltran_timer.c
@@ -63,9 +63,9 @@ void gazelle_detect_sock_logout(struct gazelle_tcp_sock_htable *tcp_sock_htable)
hlist_del_init(&tcp_sock->tcp_sock_node);
tcp_sock_htable->cur_tcp_sock_num--;
tcp_sock_htable->array[i].chain_size--;
- free(tcp_sock);
LTRAN_DEBUG("delete the tcp sock htable: tid %u ip %u port %u\n",
tcp_sock->tid, tcp_sock->ip, (uint32_t)ntohs(tcp_sock->port));
+ free(tcp_sock);
}
}
}
--
2.23.0

File diff suppressed because it is too large Load Diff

View File

@ -1,351 +0,0 @@
From 5c44c739f651e295141c096bf676cc3bc7ce7460 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Thu, 7 Jul 2022 22:21:34 +0800
Subject: [PATCH 01/19] ltran support checksum
---
src/common/dpdk_common.c | 44 ++++++++++++++
src/common/dpdk_common.h | 4 ++
src/common/gazelle_reg_msg.h | 2 +
src/lstack/core/lstack_control_plane.c | 4 ++
src/lstack/core/lstack_dpdk.c | 67 +++-------------------
src/lstack/include/lstack_protocol_stack.h | 2 +
src/ltran/ltran_ethdev.c | 48 +++++++++++-----
src/ltran/ltran_instance.c | 3 +
src/ltran/ltran_param.h | 2 +
9 files changed, 102 insertions(+), 74 deletions(-)
diff --git a/src/common/dpdk_common.c b/src/common/dpdk_common.c
index 63dcfc1..939d135 100644
--- a/src/common/dpdk_common.c
+++ b/src/common/dpdk_common.c
@@ -15,6 +15,7 @@
#include <rte_ethdev.h>
#include <rte_bus_pci.h>
#include <rte_mbuf.h>
+#include <rte_ethdev.h>
#include <securec.h>
#include "dpdk_common.h"
@@ -87,6 +88,49 @@ static int32_t kni_config_network_interface(uint16_t port_id, uint8_t if_up)
return ret;
}
+void eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_info *dev_info)
+{
+ uint64_t rx_ol = 0;
+ uint64_t tx_ol = 0;
+ uint64_t rx_ol_capa = dev_info->rx_offload_capa;
+ uint64_t tx_ol_capa = dev_info->tx_offload_capa;
+
+ // rx ip
+ if (rx_ol_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) {
+ rx_ol |= DEV_RX_OFFLOAD_IPV4_CKSUM;
+ COMMON_INFO("DEV_RX_OFFLOAD_IPV4_CKSUM\n");
+ }
+
+ if (rx_ol_capa & DEV_RX_OFFLOAD_TCP_CKSUM) {
+ rx_ol |= DEV_RX_OFFLOAD_TCP_CKSUM;
+ COMMON_INFO("DEV_RX_OFFLOAD_TCP_CKSUM\n");
+ }
+
+ // tx ip
+ if (tx_ol_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) {
+ tx_ol |= DEV_TX_OFFLOAD_IPV4_CKSUM;
+ COMMON_INFO("DEV_TX_OFFLOAD_IPV4_CKSUM\n");
+ }
+
+ // tx tcp
+ if (tx_ol_capa & DEV_TX_OFFLOAD_TCP_CKSUM) {
+ tx_ol |= DEV_TX_OFFLOAD_TCP_CKSUM;
+ COMMON_INFO("DEV_TX_OFFLOAD_TCP_CKSUM\n");
+ }
+
+ if (!(rx_ol & DEV_RX_OFFLOAD_TCP_CKSUM) || !(rx_ol & DEV_RX_OFFLOAD_IPV4_CKSUM)) {
+ rx_ol = 0;
+ }
+ if (!(tx_ol & DEV_TX_OFFLOAD_TCP_CKSUM) || !(tx_ol & DEV_TX_OFFLOAD_IPV4_CKSUM)) {
+ tx_ol = 0;
+ }
+
+ conf->rxmode.offloads = rx_ol;
+ conf->txmode.offloads = tx_ol;
+
+ COMMON_INFO("set checksum offloads\n");
+}
+
int32_t dpdk_kni_init(uint16_t port, struct rte_mempool *pool)
{
int32_t ret;
diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h
index 4a7bd37..6a6a030 100644
--- a/src/common/dpdk_common.h
+++ b/src/common/dpdk_common.h
@@ -67,6 +67,10 @@ int32_t dpdk_kni_init(uint16_t port, struct rte_mempool *pool);
int32_t kni_process_tx(struct rte_mbuf **pkts_burst, uint32_t count);
void kni_process_rx(uint16_t port);
+struct rte_eth_conf;
+struct rte_eth_dev_info;
+void eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_info *dev_info);
+
/*
gazelle custom rte ring interface
lightweight ring reduce atomic and smp_mb.
diff --git a/src/common/gazelle_reg_msg.h b/src/common/gazelle_reg_msg.h
index ff846fd..f5842e7 100644
--- a/src/common/gazelle_reg_msg.h
+++ b/src/common/gazelle_reg_msg.h
@@ -94,6 +94,8 @@ struct reg_response_msg {
struct {
uintptr_t base_virtaddr;
uint64_t socket_size;
+ uint64_t rx_offload;
+ uint64_t tx_offload;
} msg;
};
diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c
index ef38fb5..c86dab1 100644
--- a/src/lstack/core/lstack_control_plane.c
+++ b/src/lstack/core/lstack_control_plane.c
@@ -297,6 +297,10 @@ static int32_t client_reg_proc_memory(bool is_reconnect)
return -1;
}
+ struct protocol_stack_group *stack_group = get_protocol_stack_group();
+ stack_group->rx_offload = recv_msg.msg.rx_offload;
+ stack_group->tx_offload = recv_msg.msg.tx_offload;
+
if (!is_reconnect) {
ret = proc_memory_init(&recv_msg);
if (ret != 0) {
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index 6675d7b..13df6a3 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -313,68 +313,12 @@ static struct eth_params *alloc_eth_params(uint16_t port_id, uint16_t nb_queues)
uint64_t get_eth_params_rx_ol(void)
{
- return use_ltran() ? 0 : get_protocol_stack_group()->eth_params->conf.rxmode.offloads;
+ return get_protocol_stack_group()->rx_offload;
}
uint64_t get_eth_params_tx_ol(void)
{
- return use_ltran() ? 0 : get_protocol_stack_group()->eth_params->conf.txmode.offloads;
-}
-
-static int eth_params_checksum(struct rte_eth_conf *conf, struct rte_eth_dev_info *dev_info)
-{
-#if CHECKSUM_OFFLOAD_ALL
- uint64_t rx_ol = 0;
- uint64_t tx_ol = 0;
-
- uint64_t rx_ol_capa = dev_info->rx_offload_capa;
- uint64_t tx_ol_capa = dev_info->tx_offload_capa;
-
- // rx ip
-#if CHECKSUM_CHECK_IP_HW
- if (rx_ol_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) {
- rx_ol |= DEV_RX_OFFLOAD_IPV4_CKSUM;
- LSTACK_LOG(INFO, LSTACK, "DEV_RX_OFFLOAD_IPV4_CKSUM\n");
- }
-#endif
-
- // rx tcp
-#if CHECKSUM_CHECK_TCP_HW
- if (rx_ol_capa & DEV_RX_OFFLOAD_TCP_CKSUM) {
- rx_ol |= DEV_RX_OFFLOAD_TCP_CKSUM;
- LSTACK_LOG(INFO, LSTACK, "DEV_RX_OFFLOAD_TCP_CKSUM\n");
- }
-#endif
-
- // tx ip
-#if CHECKSUM_GEN_IP_HW
- if (tx_ol_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) {
- tx_ol |= DEV_TX_OFFLOAD_IPV4_CKSUM;
- LSTACK_LOG(INFO, LSTACK, "DEV_TX_OFFLOAD_IPV4_CKSUM\n");
- }
-#endif
-
- // tx tcp
-#if CHECKSUM_GEN_TCP_HW
- if (tx_ol_capa & DEV_TX_OFFLOAD_TCP_CKSUM) {
- tx_ol |= DEV_TX_OFFLOAD_TCP_CKSUM;
- LSTACK_LOG(INFO, LSTACK, "DEV_TX_OFFLOAD_TCP_CKSUM\n");
- }
-#endif
- if (!(rx_ol & DEV_RX_OFFLOAD_TCP_CKSUM) || !(rx_ol & DEV_RX_OFFLOAD_IPV4_CKSUM)) {
- rx_ol = 0;
- }
- if (!(tx_ol & DEV_TX_OFFLOAD_TCP_CKSUM) || !(tx_ol & DEV_TX_OFFLOAD_IPV4_CKSUM)) {
- tx_ol = 0;
- }
-
- conf->rxmode.offloads = rx_ol;
- conf->txmode.offloads = tx_ol;
-
- LSTACK_LOG(INFO, LSTACK, "set checksum offloads\n");
-#endif /* CHECKSUM_OFFLOAD_ALL */
-
- return 0;
+ return get_protocol_stack_group()->tx_offload;
}
static int eth_params_rss(struct rte_eth_conf *conf, struct rte_eth_dev_info *dev_info)
@@ -471,8 +415,11 @@ int32_t dpdk_ethdev_init(void)
}
eth_params_checksum(&eth_params->conf, &dev_info);
int32_t rss_enable = eth_params_rss(&eth_params->conf, &dev_info);
- get_protocol_stack_group()->eth_params = eth_params;
- get_protocol_stack_group()->port_id = eth_params->port_id;
+ struct protocol_stack_group *stack_group = get_protocol_stack_group();
+ stack_group->eth_params = eth_params;
+ stack_group->port_id = eth_params->port_id;
+ stack_group->rx_offload = eth_params->conf.rxmode.offloads;
+ stack_group->tx_offload = eth_params->conf.txmode.offloads;
ret = rte_eth_dev_configure(port_id, nb_queues, nb_queues, &eth_params->conf);
if (ret < 0) {
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index 8a6aa9d..e5eedd7 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -70,6 +70,8 @@ struct protocol_stack_group {
sem_t thread_phase1;
sem_t ethdev_init;
sem_t all_init;
+ uint64_t rx_offload;
+ uint64_t tx_offload;
struct rte_mempool *kni_pktmbuf_pool;
struct eth_params *eth_params;
struct protocol_stack *stacks[PROTOCOL_STACK_MAX];
diff --git a/src/ltran/ltran_ethdev.c b/src/ltran/ltran_ethdev.c
index 7d42fcd..03c692d 100644
--- a/src/ltran/ltran_ethdev.c
+++ b/src/ltran/ltran_ethdev.c
@@ -237,19 +237,31 @@ static int32_t ltran_single_slave_port_init(uint16_t port_num, struct rte_mempoo
uint16_t rx_queue_num = (uint16_t)get_ltran_config()->bond.rx_queue_num;
uint16_t tx_queue_num = (uint16_t)get_ltran_config()->bond.tx_queue_num;
struct rte_eth_dev_info dev_info;
- struct rte_eth_conf port_conf = {0};
uint16_t queue_id;
+ rte_eth_dev_stop(port_num);
+
+ if (rte_eth_dev_info_get(port_num, &dev_info) != 0) {
+ LTRAN_ERR("Fail rte_eth_dev_info_get\n");
+ return GAZELLE_ERR;
+ }
+
+ struct rte_eth_conf port_conf = {0};
+ port_conf.txmode.mq_mode = ETH_MQ_TX_NONE;
+ port_conf.link_speeds = ETH_LINK_SPEED_AUTONEG;
+ eth_params_checksum(&port_conf, &dev_info);
port_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
- rte_eth_dev_stop(port_num);
- int32_t ret = rte_eth_dev_configure(port_num, rx_queue_num, tx_queue_num, &port_conf);
- if (ret != 0) {
- LTRAN_ERR("rte_eth_dev_configure failed in slave port initialize. errno: %d, port: %d\n", ret, port_num);
+ struct ltran_config *ltran_config = get_ltran_config();
+ ltran_config->dpdk.rx_offload = port_conf.rxmode.offloads;
+ ltran_config->dpdk.tx_offload = port_conf.txmode.offloads;
+
+ if (rte_eth_dev_configure(port_num, rx_queue_num, tx_queue_num, &port_conf)) {
+ LTRAN_ERR("rte_eth_dev_configure failed in slave port initialize. errno: %d, port: %hu\n", errno, port_num);
return GAZELLE_ERR;
}
- ret = rte_eth_dev_adjust_nb_rx_tx_desc(port_num, &rx_ring_size, &tx_ring_size);
+ int32_t ret = rte_eth_dev_adjust_nb_rx_tx_desc(port_num, &rx_ring_size, &tx_ring_size);
if (ret != 0) {
LTRAN_ERR("rte_eth_dev_adjust_nb_rx_tx_desc failed in slave port initialize. errno: %d, port: %d \n", ret,
port_num);
@@ -266,7 +278,6 @@ static int32_t ltran_single_slave_port_init(uint16_t port_num, struct rte_mempoo
}
}
- rte_eth_dev_info_get(port_num, &dev_info);
for (queue_id = 0; queue_id < tx_queue_num; queue_id++) {
ret = rte_eth_tx_queue_setup(port_num, queue_id, tx_ring_size, (uint32_t)rte_eth_dev_socket_id(port_num),
&dev_info.default_txconf);
@@ -345,10 +356,25 @@ static int32_t ltran_bond_port_attr_set(uint16_t port_num, uint16_t bond_port_id
uint16_t rx_queue_num = (uint16_t)ltran_config->bond.rx_queue_num;
uint16_t tx_queue_num = (uint16_t)ltran_config->bond.tx_queue_num;
+ int32_t ret = ltran_eth_bond_slave(port_info, port_num, bond_port_id);
+ if (ret < 0) {
+ LTRAN_ERR("rte_eth_bond_slave_add failed with bond port num: %d, errno: %d \n", port_num, ret);
+ return GAZELLE_ERR;
+ }
+
+ struct rte_eth_dev_info dev_info;
+ if (rte_eth_dev_info_get(bond_port_id, &dev_info) != 0) {
+ LTRAN_ERR("faile rte_eth_dev_info_get\n");
+ return GAZELLE_ERR;
+ }
+
struct rte_eth_conf port_conf = {0};
port_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
+ port_conf.txmode.mq_mode = ETH_MQ_TX_NONE;
+ port_conf.link_speeds = ETH_LINK_SPEED_AUTONEG;
+ eth_params_checksum(&port_conf, &dev_info);
- int32_t ret = rte_eth_dev_configure(bond_port_id, rx_queue_num, tx_queue_num, &port_conf);
+ ret = rte_eth_dev_configure(bond_port_id, rx_queue_num, tx_queue_num, &port_conf);
if (ret != 0) {
LTRAN_ERR("rte_eth_dev_configure failed with bond port num: %d, errno: %d \n", port_num, ret);
return GAZELLE_ERR;
@@ -362,12 +388,6 @@ static int32_t ltran_bond_port_attr_set(uint16_t port_num, uint16_t bond_port_id
LTRAN_DEBUG("Bond port adujst rx_ring_size: %hu, tx_ring_size: %hu. bond port num: %hu \n",
rx_ring_size, tx_ring_size, port_num);
- ret = ltran_eth_bond_slave(port_info, port_num, bond_port_id);
- if (ret < 0) {
- LTRAN_ERR("rte_eth_bond_slave_add failed with bond port num: %d, errno: %d \n", port_num, ret);
- return GAZELLE_ERR;
- }
-
ret = ltran_eth_rx_queue_setup(bond_port_id, pktmbuf_rxpool, rx_queue_num, rx_ring_size);
if (ret < 0) {
LTRAN_ERR("rte_eth_rx_queue_setup failed in bond port initialize. errno: %d, port: %d \n", ret, port_num);
diff --git a/src/ltran/ltran_instance.c b/src/ltran/ltran_instance.c
index f8bb43f..15f4bb4 100644
--- a/src/ltran/ltran_instance.c
+++ b/src/ltran/ltran_instance.c
@@ -450,6 +450,7 @@ int32_t handle_reg_msg_proc_mem(int32_t fd, struct reg_request_msg *recv_msg)
struct reg_response_msg send_msg;
struct client_proc_conf *conf = &recv_msg->msg.proc;
struct gazelle_instance *instance = NULL;
+ struct ltran_config *ltran_config = get_ltran_config();
(void)memset_s(&send_msg, sizeof(send_msg), 0, sizeof(send_msg));
@@ -479,6 +480,8 @@ int32_t handle_reg_msg_proc_mem(int32_t fd, struct reg_request_msg *recv_msg)
send_msg.msg.socket_size = instance->socket_size;
send_msg.msg.base_virtaddr = instance->base_virtaddr;
+ send_msg.msg.rx_offload = ltran_config->dpdk.rx_offload;
+ send_msg.msg.tx_offload = ltran_config->dpdk.tx_offload;
send_msg.type = RSP_OK;
ret = write_specied_len(fd, (char *)&send_msg, sizeof(send_msg));
if (ret != 0) {
diff --git a/src/ltran/ltran_param.h b/src/ltran/ltran_param.h
index d3af24e..442694c 100644
--- a/src/ltran/ltran_param.h
+++ b/src/ltran/ltran_param.h
@@ -25,6 +25,8 @@ struct ltran_config {
char **dpdk_argv;
int32_t dpdk_argc;
int32_t kni_switch;
+ uint64_t rx_offload;
+ uint64_t tx_offload;
} dpdk;
struct {
--
2.23.0

View File

@ -1,287 +0,0 @@
From f02d373216f17fa6c9ca500e49d7f05f876d22a2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=B4=8B?= <yyangoO@outlook.com>
Date: Wed, 29 Jun 2022 14:33:23 +0800
Subject: [PATCH 02/19] add examples readme, compile components, main file and
utilities header
---
examples/CMakeLists.txt | 34 ++++++++++++++++++++
examples/README.md | 44 +++++++++++++++++++++++++
examples/inc/parameter.h | 65 +++++++++++++++++++++++++++++++++++++
examples/inc/utilities.h | 69 ++++++++++++++++++++++++++++++++++++++++
examples/main.c | 23 ++++++++++++++
5 files changed, 235 insertions(+)
create mode 100644 examples/CMakeLists.txt
create mode 100644 examples/README.md
create mode 100644 examples/inc/parameter.h
create mode 100644 examples/inc/utilities.h
create mode 100644 examples/main.c
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
new file mode 100644
index 0000000..0fd09ab
--- /dev/null
+++ b/examples/CMakeLists.txt
@@ -0,0 +1,34 @@
+# Copyright (c) 2022-2023. yyangoO.
+# 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.
+
+
+cmake_minimum_required(VERSION 3.12.1)
+
+set(PROJECT_NAME example)
+
+project(${PROJECT_NAME})
+
+message(STATUS "PROJECT_SOURCE_DIR: " ${PROJECT_SOURCE_DIR})
+message(STATUS "PROJECT_BINARY_DIR: " ${PROJECT_BINARY_DIR})
+
+set(CMAKE_C_FLAGS "-O2 -g -fstack-protector-strong -Wall -Werror -pthread")
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D EXAMPLE_COMPILE")
+
+include_directories(${PROJECT_SOURCE_DIR}/inc)
+
+set(HEADERS
+ inc/utilities.h
+ inc/parameter.h
+)
+set(SOURCES
+ main.c
+)
+
+add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})
diff --git a/examples/README.md b/examples/README.md
new file mode 100644
index 0000000..f5dc76f
--- /dev/null
+++ b/examples/README.md
@@ -0,0 +1,44 @@
+# gazzle 示例程序
+
+* 支持 TCP 、 unix 非阻塞通讯。
+* 支持多线程网络 IO 复用模型线程之间相互独立。TCP 的 `listen` 、`epoll` 、`read` 、`write` 、`connect` 等接口都在同一线程内。`connect` 连接数可配。
+* 支持多线程网络非对称模型,一个 listen 线程若干个读写线程。listen 线程和读写线程使用 `poll` / `epoll` 监听事件。
+* 支持 `recvmsg` 、`sendmsg` 、`recv` 、`send` 、`getpeername` 、`getsockopt` 、`epoll_ctl` 等 posix 接口。
+* 网络通讯报文采用问答方式,丢包或者内容错误则报错并停止通讯。报文内容有变化,长度可配。
+
+## 网络模型
+
+* **单线程非阻塞**:采用同步非阻塞 IO 模型,在单线程中采用非阻塞的方式监听并发起 IO 请求,当内核中数据到达后读取数据、执行业务逻辑并发送。
+* **多线程非阻塞IO复用**:基于 `epoll` 实现多线程非阻塞 IO 模型。每个线程之间互不干涉。通过 `epoll` 监控多个当前线程负责的 fd 当任何一个数据状态准备就绪时返回并执行读写操作和对应的业务逻辑。
+* **多线程非阻塞非对称**:采用基于 `epoll` 的单线程多路 IO 复用监听连接事件,并采用多线程的方式完成后续读写监听业务。 server 在启动监听之前,开辟一定数量的线程,用线程池管理。主线程创建监听 `fd` 之后,采用多路 IO 复用机制 (`epoll`) 进行 IO 状态监控。当监听到客户端的连接请求时,建立连接并将相关 `fd` 分发给线程池的某个线程进行监听。线程池中的每个线程都采用多路 IO 复用机制 (`epoll`) ,用来监听主线程中建立成功并分发下来的 `socket` 。
+
+## 程序接口
+
+* `--as [server | client]`:作为服务端还是客户端。
+ * `server`:作为服务端。
+ * `client`:作为客户端。
+* `--ip [xxx.xxx.xxx.xxx]`IP地址。
+* `--port [xxxx]`:端口。
+* `--model [-mum | -mud]` :采用的网络模型类型。
+ * `-mum (multi thread, unblock, multiplexing IO)`多线程非阻塞IO复用。
+ * `-mud (multi thread, unblock, dissymmetric)`:多线程非阻塞非对称。
+* `--threadnum`:线程数设置。
+* `--connectnum`:连接数设置。
+* `--api [unix | posix]`:内部实现的接口类型。
+ * `unix` :基于 unix 接口实现。
+ * `posix` :基于 posix 接口实现。
+* `--pktlen [xxxx]`:报文长度配置。
+* `--verify [on | off]`:是否校验报文。
+* `--ringpmd [on | off]`:是否基于 dpkg ring PMD 收发环回。
+* `--help [--xxx]`:获得帮助信息。
+
+## 使用
+
+```
+cd build
+mkdir examples
+cd examples
+cmake ../../examples
+make
+./examples --help
+```
diff --git a/examples/inc/parameter.h b/examples/inc/parameter.h
new file mode 100644
index 0000000..7912862
--- /dev/null
+++ b/examples/inc/parameter.h
@@ -0,0 +1,65 @@
+/*
+* Copyright (c) 2022-2023. yyangoO.
+* 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.
+*/
+
+
+#ifndef __PARAMETER_H__
+#define __PARAMETER_H__
+
+
+#include "utilities.h"
+
+
+/**
+ * @brief porgram parameter
+ * The porgram's parameters.
+ */
+struct ProgramParams
+{
+ char* as; ///< as server or client
+ char* ip; ///< IP address
+ uint32_t port; ///< port
+ char* model; ///< model type
+ uint32_t thread_num; ///< the number of threads
+ uint32_t connect_num; ///< the connection number
+ char* api; ///< the type of api
+ uint32_t pktlen; ///< the packet length
+ bool verify; ///< if we verify the message or not
+ bool ringpmd; ///< if we use ring PMD or not
+};
+
+
+/**
+ * @brief initialize the parameters
+ * This function initializes the parameters of main function.
+ * @param params the parameters pointer
+ */
+void program_params_init(struct ProgramParams *params);
+
+/**
+ * @brief parse the parameters
+ * This function parses the parameters of main function.
+ * @param params the parameters pointer
+ * @param argc the count of arguments
+ * @param argv the value of arguments
+ * @return the result flag
+ */
+int32_t program_params_parse(struct ProgramParams *params, int argc, char *argv[]);
+
+/**
+ * @brief print the parameters
+ * This function prints the parameters of main function.
+ * @param params the parameters pointer
+ */
+void program_params_print(struct ProgramParams *params);
+
+
+#endif // __PARAMETER_H__
diff --git a/examples/inc/utilities.h b/examples/inc/utilities.h
new file mode 100644
index 0000000..d800531
--- /dev/null
+++ b/examples/inc/utilities.h
@@ -0,0 +1,69 @@
+/*
+* Copyright (c) 2022-2023. yyangoO.
+* 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.
+*/
+
+
+#ifndef __UTILITIES_H__
+#define __UTILITIES_H__
+
+
+#include <string.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <inttypes.h>
+
+#include <unistd.h>
+#include <pthread.h>
+
+#include <sys/types.h>
+
+
+#define PRINT_ERROR(str) do \
+ { \
+ printf("\n[error]: "); \
+ printf(str); \
+ printf("\n"); \
+ } while(0)
+#define PRINT_WARNNING(str) do \
+ { \
+ printf("\n[warnning]: "); \
+ printf(str); \
+ printf("\n"); \
+ } while(0)
+#define LIMIT_VAL_RANGE(val, min, max) ((val) < (min) ? (min) : ((val) > (max) ? (max) : (val)))
+#define CHECK_VAL_RANGE(val, min, max) ((val) < (min) ? (false) : ((val) > (max) ? (false) : (true)))
+
+#define PROGRAM_OK (0) ///< program ok flag
+#define PROGRAM_FINISH (1) ///< program finish flag
+#define PROGRAM_FAULT (-1) ///< program fault flag
+
+#define UNIX_TCP_PORT_MIN (1024) ///< TCP minimum port number in unix
+#define UNIX_TCP_PORT_MAX (65535) ///< TCP minimum port number in unix
+#define THREAD_NUM_MIN (1) ///< minimum number of thead
+#define THREAD_NUM_MAX (1000) ///< maximum number of thead
+#define MESSAGE_PKTLEN_MIN (1) ///< minimum length of message (1 byte)
+#define MESSAGE_PKTLEN_MAX (10485760) ///< maximum length of message (10 Mb)
+
+#define DEFAULT_PARAM_AS ("server") ///< default type
+#define DEFAULT_PARAM_IP ("127.0.0.1") ///< default IP
+#define DEFAULT_PARAM_PORT (5050) ///< default port
+#define DEFAULT_PARAM_MODEL ("mum") ///< default model type
+#define DEFAULT_PARAM_CONNECT_NUM (10) ///< default connection number
+#define DEFAULT_PARAM_THREAD_NUM (8) ///< default thread number
+#define DEFAULT_PARAM_API ("posix") ///< default API type
+#define DEFAULT_PARAM_PKTLEN (1024) ///< default packet length of message
+#define DEFAULT_PARAM_VERIFY (true) ///< default flag of message verifying
+#define DEFAULT_PARAM_RINGPMD (false) ///< default flag of ring PMD
+
+
+#endif // __UTILITIES_H__
diff --git a/examples/main.c b/examples/main.c
new file mode 100644
index 0000000..30d04e6
--- /dev/null
+++ b/examples/main.c
@@ -0,0 +1,23 @@
+/*
+* Copyright (c) 2022-2023. yyangoO.
+* 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 "utilities.h"
+#include "parameter.h"
+
+
+int32_t main(int argc, char *argv[])
+{
+ int32_t ret = PROGRAM_OK;
+
+ return ret;
+}
--
2.23.0

View File

@ -1,550 +0,0 @@
From 69be15c6a29d05c6b7f95e8fb778f79f51cf9240 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=B4=8B?= <yyangoO@outlook.com>
Date: Mon, 11 Jul 2022 20:10:25 +0800
Subject: [PATCH 03/19] add examples parameter parsing
---
examples/CMakeLists.txt | 1 +
examples/README.md | 30 ++---
examples/inc/parameter.h | 68 +++++++++-
examples/inc/utilities.h | 34 ++---
examples/main.c | 11 ++
examples/src/parameter.c | 267 +++++++++++++++++++++++++++++++++++++++
6 files changed, 372 insertions(+), 39 deletions(-)
create mode 100644 examples/src/parameter.c
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 0fd09ab..2e62bd3 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -29,6 +29,7 @@ set(HEADERS
)
set(SOURCES
main.c
+ src/parameter.c
)
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})
diff --git a/examples/README.md b/examples/README.md
index f5dc76f..6f82bb2 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -14,23 +14,23 @@
## 程序接口
-* `--as [server | client]`:作为服务端还是客户端。
+* `-a, --as [server | client]`:作为服务端还是客户端。
* `server`:作为服务端。
* `client`:作为客户端。
-* `--ip [xxx.xxx.xxx.xxx]`IP地址。
-* `--port [xxxx]`:端口。
-* `--model [-mum | -mud]` :采用的网络模型类型。
- * `-mum (multi thread, unblock, multiplexing IO)`多线程非阻塞IO复用。
- * `-mud (multi thread, unblock, dissymmetric)`:多线程非阻塞非对称。
-* `--threadnum`:线程数设置。
-* `--connectnum`:连接数设置。
-* `--api [unix | posix]`:内部实现的接口类型。
- * `unix` :基于 unix 接口实现。
- * `posix` :基于 posix 接口实现。
-* `--pktlen [xxxx]`:报文长度配置。
-* `--verify [on | off]`:是否校验报文。
-* `--ringpmd [on | off]`:是否基于 dpkg ring PMD 收发环回。
-* `--help [--xxx]`:获得帮助信息。
+* `-i, --ip [xxx.xxx.xxx.xxx]`IP地址。
+* `-p, --port [xxxx]`:端口。
+* `-m, --model [mum | mud]`:采用的网络模型类型。
+ * `mum (multi thread, unblock, multiplexing IO)`多线程非阻塞IO复用。
+ * `mud (multi thread, unblock, dissymmetric)`:多线程非阻塞非对称。
+* `-t, --threadnum`:线程数设置。
+* `-c, --connectnum`:连接数设置。
+* `-A, --api [unix | posix]`:内部实现的接口类型。
+ * `unix`:基于 unix 接口实现。
+ * `posix`:基于 posix 接口实现。
+* `-P, --pktlen [xxxx]`:报文长度配置。
+* `-v, --verify`:是否校验报文。
+* `-r, --ringpmd`是否基于dpdk ring PMD 收发环回。
+* `-h, --help`:获得帮助信息。
## 使用
diff --git a/examples/inc/parameter.h b/examples/inc/parameter.h
index 7912862..fe0dce0 100644
--- a/examples/inc/parameter.h
+++ b/examples/inc/parameter.h
@@ -11,13 +11,67 @@
*/
-#ifndef __PARAMETER_H__
-#define __PARAMETER_H__
+#ifndef __EXAMPLES_PARAMETER_H__
+#define __EXAMPLES_PARAMETER_H__
#include "utilities.h"
+#define PARAM_DEFAULT_AS ("server") ///< default type
+#define PARAM_DEFAULT_IP ("127.0.0.1") ///< default IP
+#define PARAM_DEFAULT_PORT (5050) ///< default port
+#define PARAM_DEFAULT_MODEL ("mum") ///< default model type
+#define PARAM_DEFAULT_CONNECT_NUM (10) ///< default connection number
+#define PARAM_DEFAULT_THREAD_NUM (8) ///< default thread number
+#define PARAM_DEFAULT_API ("posix") ///< default API type
+#define PARAM_DEFAULT_PKTLEN (1024) ///< default packet length of message
+#define PARAM_DEFAULT_VERIFY (false) ///< default flag of message verifying
+#define PARAM_DEFAULT_RINGPMD (false) ///< default flag of ring PMD of dpdk
+
+enum
+{
+#define PARAM_NAME_AS ("as") ///< name of parameter type
+ PARAM_NUM_AS = 'a',
+#define PARAM_NAME_IP ("ip") ///< name of parameter IP
+ PARAM_NUM_IP = 'i',
+#define PARAM_NAME_PORT ("port") ///< name of parameter port
+ PARAM_NUM_PORT = 'p',
+#define PARAM_NAME_MODEL ("model") ///< name of parameter model type
+ PARAM_NUM_MODEL = 'm',
+#define PARAM_NAME_CONNECT_NUM ("connectnum") ///< name of parameter connection number
+ PARAM_NUM_CONNECT_NUM = 'c',
+#define PARAM_NAME_THREAD_NUM ("threadnum") ///< name of parameter thread number
+ PARAM_NUM_THREAD_NUM = 't',
+#define PARAM_NAME_API ("api") ///< name of parameter API type
+ PARAM_NUM_API = 'A',
+#define PARAM_NAME_PKTLEN ("pktlen") ///< name of parameter packet length of message
+ PARAM_NUM_PKTLEN = 'P',
+#define PARAM_NAME_VERIFY ("verify") ///< name of parameter flag of message verifying
+ PARAM_NUM_VERIFY = 'v',
+#define PARAM_NAME_RINGPMD ("ringpmd") ///< name of parameter flag of ring PMD of dpdk
+ PARAM_NUM_RINGPMD = 'r',
+#define PARAM_NAME_HELP ("help") ///< name of parameter help
+ PARAM_NUM_HELP = 'h',
+};
+
+#define NO_ARGUMENT 0 ///< options takes no arguments
+#define REQUIRED_ARGUMETN 1 ///< options requires arguments
+#define OPTIONAL_ARGUMETN 2 ///< options arguments are optional
+
+
+/**
+ * @brief program option description
+ * The program option description.
+ */
+struct ProgramOption
+{
+ const char *name; ///< name of program option
+ int32_t has_arg; ///< whether program option takes an argument, one of no, required, and optional
+ int32_t *flag; ///< if not `NULL`, set `*flag` to `val` when option found
+ int32_t val; ///< the number of this program option
+};
+
/**
* @brief porgram parameter
* The porgram's parameters.
@@ -44,6 +98,12 @@ struct ProgramParams
*/
void program_params_init(struct ProgramParams *params);
+/**
+ * @brief print help information
+ * This function prints help informations.
+ */
+void program_params_help(void);
+
/**
* @brief parse the parameters
* This function parses the parameters of main function.
@@ -52,7 +112,7 @@ void program_params_init(struct ProgramParams *params);
* @param argv the value of arguments
* @return the result flag
*/
-int32_t program_params_parse(struct ProgramParams *params, int argc, char *argv[]);
+int32_t program_params_parse(struct ProgramParams *params, uint32_t argc, char *argv[]);
/**
* @brief print the parameters
@@ -62,4 +122,4 @@ int32_t program_params_parse(struct ProgramParams *params, int argc, char *argv[
void program_params_print(struct ProgramParams *params);
-#endif // __PARAMETER_H__
+#endif // __EXAMPLES_PARAMETER_H__
diff --git a/examples/inc/utilities.h b/examples/inc/utilities.h
index d800531..bccd523 100644
--- a/examples/inc/utilities.h
+++ b/examples/inc/utilities.h
@@ -11,8 +11,8 @@
*/
-#ifndef __UTILITIES_H__
-#define __UTILITIES_H__
+#ifndef __EXAMPLES_UTILITIES_H__
+#define __EXAMPLES_UTILITIES_H__
#include <string.h>
@@ -21,30 +21,35 @@
#include <stdlib.h>
#include <stddef.h>
#include <inttypes.h>
-
#include <unistd.h>
+#include <ctype.h>
+
#include <pthread.h>
#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
-#define PRINT_ERROR(str) do \
+
+#define PRINT_ERROR(format, ...) do \
{ \
printf("\n[error]: "); \
- printf(str); \
+ printf(format, ##__VA_ARGS__); \
printf("\n"); \
} while(0)
-#define PRINT_WARNNING(str) do \
+#define PRINT_WARNNING(format, ...) do \
{ \
printf("\n[warnning]: "); \
- printf(str); \
+ printf(format, ##__VA_ARGS__); \
printf("\n"); \
} while(0)
#define LIMIT_VAL_RANGE(val, min, max) ((val) < (min) ? (min) : ((val) > (max) ? (max) : (val)))
#define CHECK_VAL_RANGE(val, min, max) ((val) < (min) ? (false) : ((val) > (max) ? (false) : (true)))
#define PROGRAM_OK (0) ///< program ok flag
-#define PROGRAM_FINISH (1) ///< program finish flag
+#define PROGRAM_ABORT (1) ///< program abort flag
#define PROGRAM_FAULT (-1) ///< program fault flag
#define UNIX_TCP_PORT_MIN (1024) ///< TCP minimum port number in unix
@@ -54,16 +59,5 @@
#define MESSAGE_PKTLEN_MIN (1) ///< minimum length of message (1 byte)
#define MESSAGE_PKTLEN_MAX (10485760) ///< maximum length of message (10 Mb)
-#define DEFAULT_PARAM_AS ("server") ///< default type
-#define DEFAULT_PARAM_IP ("127.0.0.1") ///< default IP
-#define DEFAULT_PARAM_PORT (5050) ///< default port
-#define DEFAULT_PARAM_MODEL ("mum") ///< default model type
-#define DEFAULT_PARAM_CONNECT_NUM (10) ///< default connection number
-#define DEFAULT_PARAM_THREAD_NUM (8) ///< default thread number
-#define DEFAULT_PARAM_API ("posix") ///< default API type
-#define DEFAULT_PARAM_PKTLEN (1024) ///< default packet length of message
-#define DEFAULT_PARAM_VERIFY (true) ///< default flag of message verifying
-#define DEFAULT_PARAM_RINGPMD (false) ///< default flag of ring PMD
-
-#endif // __UTILITIES_H__
+#endif // __EXAMPLES_UTILITIES_H__
diff --git a/examples/main.c b/examples/main.c
index 30d04e6..ed3abef 100644
--- a/examples/main.c
+++ b/examples/main.c
@@ -13,11 +13,22 @@
#include "utilities.h"
#include "parameter.h"
+#include "server.h"
+
+
+static struct ProgramParams prog_params;
int32_t main(int argc, char *argv[])
{
int32_t ret = PROGRAM_OK;
+ program_params_init(&prog_params);
+ ret = program_params_parse(&prog_params, argc, argv);
+ if (PROGRAM_ABORT == ret) {
+ return ret;
+ }
+ program_params_print(&prog_params);
+
return ret;
}
diff --git a/examples/src/parameter.c b/examples/src/parameter.c
new file mode 100644
index 0000000..8abcc68
--- /dev/null
+++ b/examples/src/parameter.c
@@ -0,0 +1,267 @@
+/*
+* Copyright (c) 2022-2023. yyangoO.
+* 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 "parameter.h"
+
+
+// program short options
+const char prog_short_opts[] = \
+ "a:" // as
+ "i:" // ip
+ "p:" // port
+ "m:" // model
+ "t:" // thread number
+ "c:" // connect number
+ "A:" // api
+ "P:" // pktlen
+ "v" // verify
+ "r" // ringpmd
+ "h" // help
+ ;
+
+// program long options
+const struct ProgramOption prog_long_opts[] = \
+{
+ {PARAM_NAME_AS, REQUIRED_ARGUMETN, NULL, PARAM_NUM_AS},
+ {PARAM_NAME_IP, REQUIRED_ARGUMETN, NULL, PARAM_NUM_IP},
+ {PARAM_NAME_PORT, REQUIRED_ARGUMETN, NULL, PARAM_NUM_PORT},
+ {PARAM_NAME_MODEL, REQUIRED_ARGUMETN, NULL, PARAM_NUM_MODEL},
+ {PARAM_NAME_THREAD_NUM, REQUIRED_ARGUMETN, NULL, PARAM_NUM_THREAD_NUM},
+ {PARAM_NAME_CONNECT_NUM, REQUIRED_ARGUMETN, NULL, PARAM_NUM_CONNECT_NUM},
+ {PARAM_NAME_API, REQUIRED_ARGUMETN, NULL, PARAM_NUM_API},
+ {PARAM_NAME_PKTLEN, REQUIRED_ARGUMETN, NULL, PARAM_NUM_PKTLEN},
+ {PARAM_NAME_VERIFY, NO_ARGUMENT, NULL, PARAM_NUM_VERIFY},
+ {PARAM_NAME_RINGPMD, NO_ARGUMENT, NULL, PARAM_NUM_RINGPMD},
+ {PARAM_NAME_HELP, NO_ARGUMENT, NULL, PARAM_NUM_HELP},
+};
+
+
+// get long options
+int getopt_long(int argc, char * const argv[], const char *optstring, const struct ProgramOption *long_opts, int *long_idx);
+
+
+// set `as` parameter
+void program_param_prase_as(struct ProgramParams *params, char *arg, const char *name)
+{
+ if (0 == strcmp(arg, "server") || 0 == strcmp(arg, "client")) {
+ params->as = arg;
+ }
+ else {
+ PRINT_ERROR("illigal argument -- %s \n", name);
+ exit(PROGRAM_ABORT);
+ }
+}
+
+// set `ip` parameter
+void program_param_prase_ip(struct ProgramParams *params, char *arg, const char *name)
+{
+ if (INADDR_NONE == inet_addr(arg)) {
+ params->ip = arg;
+ }
+ else {
+ PRINT_ERROR("illigal argument -- %s \n", name);
+ exit(PROGRAM_ABORT);
+ }
+}
+
+// set `port` parameter
+void program_param_prase_port(struct ProgramParams *params, char *arg, const char *name)
+{
+ int32_t port_arg = atoi(optarg);
+ if (CHECK_VAL_RANGE(port_arg, UNIX_TCP_PORT_MIN, UNIX_TCP_PORT_MAX)) {
+ params->port = (uint32_t)port_arg;
+ }
+ else {
+ PRINT_ERROR("illigal argument -- %s \n", name);
+ exit(PROGRAM_ABORT);
+ }
+}
+
+// set `model` parameter
+void program_param_prase_model(struct ProgramParams *params, char *arg, const char *name)
+{
+ if (0 == strcmp(optarg, "mum") || 0 == strcmp(optarg, "mud")) {
+ params->model = optarg;
+ }
+ else {
+ PRINT_ERROR("illigal argument -- %s \n", name);
+ exit(PROGRAM_ABORT);
+ }
+}
+
+// set `connect_num` parameter
+void program_param_prase_connectnum(struct ProgramParams *params, char *arg, const char *name)
+{
+ int32_t connectnum_arg = atoi(optarg);
+ if (0 < connectnum_arg) {
+ params->connect_num = (uint32_t)connectnum_arg;
+ }
+ else {
+ PRINT_ERROR("illigal argument -- %s \n", name);
+ exit(PROGRAM_ABORT);
+ }
+}
+
+// set `thread_num` parameter
+void program_param_prase_threadnum(struct ProgramParams *params, char *arg, const char *name)
+{
+ int32_t threadnum_arg = atoi(optarg);
+ if (CHECK_VAL_RANGE(threadnum_arg, THREAD_NUM_MIN, THREAD_NUM_MAX)) {
+ params->thread_num = (uint32_t)threadnum_arg;
+ }
+ else {
+ PRINT_ERROR("illigal argument -- %s \n", name);
+ exit(PROGRAM_ABORT);
+ }
+}
+
+// set `api` parameter
+void program_param_prase_api(struct ProgramParams *params, char *arg, const char *name)
+{
+ if (0 == strcmp(optarg, "unix") || 0 == strcmp(optarg, "posix")) {
+ params->api = optarg;
+ }
+ else {
+ PRINT_ERROR("illigal argument -- %s \n", name);
+ exit(PROGRAM_ABORT);
+ }
+}
+
+// set `pktlen` parameter
+void program_param_prase_pktlen(struct ProgramParams *params, char *arg, const char *name)
+{
+ int32_t pktlen_arg = atoi(optarg);
+ if (CHECK_VAL_RANGE(pktlen_arg, MESSAGE_PKTLEN_MIN, MESSAGE_PKTLEN_MAX)) {
+ params->pktlen = (uint32_t)pktlen_arg;
+ }
+ else {
+ PRINT_ERROR("illigal argument -- %s \n", name);
+ exit(PROGRAM_ABORT);
+ }
+}
+
+// initialize the parameters
+void program_params_init(struct ProgramParams *params)
+{
+ params->as = PARAM_DEFAULT_AS;
+ params->ip = PARAM_DEFAULT_IP;
+ params->port = PARAM_DEFAULT_PORT;
+ params->model = PARAM_DEFAULT_MODEL;
+ params->thread_num = PARAM_DEFAULT_CONNECT_NUM;
+ params->connect_num = PARAM_DEFAULT_THREAD_NUM;
+ params->api = PARAM_DEFAULT_API;
+ params->pktlen = PARAM_DEFAULT_PKTLEN;
+ params->verify = PARAM_DEFAULT_VERIFY;
+ params->ringpmd = PARAM_DEFAULT_RINGPMD;
+}
+
+// print program helps
+void program_params_help(void)
+{
+ printf("\n");
+ printf("-a, --as [server | client]: set programas server or client. \n");
+ printf(" server: as server. \n");
+ printf(" client: as client. \n");
+ printf("-i, --ip [xxx.xxx.xxx.xxx]: set ip address. \n");
+ printf("-p, --port [xxxx]: set port number in range of %d - %d. \n", UNIX_TCP_PORT_MIN, UNIX_TCP_PORT_MAX);
+ printf("-m, --model [mum | mud]: set the network model. \n");
+ printf(" mum: multi thread, unblock, multiplexing IO network model. \n");
+ printf(" mud: multi thread, unblock, dissymmetric network model. \n");
+ printf("-t, --threadnum [xxxx]: set thread number in range of %d - %d. \n", THREAD_NUM_MIN, THREAD_NUM_MAX);
+ printf("-c, --connectnum [xxxx]: set thread number of connection. \n");
+ printf("-A, --api [unix | posix]: set api type is server or client. \n");
+ printf(" unix: use unix's api. \n");
+ printf(" posix: use posix api. \n");
+ printf("-P, --pktlen [xxxx]: set packet length in range of %d - %d. \n", MESSAGE_PKTLEN_MIN, MESSAGE_PKTLEN_MAX);
+ printf("-v, --verify: set to verifying the message packet. \n");
+ printf("-r, --ringpmd: set use ringpmd. \n");
+ printf("-h, --help: see helps. \n");
+ printf("\n");
+}
+
+// parse the parameters
+int32_t program_params_parse(struct ProgramParams *params, uint32_t argc, char *argv[])
+{
+ int32_t c;
+
+ while (true) {
+ int32_t opt_idx = 0;
+
+ c = getopt_long(argc, argv, prog_short_opts, prog_long_opts, &opt_idx);
+
+ if (-1 == c) {
+ break;
+ }
+
+ switch (c) {
+ case (PARAM_NUM_AS):
+ program_param_prase_as(params, optarg, prog_long_opts[opt_idx].name);
+ break;
+ case (PARAM_NUM_IP):
+ program_param_prase_ip(params, optarg, prog_long_opts[opt_idx].name);
+ break;
+ case (PARAM_NUM_PORT):
+ program_param_prase_port(params, optarg, prog_long_opts[opt_idx].name);
+ break;
+ case (PARAM_NUM_MODEL):
+ program_param_prase_model(params, optarg, prog_long_opts[opt_idx].name);
+ break;
+ case (PARAM_NUM_CONNECT_NUM):
+ program_param_prase_connectnum(params, optarg, prog_long_opts[opt_idx].name);
+ break;
+ case (PARAM_NUM_THREAD_NUM):
+ program_param_prase_threadnum(params, optarg, prog_long_opts[opt_idx].name);
+ break;
+ case (PARAM_NUM_API):
+ program_param_prase_api(params, optarg, prog_long_opts[opt_idx].name);
+ break;
+ case (PARAM_NUM_PKTLEN):
+ program_param_prase_pktlen(params, optarg, prog_long_opts[opt_idx].name);
+ break;
+ case (PARAM_NUM_VERIFY):
+ params->verify = true;
+ break;
+ case (PARAM_NUM_RINGPMD):
+ params->ringpmd = true;
+ break;
+ case (PARAM_NUM_HELP):
+ program_params_help();
+ return PROGRAM_ABORT;
+ case ('?'):
+ return PROGRAM_ABORT;
+ default:
+ program_params_help();
+ return PROGRAM_ABORT;
+ }
+ }
+
+ return PROGRAM_OK;
+}
+
+// print the parameters
+void program_params_print(struct ProgramParams *params)
+{
+ printf("\n");
+ printf("[program parameters]: \n");
+ printf("--> [as]: %s \n", params->as);
+ printf("--> [ip]: %s \n", params->ip);
+ printf("--> [port]: %u \n", params->port);
+ printf("--> [model]: %s \n", params->model);
+ printf("--> [thread number]: %u \n", params->thread_num);
+ printf("--> [connection number]: %u \n", params->connect_num);
+ printf("--> [api]: %s \n", params->api);
+ printf("--> [packet length]: %u \n", params->pktlen);
+ printf("--> [verify]: %s \n", (true == params->verify) ? "on" : "off");
+ printf("--> [ringpmd]: %s \n", (true == params->ringpmd) ? "on" : "off");
+ printf("\n");
+}
--
2.23.0

View File

@ -1,58 +0,0 @@
From 11f46783f88912e3c204fc12d4f33034f371881b Mon Sep 17 00:00:00 2001
From: Honggang LI <honggangli@163.com>
Date: Thu, 23 Jun 2022 13:36:36 +0800
Subject: [PATCH 19/40] lstack/core: fix reta_conf array size calculation
When dev_info.reta_size is smaller than RTE_RETA_GROUP_SIZE, the first
parameter (nmemb) of calloc is zero.
If nmemb is 0, then calloc() returns either NULL, or a unique pointer
value that can later be successfully passed to free(). When non-NULL
unique pointer was returned, rss_setup() will failed because of garbage
value in memory pointed by the unique pointer.
Signed-off-by: Honggang LI <honggangli@163.com>
---
src/lstack/core/lstack_dpdk.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index df0332b..3f0dbb4 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -428,6 +428,7 @@ static int rss_setup(const int port_id, const uint16_t nb_queues)
int ret;
struct rte_eth_dev_info dev_info;
struct rte_eth_rss_reta_entry64 *reta_conf = NULL;
+ size_t reta_conf_size, n;
rte_eth_dev_info_get(port_id, &dev_info);
@@ -435,8 +436,11 @@ static int rss_setup(const int port_id, const uint16_t nb_queues)
return ERR_VAL;
}
- reta_conf = calloc(dev_info.reta_size / RTE_RETA_GROUP_SIZE,
- sizeof(struct rte_eth_rss_reta_entry64));
+ reta_conf_size = dev_info.reta_size / RTE_RETA_GROUP_SIZE;
+ if (dev_info.reta_size % RTE_RETA_GROUP_SIZE)
+ reta_conf_size += 1;
+
+ reta_conf = calloc(reta_conf_size, sizeof(struct rte_eth_rss_reta_entry64));
if (!reta_conf) {
return ERR_MEM;
}
@@ -446,8 +450,8 @@ static int rss_setup(const int port_id, const uint16_t nb_queues)
one_reta_conf->reta[i % RTE_RETA_GROUP_SIZE] = i % nb_queues;
}
- for (i = 0; i < dev_info.reta_size / RTE_RETA_GROUP_SIZE; i++) {
- struct rte_eth_rss_reta_entry64 *one_reta_conf = &reta_conf[i];
+ for (n = 0; n < reta_conf_size; n++) {
+ struct rte_eth_rss_reta_entry64 *one_reta_conf = &reta_conf[n];
one_reta_conf->mask = 0xFFFFFFFFFFFFFFFFULL;
}
--
2.23.0

View File

@ -1,39 +0,0 @@
From e1c6c79565a549866fbe7cb770a6f09183676c0b Mon Sep 17 00:00:00 2001
From: Honggang LI <honggangli@163.com>
Date: Wed, 13 Jul 2022 09:50:06 +0800
Subject: [PATCH 07/19] Replace gettid() with rte_gettid()
Signed-off-by: Honggang LI <honggangli@163.com>
---
src/lstack/core/lstack_protocol_stack.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index a1f3790..2acf77a 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -67,10 +67,10 @@ static inline void set_stack_idx(uint16_t idx)
long get_stack_tid(void)
{
- static PER_THREAD long g_stack_tid = 0;
+ static PER_THREAD int32_t g_stack_tid = 0;
if (g_stack_tid == 0) {
- g_stack_tid = syscall(__NR_gettid);
+ g_stack_tid = rte_gettid();
}
return g_stack_tid;
@@ -245,7 +245,7 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id)
memset_s(stack, sizeof(*stack), 0, sizeof(*stack));
set_stack_idx(queue_id);
- stack->tid = gettid();
+ stack->tid = rte_gettid();
stack->queue_id = queue_id;
stack->port_id = stack_group->port_id;
stack->cpu_id = get_global_cfg_params()->cpus[queue_id];
--
2.23.0

View File

@ -1,190 +0,0 @@
From 3ddd9dadcdd3bf5b451f0170f88b9f4957eceb26 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=B4=8B?= <yyangoO@outlook.com>
Date: Tue, 12 Jul 2022 20:55:33 +0800
Subject: [PATCH 08/19] modify the code for canonical and update the cmake
build components
---
examples/CMakeLists.txt | 13 +++----------
examples/inc/utilities.h | 14 ++++++++++++++
examples/main.c | 3 +--
examples/src/parameter.c | 22 +++++++++++-----------
4 files changed, 29 insertions(+), 23 deletions(-)
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 2e62bd3..b1c2b07 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -23,13 +23,6 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D EXAMPLE_COMPILE")
include_directories(${PROJECT_SOURCE_DIR}/inc)
-set(HEADERS
- inc/utilities.h
- inc/parameter.h
-)
-set(SOURCES
- main.c
- src/parameter.c
-)
-
-add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})
+aux_source_directory(${PROJECT_SOURCE_DIR}/src SOURCES)
+
+add_executable(${PROJECT_NAME} main.c ${SOURCES})
diff --git a/examples/inc/utilities.h b/examples/inc/utilities.h
index bccd523..b594469 100644
--- a/examples/inc/utilities.h
+++ b/examples/inc/utilities.h
@@ -24,10 +24,12 @@
#include <unistd.h>
#include <ctype.h>
+#include <fcntl.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
+#include <sys/epoll.h>
#include <netinet/in.h>
#include <arpa/inet.h>
@@ -45,6 +47,18 @@
printf(format, ##__VA_ARGS__); \
printf("\n"); \
} while(0)
+#define PRINT_SERVER(format, ...) do \
+ { \
+ printf("<server>: "); \
+ printf(format, ##__VA_ARGS__); \
+ printf("\n"); \
+ } while(0)
+#define PRINT_CLIENT(format, ...) do \
+ { \
+ printf("<client>: "); \
+ printf(format, ##__VA_ARGS__); \
+ printf("\n"); \
+ } while(0)
#define LIMIT_VAL_RANGE(val, min, max) ((val) < (min) ? (min) : ((val) > (max) ? (max) : (val)))
#define CHECK_VAL_RANGE(val, min, max) ((val) < (min) ? (false) : ((val) > (max) ? (false) : (true)))
diff --git a/examples/main.c b/examples/main.c
index ed3abef..a7daded 100644
--- a/examples/main.c
+++ b/examples/main.c
@@ -13,7 +13,6 @@
#include "utilities.h"
#include "parameter.h"
-#include "server.h"
static struct ProgramParams prog_params;
@@ -25,7 +24,7 @@ int32_t main(int argc, char *argv[])
program_params_init(&prog_params);
ret = program_params_parse(&prog_params, argc, argv);
- if (PROGRAM_ABORT == ret) {
+ if (ret == PROGRAM_ABORT) {
return ret;
}
program_params_print(&prog_params);
diff --git a/examples/src/parameter.c b/examples/src/parameter.c
index 8abcc68..ff3bcbc 100644
--- a/examples/src/parameter.c
+++ b/examples/src/parameter.c
@@ -53,7 +53,7 @@ int getopt_long(int argc, char * const argv[], const char *optstring, const stru
// set `as` parameter
void program_param_prase_as(struct ProgramParams *params, char *arg, const char *name)
{
- if (0 == strcmp(arg, "server") || 0 == strcmp(arg, "client")) {
+ if (strcmp(arg, "server") == 0 || strcmp(arg, "client") == 0) {
params->as = arg;
}
else {
@@ -65,7 +65,7 @@ void program_param_prase_as(struct ProgramParams *params, char *arg, const char
// set `ip` parameter
void program_param_prase_ip(struct ProgramParams *params, char *arg, const char *name)
{
- if (INADDR_NONE == inet_addr(arg)) {
+ if (inet_addr(arg) != INADDR_NONE) {
params->ip = arg;
}
else {
@@ -78,7 +78,7 @@ void program_param_prase_ip(struct ProgramParams *params, char *arg, const char
void program_param_prase_port(struct ProgramParams *params, char *arg, const char *name)
{
int32_t port_arg = atoi(optarg);
- if (CHECK_VAL_RANGE(port_arg, UNIX_TCP_PORT_MIN, UNIX_TCP_PORT_MAX)) {
+ if (CHECK_VAL_RANGE(port_arg, UNIX_TCP_PORT_MIN, UNIX_TCP_PORT_MAX) == true) {
params->port = (uint32_t)port_arg;
}
else {
@@ -90,7 +90,7 @@ void program_param_prase_port(struct ProgramParams *params, char *arg, const cha
// set `model` parameter
void program_param_prase_model(struct ProgramParams *params, char *arg, const char *name)
{
- if (0 == strcmp(optarg, "mum") || 0 == strcmp(optarg, "mud")) {
+ if (strcmp(optarg, "mum") == 0 || strcmp(optarg, "mud") == 0) {
params->model = optarg;
}
else {
@@ -103,7 +103,7 @@ void program_param_prase_model(struct ProgramParams *params, char *arg, const ch
void program_param_prase_connectnum(struct ProgramParams *params, char *arg, const char *name)
{
int32_t connectnum_arg = atoi(optarg);
- if (0 < connectnum_arg) {
+ if (connectnum_arg > 0) {
params->connect_num = (uint32_t)connectnum_arg;
}
else {
@@ -116,7 +116,7 @@ void program_param_prase_connectnum(struct ProgramParams *params, char *arg, con
void program_param_prase_threadnum(struct ProgramParams *params, char *arg, const char *name)
{
int32_t threadnum_arg = atoi(optarg);
- if (CHECK_VAL_RANGE(threadnum_arg, THREAD_NUM_MIN, THREAD_NUM_MAX)) {
+ if (CHECK_VAL_RANGE(threadnum_arg, THREAD_NUM_MIN, THREAD_NUM_MAX) == true) {
params->thread_num = (uint32_t)threadnum_arg;
}
else {
@@ -128,7 +128,7 @@ void program_param_prase_threadnum(struct ProgramParams *params, char *arg, cons
// set `api` parameter
void program_param_prase_api(struct ProgramParams *params, char *arg, const char *name)
{
- if (0 == strcmp(optarg, "unix") || 0 == strcmp(optarg, "posix")) {
+ if (strcmp(optarg, "unix") == 0 || strcmp(optarg, "posix") == 0) {
params->api = optarg;
}
else {
@@ -141,7 +141,7 @@ void program_param_prase_api(struct ProgramParams *params, char *arg, const char
void program_param_prase_pktlen(struct ProgramParams *params, char *arg, const char *name)
{
int32_t pktlen_arg = atoi(optarg);
- if (CHECK_VAL_RANGE(pktlen_arg, MESSAGE_PKTLEN_MIN, MESSAGE_PKTLEN_MAX)) {
+ if (CHECK_VAL_RANGE(pktlen_arg, MESSAGE_PKTLEN_MIN, MESSAGE_PKTLEN_MAX) == true) {
params->pktlen = (uint32_t)pktlen_arg;
}
else {
@@ -157,8 +157,8 @@ void program_params_init(struct ProgramParams *params)
params->ip = PARAM_DEFAULT_IP;
params->port = PARAM_DEFAULT_PORT;
params->model = PARAM_DEFAULT_MODEL;
- params->thread_num = PARAM_DEFAULT_CONNECT_NUM;
- params->connect_num = PARAM_DEFAULT_THREAD_NUM;
+ params->thread_num = PARAM_DEFAULT_THREAD_NUM;
+ params->connect_num = PARAM_DEFAULT_CONNECT_NUM;
params->api = PARAM_DEFAULT_API;
params->pktlen = PARAM_DEFAULT_PKTLEN;
params->verify = PARAM_DEFAULT_VERIFY;
@@ -199,7 +199,7 @@ int32_t program_params_parse(struct ProgramParams *params, uint32_t argc, char *
c = getopt_long(argc, argv, prog_short_opts, prog_long_opts, &opt_idx);
- if (-1 == c) {
+ if (c == -1) {
break;
}
--
2.23.0

View File

@ -1,46 +0,0 @@
From 2e36e8a3885563d12eac0e5cbed56ddaf1d28e27 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng14@huawei.com>
Date: Thu, 14 Jul 2022 22:05:57 +0800
Subject: [PATCH 09/19] enable-secure-compile-and-open-compile-log
---
src/lstack/Makefile | 2 +-
src/ltran/CMakeLists.txt | 5 +++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/lstack/Makefile b/src/lstack/Makefile
index 8fc2435..98289d8 100644
--- a/src/lstack/Makefile
+++ b/src/lstack/Makefile
@@ -21,7 +21,7 @@ OPTIMIZATION = -O2 -g
RM = rm -f
LDFLAGS = -shared -ldl -lm -lpthread -lrt -lnuma -lconfig -lboundscheck
-SEC_FLAGS = -fstack-protector-strong -Werror -Wall -Wl,-z,relro,-z,now -Wl,-z,noexecstack -Wtrampolines -fPIC
+SEC_FLAGS = -fstack-protector-strong -Werror -Wall -Wl,-z,relro, -Wl,-z,now -Wl,-z,noexecstack -Wtrampolines -fPIC -D_FORTIFY_SOURCE=2
INC = -I$(LSTACK_DIR)/include \
-I$(LSTACK_DIR)/../common \
diff --git a/src/ltran/CMakeLists.txt b/src/ltran/CMakeLists.txt
index c21d88a..970bc1b 100644
--- a/src/ltran/CMakeLists.txt
+++ b/src/ltran/CMakeLists.txt
@@ -13,7 +13,8 @@ project(ltran)
set(COMMON_DIR ${PROJECT_SOURCE_DIR}/../common)
-set(CMAKE_C_FLAGS "-O2 -g -fstack-protector-strong -Wall -Werror -fPIE -pie -pthread")
+set(CMAKE_VERBOSE_MAKEFILE ON)
+set(CMAKE_C_FLAGS "-g -fstack-protector-strong -Wall -Werror -fPIE -pie -pthread -D_FORTIFY_SOURCE=2 -O2 -fPIC")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D LTRAN_COMPILE")
if($ENV{GAZELLE_COVERAGE_ENABLE})
@@ -57,4 +58,4 @@ set_target_properties(ltran PROPERTIES LINK_FLAGS "-L$ENV{DPDK_LIB_PATH} -Wl,--w
add_executable(gazellectl ltran_dfx.c ${COMMON_DIR}/gazelle_dfx_msg.c)
target_include_directories(gazellectl PRIVATE $ENV{DPDK_INCLUDE_FILE} ${COMMON_DIR})
-target_link_libraries(gazellectl PRIVATE boundscheck)
+target_link_libraries(gazellectl PRIVATE boundscheck -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack)
--
2.23.0

View File

@ -1,27 +0,0 @@
From 6114f85920ac4d24b73d892a1ebe1890efd48a3a Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng14@huawei.com>
Date: Thu, 14 Jul 2022 22:16:04 +0800
Subject: [PATCH 10/19] support-epoll-et-trig-mode
---
src/lstack/api/lstack_epoll.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index 4978f02..5d7a4b8 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -288,6 +288,10 @@ static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event *
accept_num++;
}
+ if (sock->epoll_events & EPOLLET) {
+ list_del_node_null(&sock->event_list);
+ }
+
events[event_num].events = sock->events;
events[event_num].data = sock->ep_data;
event_num++;
--
2.23.0

View File

@ -1,169 +0,0 @@
From 314689e509a2ddc491eb1bf6ecd40f1a8e6be3db Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng14@huawei.com>
Date: Thu, 14 Jul 2022 22:19:54 +0800
Subject: [PATCH 11/19] lstack support low power
---
src/lstack/core/lstack_protocol_stack.c | 57 ++++++++++++++--------
src/lstack/include/lstack_ethdev.h | 1 -
src/lstack/include/lstack_protocol_stack.h | 1 +
src/lstack/netif/lstack_ethdev.c | 10 ----
4 files changed, 38 insertions(+), 31 deletions(-)
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 2acf77a..595b97e 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -132,9 +132,18 @@ struct protocol_stack *get_bind_protocol_stack(void)
return stack_group->stacks[index];
}
-void lstack_low_power_idling(void)
+static uint32_t get_protocol_traffic(struct protocol_stack *stack)
+{
+ if (use_ltran()) {
+ return rte_ring_count(stack->rx_ring) + rte_ring_count(stack->tx_ring);
+ }
+
+ /* only lstack mode, have not appropriate method to get traffic */
+ return LSTACK_LPM_RX_PKTS + 1;
+}
+
+void low_power_idling(struct protocol_stack *stack)
{
- static PER_THREAD uint32_t wakeup_flag = 0;
static PER_THREAD uint32_t last_cycle_ts = 0;
static PER_THREAD uint64_t last_cycle_pkts = 0;
struct timespec st = {
@@ -147,14 +156,9 @@ void lstack_low_power_idling(void)
set the CPU decentralization flag;
2. If the number of received packets exceeds the threshold, the authorization mark will end;
3. If the number of rx queue packets is less than the threshold, set the CPU delegation flag; */
- if (get_global_cfg_params()->low_power_mod == 0) {
- wakeup_flag = 0;
- return;
- }
-
- if (eth_get_flow_cnt() < LSTACK_LPM_RX_PKTS) {
- wakeup_flag = 1;
+ if (get_protocol_traffic(stack) < LSTACK_LPM_RX_PKTS) {
nanosleep(&st, &st);
+ stack->low_power = true;
return;
}
@@ -165,18 +169,18 @@ void lstack_low_power_idling(void)
uint64_t now_pkts = get_protocol_stack()->stats.rx;
uint32_t now_ts = sys_now();
if (((now_ts - last_cycle_ts) > LSTACK_LPM_DETECT_MS) ||
- (wakeup_flag && ((now_pkts - last_cycle_pkts) >= LSTACK_LPM_PKTS_IN_DETECT))) {
- if (!wakeup_flag && ((now_pkts - last_cycle_pkts) < LSTACK_LPM_PKTS_IN_DETECT)) {
- wakeup_flag = 1;
- } else if (wakeup_flag && ((now_pkts - last_cycle_pkts) >= LSTACK_LPM_PKTS_IN_DETECT)) {
- wakeup_flag = 0;
+ ((now_pkts - last_cycle_pkts) >= LSTACK_LPM_PKTS_IN_DETECT)) {
+ if ((now_pkts - last_cycle_pkts) < LSTACK_LPM_PKTS_IN_DETECT) {
+ stack->low_power = true;
+ } else {
+ stack->low_power = false;
}
last_cycle_ts = now_ts;
last_cycle_pkts = now_pkts;
}
- if (wakeup_flag) {
+ if (stack->low_power) {
nanosleep(&st, &st);
}
}
@@ -221,16 +225,25 @@ static void* gazelle_wakeup_thread(void *arg)
uint16_t queue_id = *(uint16_t *)arg;
struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id];
- int32_t lcore_id = get_global_cfg_params()->wakeup[stack->queue_id];
+ struct cfg_params *cfg = get_global_cfg_params();
+ int32_t lcore_id = cfg->wakeup[stack->queue_id];
thread_affinity_init(lcore_id);
+ struct timespec st = {
+ .tv_sec = 0,
+ .tv_nsec = 1
+ };
+
LSTACK_LOG(INFO, LSTACK, "weakup_%02d start\n", stack->queue_id);
- sem_t *event_sem[WAKEUP_MAX_NUM];
- int num;
for (;;) {
- num = gazelle_light_ring_dequeue_burst(stack->wakeup_ring, (void **)event_sem, WAKEUP_MAX_NUM);
- for (int i = 0; i < num; i++) {
+ if (cfg->low_power_mod != 0 && stack->low_power) {
+ nanosleep(&st, &st);
+ }
+
+ sem_t *event_sem[WAKEUP_MAX_NUM];
+ uint32_t num = gazelle_light_ring_dequeue_burst(stack->wakeup_ring, (void **)event_sem, WAKEUP_MAX_NUM);
+ for (uint32_t i = 0; i < num; i++) {
sem_post(event_sem[i]);
}
}
@@ -423,6 +436,10 @@ static void* gazelle_stack_thread(void *arg)
send_stack_list(stack, SEND_LIST_MAX);
sys_timer_run();
+
+ if (get_global_cfg_params()->low_power_mod != 0) {
+ low_power_idling(stack);
+ }
}
return NULL;
diff --git a/src/lstack/include/lstack_ethdev.h b/src/lstack/include/lstack_ethdev.h
index 573a413..0e8400f 100644
--- a/src/lstack/include/lstack_ethdev.h
+++ b/src/lstack/include/lstack_ethdev.h
@@ -31,7 +31,6 @@ struct eth_dev_ops {
int32_t ethdev_init(struct protocol_stack *stack);
int32_t eth_dev_poll(void);
-uint32_t eth_get_flow_cnt(void);
void eth_dev_recv(struct rte_mbuf *mbuf);
#endif /* __GAZELLE_ETHDEV_H__ */
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index e5eedd7..0faeccf 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -45,6 +45,7 @@ struct protocol_stack {
struct rte_ring *wakeup_ring;
struct reg_ring_msg *reg_buf;
+ volatile bool low_power;
volatile uint16_t conn_num __rte_cache_aligned;
lockless_queue rpc_queue __rte_cache_aligned;
char pad __rte_cache_aligned;
diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c
index 7938520..0f30d76 100644
--- a/src/lstack/netif/lstack_ethdev.c
+++ b/src/lstack/netif/lstack_ethdev.c
@@ -111,16 +111,6 @@ int32_t eth_dev_poll(void)
return nr_pkts;
}
-uint32_t eth_get_flow_cnt(void)
-{
- if (use_ltran()) {
- return rte_ring_count(get_protocol_stack()->rx_ring) + rte_ring_count(get_protocol_stack()->tx_ring);
- } else {
- /* can't get flow cnt, lstack_low_power_idling don't use this params */
- return LSTACK_LPM_RX_PKTS + 1;
- }
-}
-
static err_t eth_dev_output(struct netif *netif, struct pbuf *pbuf)
{
struct protocol_stack *stack = get_protocol_stack();
--
2.23.0

View File

@ -1,39 +0,0 @@
From 324c47ae4bd64bed134f75dc2a9ec93f8161ea26 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng14@huawei.com>
Date: Thu, 14 Jul 2022 22:23:51 +0800
Subject: [PATCH 12/19] add-port-mask-range-check
---
src/ltran/ltran_param.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/ltran/ltran_param.c b/src/ltran/ltran_param.c
index aafbeee..cd65531 100644
--- a/src/ltran/ltran_param.c
+++ b/src/ltran/ltran_param.c
@@ -335,12 +335,21 @@ static int32_t parse_bond_ports(const config_t *config, const char *key, struct
}
ltran_config->bond.port_num = separate_str_to_array(port_str, ltran_config->bond.portmask, GAZELLE_MAX_BOND_NUM);
- if (ltran_config->bond.port_num >= GAZELLE_MAX_BOND_NUM) {
+ if (ltran_config->bond.port_num > GAZELLE_MAX_BOND_NUM) {
free(port_str);
gazelle_set_errno(GAZELLE_ERANGE);
return GAZELLE_ERR;
}
+ for (uint32_t i = 0; i < ltran_config->bond.port_num; i++) {
+ if (ltran_config->bond.portmask[i] < GAZELLE_BOND_PORT_MASK_MIN ||
+ ltran_config->bond.portmask[i] > GAZELLE_BOND_PORT_MASK_MAX) {
+ free(port_str);
+ gazelle_set_errno(GAZELLE_ERANGE);
+ return GAZELLE_ERR;
+ }
+ }
+
free(port_str);
return GAZELLE_OK;
}
--
2.23.0

View File

@ -1,125 +0,0 @@
From 7fac90c4e7bb0faf7c5341452a7b2a02470748d3 Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng14@huawei.com>
Date: Thu, 14 Jul 2022 22:25:44 +0800
Subject: [PATCH 13/19] release-kni-device
---
src/common/dpdk_common.c | 11 ++++++++++-
src/common/dpdk_common.h | 1 +
src/lstack/api/lstack_signal.c | 7 ++++++-
src/lstack/core/lstack_init.c | 2 ++
src/ltran/main.c | 5 +++--
5 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/src/common/dpdk_common.c b/src/common/dpdk_common.c
index 939d135..8d056f9 100644
--- a/src/common/dpdk_common.c
+++ b/src/common/dpdk_common.c
@@ -184,6 +184,15 @@ int32_t dpdk_kni_init(uint16_t port, struct rte_mempool *pool)
return 0;
}
+void dpdk_kni_release(void)
+{
+ if (g_pkni) {
+ rte_kni_release(g_pkni);
+ }
+
+ g_pkni = NULL;
+}
+
int32_t kni_process_tx(struct rte_mbuf **pkts_burst, uint32_t count)
{
uint32_t i = rte_kni_tx_burst(g_pkni, pkts_burst, count);
@@ -211,4 +220,4 @@ void kni_process_rx(uint16_t port)
pkts_burst[i] = NULL;
}
}
-}
\ No newline at end of file
+}
diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h
index 6a6a030..2066159 100644
--- a/src/common/dpdk_common.h
+++ b/src/common/dpdk_common.h
@@ -66,6 +66,7 @@ struct rte_kni* get_gazelle_kni(void);
int32_t dpdk_kni_init(uint16_t port, struct rte_mempool *pool);
int32_t kni_process_tx(struct rte_mbuf **pkts_burst, uint32_t count);
void kni_process_rx(uint16_t port);
+void dpdk_kni_release(void);
struct rte_eth_conf;
struct rte_eth_dev_info;
diff --git a/src/lstack/api/lstack_signal.c b/src/lstack/api/lstack_signal.c
index 4dba472..e73bc61 100644
--- a/src/lstack/api/lstack_signal.c
+++ b/src/lstack/api/lstack_signal.c
@@ -18,6 +18,8 @@
#include <lwip/lwipsock.h>
#include <lwip/posix_api.h>
+#include "lstack_cfg.h"
+#include "dpdk_common.h"
#include "lstack_log.h"
#include "lstack_control_plane.h"
@@ -55,9 +57,12 @@ static inline bool match_hijack_signal(int sig)
static void lstack_sig_default_handler(int sig)
{
LSTACK_LOG(ERR, LSTACK, "lstack dumpedcaught signal%d\n", sig);
- control_fd_close();
dump_stack();
lwip_exit();
+ if (!use_ltran()) {
+ dpdk_kni_release();
+ }
+ control_fd_close();
(void)kill(getpid(), sig);
}
diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c
index 78040b0..a506b34 100644
--- a/src/lstack/core/lstack_init.c
+++ b/src/lstack/core/lstack_init.c
@@ -152,6 +152,8 @@ __attribute__((destructor)) void gazelle_network_exit(void)
if (ret < 0) {
LSTACK_LOG(ERR, LSTACK, "rte_pdump_uninit failed\n");
}
+
+ dpdk_kni_release();
}
}
diff --git a/src/ltran/main.c b/src/ltran/main.c
index 701df3c..328ca89 100644
--- a/src/ltran/main.c
+++ b/src/ltran/main.c
@@ -18,6 +18,7 @@
#include <sys/types.h>
#include <rte_malloc.h>
+#include "dpdk_common.h"
#include "ltran_config.h"
#include "ltran_log.h"
#include "ltran_stat.h"
@@ -55,6 +56,7 @@ static void sig_default_handler(int32_t sig)
{
LTRAN_ERR("ltran dumpedcaught signal%d.\n", sig);
print_stack();
+ dpdk_kni_release();
kill(getpid(), sig);
}
@@ -125,8 +127,7 @@ static void ltran_core_destroy(void)
gazelle_stack_htable_destroy();
gazelle_tcp_conn_htable_destroy();
gazelle_tcp_sock_htable_destroy();
-
- return;
+ dpdk_kni_release();
}
static void wait_thread_finish(pthread_t ctrl_thread, uint32_t next_core)
--
2.23.0

View File

@ -1,167 +0,0 @@
From 07bb11a2f0b7a1b5e7cf2c965f490d6d83a0b92b Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng14@huawei.com>
Date: Thu, 14 Jul 2022 22:28:06 +0800
Subject: [PATCH 14/19] optimize check ltran exist
---
src/ltran/ltran_dfx.c | 89 +++++++++++++++++++++++--------------------
1 file changed, 47 insertions(+), 42 deletions(-)
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index 7db1adc..2b71021 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -52,7 +52,7 @@ static int32_t g_ltran_rate_show_flag = GAZELLE_OFF; // not show when first g
static struct gazelle_stat_ltran_total g_last_ltran_total;
static struct gazelle_stat_lstack_total g_last_lstack_total[GAZELLE_MAX_STACK_ARRAY_SIZE];
-static bool g_use_ltran;
+static bool g_use_ltran = false;
/* Use the largest data structure. */
#define GAZELLE_CMD_RESP_BUFFER_SIZE (sizeof(struct gazelle_stack_dfx_data) / sizeof(char))
@@ -104,23 +104,6 @@ static struct gazelle_dfx_list g_gazelle_dfx_tbl[] = {
static int32_t g_wait_reply = 1;
-static pid_t ltran_process_exist(void)
-{
- #define LINE 1024
- #define BASE_DEC_SCALE 10
- char line[LINE];
- FILE *cmd = popen("pidof ltran", "r");
-
- if (fgets(line, LINE, cmd) == NULL) {
- return 0;
- }
-
- pid_t pid = strtoul(line, NULL, BASE_DEC_SCALE);
- (void)pclose(cmd);
-
- return pid;
-}
-
static void gazelle_print_ltran_conn(void *buf, const struct gazelle_stat_msg_request *req_msg)
{
struct gazelle_stat_forward_table *table = (struct gazelle_stat_forward_table *)buf;
@@ -160,7 +143,7 @@ static void gazelle_print_ltran_sock(void *buf, const struct gazelle_stat_msg_re
printf("ltran sock table num: %u\n", table->conn_num);
}
-static int32_t dfx_stat_conn_to_ltran(struct gazelle_stat_msg_request *req_msg)
+static int32_t dfx_connect_ltran(bool use_ltran, bool probe)
{
int32_t ret, fd;
struct sockaddr_un addr;
@@ -177,7 +160,7 @@ static int32_t dfx_stat_conn_to_ltran(struct gazelle_stat_msg_request *req_msg)
}
addr.sun_family = AF_UNIX;
- if (g_use_ltran) {
+ if (use_ltran) {
ret = strncpy_s(addr.sun_path, sizeof(addr.sun_path), GAZELLE_DFX_SOCK_PATHNAME,
strlen(GAZELLE_DFX_SOCK_PATHNAME) + 1);
if (ret != EOK) {
@@ -193,12 +176,24 @@ static int32_t dfx_stat_conn_to_ltran(struct gazelle_stat_msg_request *req_msg)
ret = connect(fd, (const struct sockaddr *)&addr, sizeof(struct sockaddr_un));
if (ret == -1) {
- printf("connect ltran failed. errno: %d ret=%d\n", errno, ret);
+ if (!probe) {
+ printf("connect ltran failed. errno: %d ret=%d\n", errno, ret);
+ }
close(fd);
return GAZELLE_ERR;
}
- ret = write_specied_len(fd, (char *)req_msg, sizeof(*req_msg));
+ return fd;
+}
+
+static int32_t dfx_stat_conn_to_ltran(struct gazelle_stat_msg_request *req_msg)
+{
+ int32_t fd = dfx_connect_ltran(g_use_ltran, false);
+ if (fd < 0) {
+ return fd;
+ }
+
+ int32_t ret = write_specied_len(fd, (char *)req_msg, sizeof(*req_msg));
if (ret == -1) {
printf("write request msg failed ret=%d\n", ret);
close(fd);
@@ -899,8 +894,7 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_
}
if (i < conn->total_conn_num) {
- printf("...\n");
- printf("Total connections: %u, display connections: %u\n", conn->total_conn_num, i);
+ printf("...\nTotal connections: %u, display connections: %u\n", conn->total_conn_num, i);
}
if (stat->eof != 0) {
@@ -1199,29 +1193,13 @@ static int32_t check_cmd_support(struct gazelle_stat_msg_request *req_msg, int32
return -1;
}
-int32_t main(int32_t argc, char *argv[])
+int32_t dfx_loop(struct gazelle_stat_msg_request *req_msg, int32_t req_msg_num)
{
- struct gazelle_stat_msg_request req_msg[GAZELLE_CMD_MAX] = {0};
- int32_t req_msg_num, ret;
+ int32_t ret;
int32_t msg_index = 0;
struct gazelle_dfx_list *dfx = NULL;
char recv_buf[GAZELLE_CMD_RESP_BUFFER_SIZE + 1] = {0};
- g_use_ltran = ltran_process_exist() ? true : false;
- req_msg_num = parse_dfx_cmd_args(argc, argv, req_msg);
- if (req_msg_num <= 0 || req_msg_num > GAZELLE_CMD_MAX) {
- show_usage();
- return 0;
- }
-
- if (!g_use_ltran) {
- g_gazelle_dfx_tbl[GAZELLE_STAT_LSTACK_SHOW].recv_size = sizeof(struct gazelle_stack_dfx_data);
- ret = check_cmd_support(req_msg, req_msg_num);
- if (ret < 0) {
- return -1;
- }
- }
-
for (;;) {
dfx = find_dfx_node(req_msg[msg_index].stat_mode);
if (dfx == NULL) {
@@ -1260,3 +1238,30 @@ int32_t main(int32_t argc, char *argv[])
return 0;
}
+
+int32_t main(int32_t argc, char *argv[])
+{
+ struct gazelle_stat_msg_request req_msg[GAZELLE_CMD_MAX] = {0};
+ int32_t req_msg_num, ret;
+
+ int32_t fd = dfx_connect_ltran(true, true);
+ if (fd > 0) {
+ g_use_ltran = true;
+ close(fd);
+ }
+ req_msg_num = parse_dfx_cmd_args(argc, argv, req_msg);
+ if (req_msg_num <= 0 || req_msg_num > GAZELLE_CMD_MAX) {
+ show_usage();
+ return 0;
+ }
+
+ if (!g_use_ltran) {
+ g_gazelle_dfx_tbl[GAZELLE_STAT_LSTACK_SHOW].recv_size = sizeof(struct gazelle_stack_dfx_data);
+ ret = check_cmd_support(req_msg, req_msg_num);
+ if (ret < 0) {
+ return -1;
+ }
+ }
+
+ return dfx_loop(req_msg, req_msg_num);
+}
--
2.23.0

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,155 +0,0 @@
From 6331e41c9b6abf156a8de3c87c09131c6d3d84ba Mon Sep 17 00:00:00 2001
From: Honggang LI <honggangli@163.com>
Date: Fri, 15 Jul 2022 12:18:43 +0800
Subject: [PATCH 17/19] Support build gazelle with clang
Execute following bash command to build gazelle with clang:
$ VERBOSE=1 CC=clang sh build/build.sh
Signed-off-by: Honggang LI <honggangli@163.com>
---
src/common/dpdk_common.h | 2 +-
src/common/gazelle_base_func.h | 3 +++
src/lstack/Makefile | 8 ++++++--
src/lstack/api/lstack_epoll.c | 2 +-
src/lstack/core/lstack_lwip.c | 2 +-
src/lstack/core/lstack_protocol_stack.c | 2 +-
src/lstack/core/lstack_thread_rpc.c | 2 +-
src/ltran/CMakeLists.txt | 6 +++++-
src/ltran/ltran_stack.c | 2 +-
9 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h
index 493b435..01c941d 100644
--- a/src/common/dpdk_common.h
+++ b/src/common/dpdk_common.h
@@ -29,7 +29,7 @@
struct pbuf;
static inline struct rte_mbuf *pbuf_to_mbuf(struct pbuf *p)
{
- return ((struct rte_mbuf *)((uint8_t *)(p) - sizeof(struct rte_mbuf) - GAZELLE_MBUFF_PRIV_SIZE));
+ return ((struct rte_mbuf *)(void *)((uint8_t *)(p) - sizeof(struct rte_mbuf) - GAZELLE_MBUFF_PRIV_SIZE));
}
static inline struct pbuf_custom *mbuf_to_pbuf(struct rte_mbuf *m)
{
diff --git a/src/common/gazelle_base_func.h b/src/common/gazelle_base_func.h
index 9d7381e..fe3411a 100644
--- a/src/common/gazelle_base_func.h
+++ b/src/common/gazelle_base_func.h
@@ -32,4 +32,7 @@ int32_t separate_str_to_array(char *args, uint32_t *array, int32_t array_size);
int32_t check_and_set_run_dir(void);
+#undef container_of
+#define container_of(ptr, type, field) ((type *)(void*)(((char *)(ptr)) - offsetof(type, field)))
+
#endif /* ifndef __GAZELLE_BASE_FUNC_H__ */
diff --git a/src/lstack/Makefile b/src/lstack/Makefile
index 98289d8..0fb4405 100644
--- a/src/lstack/Makefile
+++ b/src/lstack/Makefile
@@ -16,12 +16,16 @@ LIB_PATH ?= /usr/lib64
AR = ar
ARFLAGS = crDP
-CC = gcc
+CC ?= gcc
OPTIMIZATION = -O2 -g
RM = rm -f
LDFLAGS = -shared -ldl -lm -lpthread -lrt -lnuma -lconfig -lboundscheck
-SEC_FLAGS = -fstack-protector-strong -Werror -Wall -Wl,-z,relro, -Wl,-z,now -Wl,-z,noexecstack -Wtrampolines -fPIC -D_FORTIFY_SOURCE=2
+ifeq ($(CC),gcc)
+ SEC_FLAGS = -fstack-protector-strong -Werror -Wall -Wl,-z,relro, -Wl,-z,now -Wl,-z,noexecstack -Wtrampolines -fPIC -D_FORTIFY_SOURCE=2
+else ifeq($(CC),clang)
+ SEC_FLAGS = -fstack-protector-strong -Werror -Wall -fPIC
+endif
INC = -I$(LSTACK_DIR)/include \
-I$(LSTACK_DIR)/../common \
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index 06a099d..310a0e7 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -187,7 +187,7 @@ static uint16_t find_max_cnt_stack(int32_t *stack_count, uint16_t stack_num, str
}
/* first bind and all stack same. choice tick as queue_id, avoid all bind to statck_0. */
- static uint16_t tick = 0;
+ static _Atomic uint16_t tick = 0;
if (all_same_cnt && stack_num) {
max_index = atomic_fetch_add(&tick, 1) % stack_num;
}
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 9f51ebd..4c2f0ea 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -104,7 +104,7 @@ static void replenish_send_idlembuf(struct rte_ring *ring)
void gazelle_init_sock(int32_t fd)
{
- static uint32_t name_tick = 0;
+ static _Atomic uint32_t name_tick = 0;
struct protocol_stack *stack = get_protocol_stack();
struct lwip_sock *sock = get_socket(fd);
if (sock == NULL) {
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 577711a..a2dd62c 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -113,7 +113,7 @@ struct protocol_stack *get_bind_protocol_stack(void)
/* close listen shadow, per app communication thread select only one stack */
if (get_global_cfg_params()->listen_shadow == false) {
- static uint16_t stack_index = 0;
+ static _Atomic uint16_t stack_index = 0;
index = atomic_fetch_add(&stack_index, 1);
if (index >= stack_group->stack_num) {
LSTACK_LOG(ERR, LSTACK, "thread =%hu larger than stack num = %hu\n", index, stack_group->stack_num);
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index 58c4b05..5a05c82 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -82,7 +82,7 @@ static inline __attribute__((always_inline)) void rpc_msg_free(struct rpc_msg *m
msg->self_release = 0;
msg->func = NULL;
- atomic_fetch_add(&msg->pool->cons, 1);
+ atomic_fetch_add((_Atomic uint32_t *)&msg->pool->cons, 1);
}
static inline __attribute__((always_inline)) void rpc_call(lockless_queue *queue, struct rpc_msg *msg)
diff --git a/src/ltran/CMakeLists.txt b/src/ltran/CMakeLists.txt
index 970bc1b..9c6751c 100644
--- a/src/ltran/CMakeLists.txt
+++ b/src/ltran/CMakeLists.txt
@@ -14,7 +14,11 @@ project(ltran)
set(COMMON_DIR ${PROJECT_SOURCE_DIR}/../common)
set(CMAKE_VERBOSE_MAKEFILE ON)
-set(CMAKE_C_FLAGS "-g -fstack-protector-strong -Wall -Werror -fPIE -pie -pthread -D_FORTIFY_SOURCE=2 -O2 -fPIC")
+if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
+ set(CMAKE_C_FLAGS "-g -fstack-protector-strong -Wall -Werror -fPIE -pie -pthread -D_FORTIFY_SOURCE=2 -O2 -fPIC")
+elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang")
+ set(CMAKE_C_FLAGS "-O2 -g -fstack-protector-strong -Wall -Werror -fPIE -pthread")
+endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D LTRAN_COMPILE")
if($ENV{GAZELLE_COVERAGE_ENABLE})
diff --git a/src/ltran/ltran_stack.c b/src/ltran/ltran_stack.c
index 2049003..4be7c23 100644
--- a/src/ltran/ltran_stack.c
+++ b/src/ltran/ltran_stack.c
@@ -88,7 +88,7 @@ const struct gazelle_stack *gazelle_stack_get_by_tid(const struct gazelle_stack_
uint32_t index;
const struct gazelle_stack *stack = NULL;
const struct gazelle_stack_hbucket *stack_hbucket = NULL;
- const struct hlist_node *node = NULL;
+ struct hlist_node *node = NULL;
const struct hlist_head *head = NULL;
index = tid_hash_fn(tid) % GAZELLE_MAX_STACK_HTABLE_SIZE;
--
2.23.0

View File

@ -1,76 +0,0 @@
From 15dbe826aef71330043818c9a6c187819823768a Mon Sep 17 00:00:00 2001
From: Honggang LI <honggangli@163.com>
Date: Mon, 18 Jul 2022 10:57:34 +0800
Subject: [PATCH 18/19] Allow dynamic load PMDs
Signed-off-by: Honggang LI <honggangli@163.com>
---
src/lstack/Makefile | 52 +++++++++----------
1 files changed, 26 insertions(+), 26 deletions(-)
diff --git a/src/lstack/Makefile b/src/lstack/Makefile
index 0fb4405..7ce35d4 100644
--- a/src/lstack/Makefile
+++ b/src/lstack/Makefile
@@ -57,32 +57,32 @@ include $(patsubst %, %/dir.mk, $(DIRS))
OBJS = $(subst .c,.o,$(SRCS))
LWIP_LIB = $(LIB_PATH)/liblwip.a
-LIBRTE_LIB = $(LIB_PATH)/librte_bus_pci.a \
- $(LIB_PATH)/librte_pci.a \
- $(LIB_PATH)/librte_cmdline.a \
- $(LIB_PATH)/librte_hash.a \
- $(LIB_PATH)/librte_mempool.a \
- $(LIB_PATH)/librte_mempool_ring.a \
- $(LIB_PATH)/librte_timer.a \
- $(LIB_PATH)/librte_eal.a \
- $(LIB_PATH)/librte_ring.a \
- $(LIB_PATH)/librte_mbuf.a \
- $(LIB_PATH)/librte_telemetry.a \
- $(LIB_PATH)/librte_kni.a \
- $(LIB_PATH)/librte_net_ixgbe.a \
- $(LIB_PATH)/librte_kvargs.a \
- $(LIB_PATH)/librte_net_hinic.a \
- $(LIB_PATH)/librte_net_i40e.a \
- $(LIB_PATH)/librte_net_virtio.a \
- $(LIB_PATH)/librte_bus_vdev.a \
- $(LIB_PATH)/librte_net.a \
- $(LIB_PATH)/librte_rcu.a \
- $(LIB_PATH)/librte_ethdev.a \
- $(LIB_PATH)/librte_pdump.a \
- $(LIB_PATH)/librte_bpf.a \
- $(LIB_PATH)/librte_pcapng.a \
- $(LIB_PATH)/librte_security.a \
- $(LIB_PATH)/librte_cryptodev.a
+LIBRTE_LIB = $(LIB_PATH)/librte_bus_pci.so \
+ $(LIB_PATH)/librte_pci.so \
+ $(LIB_PATH)/librte_cmdline.so \
+ $(LIB_PATH)/librte_hash.so \
+ $(LIB_PATH)/librte_mempool.so \
+ $(LIB_PATH)/librte_mempool_ring.so \
+ $(LIB_PATH)/librte_timer.so \
+ $(LIB_PATH)/librte_eal.so \
+ $(LIB_PATH)/librte_ring.so \
+ $(LIB_PATH)/librte_mbuf.so \
+ $(LIB_PATH)/librte_telemetry.so \
+ $(LIB_PATH)/librte_kni.so \
+ $(LIB_PATH)/librte_net_ixgbe.so \
+ $(LIB_PATH)/librte_kvargs.so \
+ $(LIB_PATH)/librte_net_hinic.so \
+ $(LIB_PATH)/librte_net_i40e.so \
+ $(LIB_PATH)/librte_net_virtio.so \
+ $(LIB_PATH)/librte_bus_vdev.so \
+ $(LIB_PATH)/librte_net.so \
+ $(LIB_PATH)/librte_rcu.so \
+ $(LIB_PATH)/librte_ethdev.so \
+ $(LIB_PATH)/librte_pdump.so \
+ $(LIB_PATH)/librte_bpf.so \
+ $(LIB_PATH)/librte_pcapng.so \
+ $(LIB_PATH)/librte_security.so \
+ $(LIB_PATH)/librte_cryptodev.so
DEP_LIBS = $(LWIP_LIB) $(LIBRTE_LIB)
--
2.23.0

View File

@ -1,56 +0,0 @@
From 8870ece28ab3b467c43c1231177d826fd7907801 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Tue, 26 Jul 2022 21:03:23 +0800
Subject: [PATCH] support epoll oneshot
---
src/lstack/api/lstack_epoll.c | 13 +++++++++++++
src/lstack/core/lstack_lwip.c | 1 -
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index 310a0e7..963a696 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -291,6 +291,12 @@ static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event *
list_for_each_safe(node, temp, &wakeup->event_list) {
struct lwip_sock *sock = container_of(node, struct lwip_sock, event_list);
+
+ if (sock->epoll_events == 0) {
+ list_del_node_null(&sock->event_list);
+ continue;
+ }
+
if (sock->conn && sock->conn->acceptmbox) {
accept_num++;
}
@@ -299,6 +305,13 @@ static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event *
list_del_node_null(&sock->event_list);
}
+ /* EPOLLONESHOT: generate event after epoll_ctl add/mod event again
+ epoll_event set 0 avoid generating event util epoll_ctl set epoll_event a valu */
+ if (sock->epoll_events & EPOLLONESHOT) {
+ list_del_node_null(&sock->event_list);
+ sock->epoll_events = 0;
+ }
+
events[event_num].events = sock->events;
events[event_num].data = sock->ep_data;
event_num++;
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 4c2f0ea..80d781f 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -75,7 +75,6 @@ static void reset_sock_data(struct lwip_sock *sock)
sock->stack = NULL;
sock->wakeup = NULL;
sock->listen_next = NULL;
- sock->wait_close = false;
sock->epoll_events = 0;
sock->events = 0;
--
2.23.0

View File

@ -1,25 +0,0 @@
From 1981869b950e5eaaebfa55bb938336e57e682d7c Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Tue, 26 Jul 2022 21:45:48 +0800
Subject: [PATCH 04/20] modify readme and clean code
---
src/lstack/api/lstack_epoll.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index 963a696..9c44f87 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -384,7 +384,7 @@ static void change_epollfd_kernel_thread(struct wakeup_poll *wakeup, struct prot
static void epoll_bind_statck(struct wakeup_poll *wakeup)
{
/* all fd is kernel, set rand stack */
- if (wakeup->bind_stack == NULL && wakeup->max_stack== NULL) {
+ if (wakeup->bind_stack == NULL && wakeup->max_stack == NULL) {
update_epoll_max_stack(wakeup);
}
--
2.23.0

View File

@ -1,835 +0,0 @@
From 99c1b74a5dfe8ace8963e8015d581bd6cd6e092d Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Mon, 1 Aug 2022 15:32:49 +0800
Subject: [PATCH 06/20] ltran support muti proc with same ip
---
src/common/dpdk_common.h | 2 -
src/common/gazelle_dfx_msg.h | 1 +
src/common/gazelle_parse_config.c | 11 ++++-
src/lstack/core/lstack_cfg.c | 14 ++-----
src/lstack/core/lstack_stack_stat.c | 4 +-
src/ltran/ltran_dfx.c | 23 +++++++---
src/ltran/ltran_errno.c | 1 -
src/ltran/ltran_forward.c | 57 +++++++++----------------
src/ltran/ltran_instance.c | 65 ++++-------------------------
src/ltran/ltran_instance.h | 10 ++---
src/ltran/ltran_monitor.c | 12 ++----
src/ltran/ltran_param.c | 4 +-
src/ltran/ltran_stack.c | 2 -
src/ltran/ltran_stat.c | 57 ++++++-------------------
src/ltran/ltran_stat.h | 3 +-
src/ltran/ltran_tcp_conn.c | 3 --
src/ltran/ltran_tcp_sock.c | 2 -
17 files changed, 82 insertions(+), 189 deletions(-)
diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h
index 01c941d..987fbdd 100644
--- a/src/common/dpdk_common.h
+++ b/src/common/dpdk_common.h
@@ -62,8 +62,6 @@ static __rte_always_inline void copy_mbuf(struct rte_mbuf *dst, struct rte_mbuf
dst_data = (uint8_t *)PTR_TO_PRIVATE(dst);
src_data = (uint8_t *)PTR_TO_PRIVATE(src);
rte_memcpy(dst_data, src_data, GAZELLE_MBUFF_PRIV_SIZE);
-
- return;
}
static __rte_always_inline void time_stamp_into_mbuf(uint32_t rx_count, struct rte_mbuf *buf[], uint64_t time_stamp)
diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h
index 68b6364..4d838c0 100644
--- a/src/common/gazelle_dfx_msg.h
+++ b/src/common/gazelle_dfx_msg.h
@@ -224,6 +224,7 @@ struct gazelle_in_addr {
struct gazelle_stat_msg_request {
enum GAZELLE_STAT_MODE stat_mode;
struct gazelle_in_addr ip;
+ uint32_t pid;
union stat_param {
char log_level[GAZELLE_LOG_LEVEL_MAX];
diff --git a/src/common/gazelle_parse_config.c b/src/common/gazelle_parse_config.c
index 4e96fcc..8556e37 100644
--- a/src/common/gazelle_parse_config.c
+++ b/src/common/gazelle_parse_config.c
@@ -32,20 +32,27 @@ static int32_t parse_str_data(char *args, uint32_t *array, int32_t array_size)
elem = strtok_s(args, delim, &next_token);
start = strtol(elem, &endptr, 0);
+ if (endptr == elem) {
+ return cnt;
+ }
elem = strtok_s(NULL, delim, &next_token);
if (elem == NULL) {
/* just a single data */
- array[cnt++] = start;
+ array[cnt++] = (uint32_t)start;
return cnt;
}
end = strtol(elem, &endptr, 0);
+ if (endptr == elem) {
+ array[cnt++] = start;
+ return cnt;
+ }
for (int64_t i = start; i <= end && cnt < array_size; i++) {
if (i < 0 || i > UINT_MAX) {
break;
}
- array[cnt++] = i;
+ array[cnt++] = (uint32_t)i;
}
return cnt;
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
index ee914c5..5cd326b 100644
--- a/src/lstack/core/lstack_cfg.c
+++ b/src/lstack/core/lstack_cfg.c
@@ -246,8 +246,8 @@ static int32_t parse_stack_cpu_number(void)
static int32_t numa_to_cpusnum(unsigned socket_id, uint32_t *cpulist, int32_t num)
{
- char path[PATH_MAX];
- char strbuf[PATH_MAX];
+ char path[PATH_MAX] = {0};
+ char strbuf[PATH_MAX] = {0};
int32_t ret = snprintf_s(path, sizeof(path), PATH_MAX - 1, NUMA_CPULIST_PATH, socket_id);
if (ret < 0) {
@@ -330,7 +330,7 @@ static int32_t gazelle_parse_base_virtaddr(const char *arg, uintptr_t *base_vadd
viraddr = strtoull(arg, &end, BASE_HEX_SCALE);
/* check for errors */
- if ((errno != 0) || (arg[0] == '\0') || end == NULL || (*end != '\0')) {
+ if ((errno != 0) || (arg[0] == '\0') || (end == NULL) || (*end != '\0')) {
return -EINVAL;
}
@@ -408,7 +408,6 @@ static void print_dpdk_param(void)
static int32_t turn_args_to_config(int32_t argc, char **argv)
{
- char host_addr[PATH_MAX];
int32_t ret;
int32_t idx;
@@ -419,13 +418,8 @@ static int32_t turn_args_to_config(int32_t argc, char **argv)
// OPT_FILE_PREFIX
idx = get_param_idx(argc, argv, OPT_FILE_PREFIX);
if (idx < 0) {
- ret = sprintf_s(host_addr, sizeof(host_addr), "%s", inet_ntoa(g_config_params.host_addr));
- if (ret < 0) {
- return -1;
- }
-
ret = sprintf_s(g_config_params.sec_attach_arg.file_prefix, sizeof(g_config_params.sec_attach_arg.file_prefix),
- "gazelle_%s", host_addr);
+ "gazelle_%d", getpid());
if (ret < 0) {
return -1;
}
diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c
index ca7ce52..09aa04c 100644
--- a/src/lstack/core/lstack_stack_stat.c
+++ b/src/lstack/core/lstack_stack_stat.c
@@ -172,12 +172,12 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_
lstack_get_low_power_info(&dfx->low_power_info);
- int32_t ret = memcpy_s(&dfx->data.pkts, sizeof(dfx->data.pkts), &stack->stats, sizeof(dfx->data.pkts));
+ int32_t ret = memcpy_s(&dfx->data.pkts.stack_stat, sizeof(dfx->data.pkts), &stack->stats, sizeof(dfx->data.pkts));
if (ret != EOK) {
LSTACK_LOG(ERR, LSTACK, "memcpy_s err ret=%d \n", ret);
return;
}
-
+
get_wakeup_stat(stack, &dfx->data.pkts.wakeup_stat);
dfx->data.pkts.call_alloc_fail = stack_group->call_alloc_fail;
diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c
index 9da6b7f..3d977b5 100644
--- a/src/ltran/ltran_dfx.c
+++ b/src/ltran/ltran_dfx.c
@@ -860,7 +860,7 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_
do {
printf("\n------ stack tid: %6u ------\n", stat->tid);
printf("No. Proto recv_cnt recv_ring in_send send_ring sem_cnt fd Local Address "
- " Foreign Address State\n");
+ " Foreign Address State\n");
uint32_t unread_pkts = 0;
uint32_t unsend_pkts = 0;
for (i = 0; i < conn->conn_num && i < GAZELLE_LSTACK_MAX_CONN; i++) {
@@ -869,13 +869,13 @@ static void gazelle_print_lstack_stat_conn(void *buf, const struct gazelle_stat_
rip.s_addr = conn_info->rip;
lip.s_addr = conn_info->lip;
if ((conn_info->state == GAZELLE_ACTIVE_LIST) || (conn_info->state == GAZELLE_TIME_WAIT_LIST)) {
- printf("%-6utcp %-10u%-11u%-9u%-11u%-9d%s:%hu\t %s:%hu\t %s\n", i, conn_info->recv_cnt,
+ printf("%-6utcp %-10u%-11u%-9u%-11u%-9d%-7d%s:%hu %s:%hu %s\n", i, conn_info->recv_cnt,
conn_info->recv_ring_cnt, conn_info->in_send, conn_info->send_ring_cnt, conn_info->sem_cnt,
- inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port,
+ conn_info->fd, inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port,
inet_ntop(AF_INET, &rip, str_rip, sizeof(str_rip)), conn_info->r_port,
tcp_state_to_str(conn_info->tcp_sub_state));
} else if (conn_info->state == GAZELLE_LISTEN_LIST) {
- printf("%-6utcp %-50u%s:%hu\t 0.0.0.0:*\t\t LISTEN\n", i, conn_info->recv_cnt,
+ printf("%-6utcp %-57u%s:%hu 0.0.0.0:* LISTEN\n", i, conn_info->recv_cnt,
inet_ntop(AF_INET, &lip, str_ip, sizeof(str_ip)), conn_info->l_port);
} else {
printf("Got unknow tcp conn::%s:%5hu, state:%u\n",
@@ -1124,14 +1124,24 @@ static int32_t parse_dfx_lstack_args(int32_t argc, char *argv[], struct gazelle_
{
int32_t num_cmd = 0;
struct in_addr ip;
+ uint32_t pid = 0;
if (argc < GAZELLE_LSTACK_PARAM_NUM) {
return num_cmd;
}
+ /* args3 have ',' is ip or is pid */
char *param = argv[GAZELLE_OPTIONS_ARG_IDX];
- if (inet_aton(param, &ip) == 0) {
- return num_cmd;
+ if (strstr(param, ".")) {
+ if (inet_aton(param, &ip) == 0) {
+ return num_cmd;
+ }
+ } else {
+ char *end = NULL;
+ pid = (uint32_t)strtoul(param, &end, 0);
+ if (end == NULL || *end != '\0') {
+ return num_cmd;
+ }
}
param = argv[GAZELLE_COMMAND_ARG_IDX];
@@ -1145,6 +1155,7 @@ static int32_t parse_dfx_lstack_args(int32_t argc, char *argv[], struct gazelle_
for (int32_t i = 0; i < num_cmd; i++) {
req_msg[i].ip.s_addr = ip.s_addr;
+ req_msg[i].pid = pid;
}
return num_cmd;
}
diff --git a/src/ltran/ltran_errno.c b/src/ltran/ltran_errno.c
index beaf30f..4bf7dcd 100644
--- a/src/ltran/ltran_errno.c
+++ b/src/ltran/ltran_errno.c
@@ -22,6 +22,5 @@ int32_t gazelle_get_errno(void)
void gazelle_set_errno(const int32_t value)
{
g_gazelle_errno = value;
- return;
}
diff --git a/src/ltran/ltran_forward.c b/src/ltran/ltran_forward.c
index fb864b3..1a92348 100644
--- a/src/ltran/ltran_forward.c
+++ b/src/ltran/ltran_forward.c
@@ -289,7 +289,7 @@ static struct gazelle_stack* get_icmp_handle_stack(const struct rte_mbuf *m)
struct gazelle_instance *instance = NULL;
ipv4_hdr = rte_pktmbuf_mtod_offset(m, struct rte_ipv4_hdr *, sizeof(struct rte_ether_hdr));
- instance = gazelle_instance_map_by_ip(get_instance_mgr(), ipv4_hdr->dst_addr);
+ instance = gazelle_instance_get_by_ip(get_instance_mgr(), ipv4_hdr->dst_addr);
if (instance == NULL) {
return NULL;
}
@@ -336,38 +336,30 @@ static __rte_always_inline int32_t ipv4_handle(struct rte_mbuf *m, struct rte_ip
static __rte_always_inline void arp_handle(struct rte_mbuf *m)
{
- uint32_t i;
- struct gazelle_stack** stack_array = NULL;
- struct gazelle_instance *instance = NULL;
- struct rte_mbuf *m_copy = NULL;
- struct rte_arp_hdr *arph = NULL;
+ struct rte_arp_hdr *arph = rte_pktmbuf_mtod_offset(m, struct rte_arp_hdr *, sizeof(struct rte_ether_hdr));
get_statistics()->port_stats[g_port_index].arp_pkt++;
- arph = rte_pktmbuf_mtod_offset(m, struct rte_arp_hdr *, sizeof(struct rte_ether_hdr));
- /* in arp_handle, we do not check legality of the packet. just forward it to client.
- * this will not miss any packet to client(except some case discript below).
- * but maybe client recive more packet. */
- /* we do NOT handle gratuitous ARP now and do NOT handle the case that recieving other request
- to update our arp table. It will cause more ARP packet, just this. */
-
- instance = gazelle_instance_map_by_ip(get_instance_mgr(), arph->arp_data.arp_tip);
-
- if (instance == NULL) {
- return;
- }
+ /* arp pkt forward to every lwip stack */
+ struct gazelle_instance_mgr *mgr = get_instance_mgr();
+ for (uint32_t i = 0; i < GAZELLE_MAX_INSTANCE_NUM; i++) {
+ struct gazelle_instance *instance = mgr->instances[i];
+ if (instance == NULL || instance->ip_addr.s_addr != arph->arp_data.arp_tip) {
+ continue;
+ }
- stack_array = instance->stack_array;
- for (i = 0; i < instance->stack_cnt; i++) {
- if (stack_array[i] != NULL && INSTANCE_IS_ON(stack_array[i])) {
- m_copy = rte_pktmbuf_alloc(m->pool);
- if (m_copy == NULL) {
- LTRAN_ERR("copy mbuf failed in arp_handle. \n");
- return;
+ struct gazelle_stack **stack_array = instance->stack_array;
+ for (uint32_t j = 0; j < instance->stack_cnt; j++) {
+ if (stack_array[j] != NULL && INSTANCE_IS_ON(stack_array[j])) {
+ struct rte_mbuf *m_copy = rte_pktmbuf_alloc(m->pool);
+ if (m_copy == NULL) {
+ LTRAN_ERR("copy mbuf failed in arp_handle. \n");
+ return;
+ }
+ copy_mbuf(m_copy, m);
+ // send and free m_copy in enqueue_rx_packet
+ enqueue_rx_packet(stack_array[j], m_copy);
}
- copy_mbuf(m_copy, m);
- // send and free m_copy in enqueue_rx_packet
- enqueue_rx_packet(stack_array[i], m_copy);
}
}
}
@@ -404,7 +396,6 @@ forward_to_kni:
if (get_ltran_config()->dpdk.kni_switch == GAZELLE_ON) {
enqueue_rx_packet(get_kni_stack(), m);
}
- return;
}
static __rte_always_inline void msg_to_quintuple(struct gazelle_quintuple *transfer_qtuple,
@@ -501,8 +492,6 @@ static void tcp_hash_table_modify(struct gazelle_stack *stack, const struct reg_
LTRAN_ERR("unknown REG_RING type\n");
break;
}
-
- return;
}
static __rte_always_inline void tcp_hash_table_handle(struct gazelle_stack *stack)
@@ -529,7 +518,6 @@ static __rte_always_inline void tcp_hash_table_handle(struct gazelle_stack *stac
if (pthread_mutex_unlock(&sock_htable->mlock) != 0) {
LTRAN_WARN("write tcp_htable: unlock failed, errno %d\n", errno);
}
- return;
}
@@ -620,7 +608,6 @@ static __rte_always_inline void upstream_forward_loop(uint32_t port_id, uint32_t
// After receiving packets from the NIC for 64 times, we sends the packets in the TX queue to each thread.
flush_all_stack();
- return;
}
void upstream_forward(const uint16_t *port)
@@ -660,7 +647,6 @@ void upstream_forward(const uint16_t *port)
}
LTRAN_DEBUG("ltran rx loop stop.\n");
- return;
}
static __rte_always_inline void downstream_forward_one(struct gazelle_stack *stack, uint32_t port_id, uint32_t queue_id)
@@ -714,7 +700,6 @@ static __rte_always_inline void downstream_forward_one(struct gazelle_stack *sta
get_statistics()->port_stats[g_port_index].tx_bytes += tx_bytes;
get_statistics()->port_stats[g_port_index].tx += tx_pkts;
- return;
}
static __rte_always_inline void downstream_forward_loop(uint32_t port_id, uint32_t queue_id)
@@ -736,8 +721,6 @@ static __rte_always_inline void downstream_forward_loop(uint32_t port_id, uint32
}
}
}
-
- return;
}
int32_t downstream_forward(uint16_t *port)
diff --git a/src/ltran/ltran_instance.c b/src/ltran/ltran_instance.c
index 5560d0c..648eb89 100644
--- a/src/ltran/ltran_instance.c
+++ b/src/ltran/ltran_instance.c
@@ -43,7 +43,6 @@ static int32_t simple_response(int32_t fd, enum response_type type);
void set_tx_loop_count(void)
{
g_tx_loop_count++;
- return;
}
unsigned long get_tx_loop_count(void)
@@ -54,7 +53,6 @@ unsigned long get_tx_loop_count(void)
void set_rx_loop_count(void)
{
g_rx_loop_count++;
- return;
}
unsigned long get_rx_loop_count(void)
@@ -70,7 +68,6 @@ struct gazelle_instance_mgr *get_instance_mgr(void)
void set_instance_mgr(struct gazelle_instance_mgr *instance)
{
g_instance_mgr = instance;
- return;
}
struct gazelle_instance_mgr *gazelle_instance_mgr_create(void)
@@ -86,16 +83,6 @@ struct gazelle_instance_mgr *gazelle_instance_mgr_create(void)
mgr->subnet_size = (uint32_t)(get_ltran_config()->dispatcher.ipv4_subnet_size);
mgr->max_instance_num = get_ltran_config()->dispatcher.num_clients;
- mgr->ipv4_to_client = malloc(mgr->subnet_size * sizeof(*mgr->ipv4_to_client));
- if (mgr->ipv4_to_client == NULL) {
- free(mgr);
- return NULL;
- }
-
- for (uint32_t i = 0; i < mgr->subnet_size; i++) {
- mgr->ipv4_to_client[i] = GAZELLE_NULL_CLIENT;
- }
-
return mgr;
}
@@ -112,37 +99,16 @@ void gazelle_instance_mgr_destroy(void)
GAZELLE_FREE(mgr->instances[i]);
}
}
- GAZELLE_FREE(mgr->ipv4_to_client);
- GAZELLE_FREE(g_instance_mgr);
-}
-
-int32_t gazelle_instance_map_set(struct gazelle_instance_mgr *mgr, const struct gazelle_instance *instance)
-{
- if (instance == NULL) {
- return GAZELLE_ERR;
- }
-
- uint32_t ip_idx = instance->ip_addr.s_addr & mgr->net_mask;
- for (uint8_t i = 0; i < GAZELLE_MAX_INSTANCE_ARRAY_SIZE; i++) {
- if (mgr->instances[i] == instance) {
- mgr->ipv4_to_client[ntohl(ip_idx)] = i;
- return GAZELLE_OK;
- }
- }
-
- return GAZELLE_ERR;
+ GAZELLE_FREE(g_instance_mgr);
}
-struct gazelle_instance *gazelle_instance_map_by_ip(const struct gazelle_instance_mgr *mgr, uint32_t ip)
+struct gazelle_instance *gazelle_instance_get_by_ip(const struct gazelle_instance_mgr *mgr, uint32_t ip)
{
- uint32_t ip_idx = ntohl(ip & mgr->net_mask);
- if (ip_idx < mgr->subnet_size) {
- uint8_t cl_idx = mgr->ipv4_to_client[ip_idx];
- if (cl_idx == GAZELLE_NULL_CLIENT) {
- return NULL;
+ for (uint32_t i = 0; i < GAZELLE_MAX_INSTANCE_NUM; i++) {
+ if (mgr->instances[i]->ip_addr.s_addr == ip) {
+ return mgr->instances[i];
}
- return mgr->instances[cl_idx];
}
return NULL;
}
@@ -304,8 +270,7 @@ static int32_t instance_info_check(const struct client_proc_conf *conf)
return GAZELLE_ERR;
}
- if (gazelle_instance_map_by_ip(get_instance_mgr(), in.s_addr) ||
- gazelle_instance_get_by_pid(get_instance_mgr(), conf->pid)) {
+ if (gazelle_instance_get_by_pid(get_instance_mgr(), conf->pid)) {
LTRAN_ERR("pid %u: ip %s already exist.\n", conf->pid, addr);
return GAZELLE_ERR;
}
@@ -564,12 +529,6 @@ int32_t handle_reg_msg_proc_att(int32_t fd, struct reg_request_msg *recv_msg)
goto END;
}
- ret = gazelle_instance_map_set(get_instance_mgr(), instance);
- if (ret != GAZELLE_OK) {
- LTRAN_RTE_ERR("pid %u, gazelle_instance_map_set failed. ret=%d.\n", conf->pid, ret);
- goto END;
- }
-
ret = simple_response(fd, RSP_OK);
if (ret != 0) {
return GAZELLE_ERR;
@@ -680,7 +639,6 @@ static void handle_stack_logout(struct gazelle_instance *instance, const struct
gazelle_stack_del_by_tid(gazelle_get_stack_htable(), stack->tid);
LTRAN_INFO("tid %u, stack logout successfully.\n", tid);
- return;
}
static void handle_inst_logout_for_reg_thrd_ring(struct gazelle_instance *instance)
@@ -697,21 +655,15 @@ static void handle_inst_logout_for_reg_thrd_ring(struct gazelle_instance *instan
handle_stack_logout(instance, stack);
}
-
- return;
}
-static int32_t handle_inst_logout_reg_proc_att(struct gazelle_instance *instance,
- struct gazelle_instance_mgr *instance_mgr)
+static int32_t handle_inst_logout_reg_proc_att(struct gazelle_instance *instance)
{
int32_t ret;
instance->socket_size = 0;
instance->base_virtaddr = 0;
- uint32_t ip_idx = instance->ip_addr.s_addr & instance_mgr->net_mask;
- instance_mgr->ipv4_to_client[ntohl(ip_idx)] = GAZELLE_NULL_CLIENT;
-
ret = rte_eal_sec_detach(instance->file_prefix, (int32_t)strlen(instance->file_prefix));
if (ret < 0) {
LTRAN_RTE_ERR("rte_eal_sec_detach failed:%d.\n", ret);
@@ -725,7 +677,6 @@ static void handle_inst_logout_reg_proc_mem(struct gazelle_instance *instance)
remove_virtual_area(instance->base_virtaddr, (size_t)instance->socket_size);
free(instance);
- return;
}
void handle_instance_logout(uint32_t pid)
@@ -751,7 +702,7 @@ void handle_instance_logout(uint32_t pid)
handle_inst_logout_for_reg_thrd_ring(instance);
/* fallthrough */
case RQT_REG_PROC_ATT:
- ret = handle_inst_logout_reg_proc_att(instance, instance_mgr);
+ ret = handle_inst_logout_reg_proc_att(instance);
/* fallthrough */
case RQT_REG_PROC_MEM:
/* instance ptr has been free after this func */
diff --git a/src/ltran/ltran_instance.h b/src/ltran/ltran_instance.h
index a8808df..2b888ec 100644
--- a/src/ltran/ltran_instance.h
+++ b/src/ltran/ltran_instance.h
@@ -41,6 +41,8 @@ struct gazelle_instance {
uint64_t socket_size;
uint8_t mac_addr[ETHER_ADDR_LEN];
char file_prefix[PATH_MAX];
+
+ struct gazelle_instance *next;
};
struct gazelle_instance_mgr {
@@ -53,11 +55,6 @@ struct gazelle_instance_mgr {
struct gazelle_instance *instances[GAZELLE_MAX_INSTANCE_NUM];
- /* we use ip to decide witch client to deliver
- * all of the ip address should be in one subnet
- * ipv4_to_client[ip_int & mask]
- */
- uint8_t *ipv4_to_client;
/* net byte order */
uint32_t net_mask;
uint32_t subnet_size;
@@ -82,8 +79,7 @@ void gazelle_instance_mgr_destroy(void);
struct gazelle_instance_mgr *gazelle_instance_mgr_create(void);
struct gazelle_instance *gazelle_instance_get_by_pid(const struct gazelle_instance_mgr *mgr, uint32_t pid);
-struct gazelle_instance *gazelle_instance_map_by_ip(const struct gazelle_instance_mgr *mgr, uint32_t ip);
-int32_t gazelle_instance_map_set(struct gazelle_instance_mgr *mgr, const struct gazelle_instance *instance);
+struct gazelle_instance *gazelle_instance_get_by_ip(const struct gazelle_instance_mgr *mgr, uint32_t ip);
struct gazelle_instance *gazelle_instance_add_by_pid(struct gazelle_instance_mgr *mgr, uint32_t pid);
int32_t handle_reg_msg_proc_mem(int32_t fd, struct reg_request_msg *recv_msg);
diff --git a/src/ltran/ltran_monitor.c b/src/ltran/ltran_monitor.c
index 0562ce1..dfda93f 100644
--- a/src/ltran/ltran_monitor.c
+++ b/src/ltran/ltran_monitor.c
@@ -286,8 +286,6 @@ static void dfx_server_msg_proc(uint32_t events, struct sockfd_data *data)
close(conn_fd);
return;
}
-
- return;
}
static int32_t ltran_req_mode_process(int32_t fd, struct gazelle_stat_msg_request *req_msg)
@@ -311,12 +309,12 @@ static int32_t ltran_req_mode_process(int32_t fd, struct gazelle_stat_msg_reques
handle_resp_ltran_latency(fd);
break;
case GAZELLE_STAT_LTRAN_START_LATENCY:
- handle_cmd_to_lstack(req_msg);
+ handle_resp_lstack_transfer(req_msg, -1);
set_start_latency_flag(GAZELLE_ON);
break;
case GAZELLE_STAT_LTRAN_STOP_LATENCY:
set_start_latency_flag(GAZELLE_OFF);
- handle_cmd_to_lstack(req_msg);
+ handle_resp_lstack_transfer(req_msg, -1);
break;
case GAZELLE_STAT_LTRAN_QUIT:
set_ltran_stop_flag(GAZELLE_TRUE);
@@ -333,7 +331,7 @@ static int32_t lstack_req_mode_process(int32_t fd, const struct gazelle_stat_msg
{
switch (req_msg->stat_mode) {
case GAZELLE_STAT_LSTACK_LOG_LEVEL_SET:
- handle_cmd_to_lstack(req_msg);
+ handle_resp_lstack_transfer(req_msg, -1);
break;
case GAZELLE_STAT_LSTACK_SHOW_RATE:
handle_resp_lstack_total(req_msg, fd);
@@ -392,7 +390,6 @@ END:
/* always close cmd_fd */
g_dfx_fd_cnt--;
sockfd_data_free(data);
- return;
}
static void reg_server_msg_proc(uint32_t events, struct sockfd_data *data)
@@ -433,8 +430,6 @@ static void reg_server_msg_proc(uint32_t events, struct sockfd_data *data)
sockfd_data_free(event.data.ptr);
return;
}
-
- return;
}
static void reg_conn_msg_proc(uint32_t events, struct sockfd_data *data)
@@ -480,7 +475,6 @@ END:
handle_instance_logout(data->pid);
}
sockfd_data_free(data);
- return;
}
static void gazelle_ctl_loop(void)
diff --git a/src/ltran/ltran_param.c b/src/ltran/ltran_param.c
index 40ee8d3..75cc2f9 100644
--- a/src/ltran/ltran_param.c
+++ b/src/ltran/ltran_param.c
@@ -59,7 +59,7 @@ static int32_t parse_str2mac(char *mac_str, uint8_t *ether_addr)
char *tmp = NULL;
int32_t i = 0;
token = strtok_s(mac_str, delim, &tmp);
- while (token != NULL) {
+ while (token != NULL && *token != '\0') {
one_bit_mac = strtoul(token, &end, HEX_BASE);
if ((end == NULL) || (*end != '\0')) {
gazelle_set_errno(GAZELLE_EMAC);
@@ -419,7 +419,6 @@ static void macs_cache_free(char **bond_mac_cache, int32_t cnt, int32_t max_cnt)
for (int32_t i = 0; i < cnt; i++) {
GAZELLE_FREE(bond_mac_cache[i]);
}
- return;
}
static void parse_bond_macs_separate(const char *bond_macs_str, char **bond_mac_cache, int32_t cache_cnt,
@@ -451,7 +450,6 @@ static void parse_bond_macs_separate(const char *bond_macs_str, char **bond_mac_
}
free(bond_macs);
- return;
}
static int32_t parse_bond_macs(const config_t *config, const char *key, struct ltran_config *ltran_config)
diff --git a/src/ltran/ltran_stack.c b/src/ltran/ltran_stack.c
index 4be7c23..1c0d4f7 100644
--- a/src/ltran/ltran_stack.c
+++ b/src/ltran/ltran_stack.c
@@ -27,7 +27,6 @@ struct gazelle_stack_htable *gazelle_get_stack_htable(void)
void gazelle_set_stack_htable(struct gazelle_stack_htable *htable)
{
g_stack_htable = htable;
- return;
}
struct gazelle_stack_hbucket *gazelle_stack_hbucket_get_by_tid(struct gazelle_stack_htable *stack_htable, uint32_t tid);
@@ -186,6 +185,5 @@ void gazelle_stack_del_by_tid(struct gazelle_stack_htable *stack_htable, uint32_
stack_hbucket->chain_size--;
free(stack);
- return;
}
diff --git a/src/ltran/ltran_stat.c b/src/ltran/ltran_stat.c
index af79b76..50f65e3 100644
--- a/src/ltran/ltran_stat.c
+++ b/src/ltran/ltran_stat.c
@@ -80,7 +80,6 @@ int32_t get_start_latency_flag(void)
void set_ltran_stop_flag(int32_t flag)
{
g_ltran_stop_flag = flag;
- return;
}
int32_t get_ltran_stop_flag(void)
@@ -355,10 +354,9 @@ void handle_resp_ltran_latency(int32_t fd)
void handle_resp_lstack_total(const struct gazelle_stat_msg_request *msg, int32_t fd)
{
struct gazelle_stat_lstack_total stat = {0};
- struct gazelle_instance *instance = NULL;
- int32_t ret;
- instance = gazelle_instance_map_by_ip(get_instance_mgr(), msg->ip.s_addr);
+ struct gazelle_instance *instance = (msg->pid > 0) ? gazelle_instance_get_by_pid(get_instance_mgr(), msg->pid) :
+ gazelle_instance_get_by_ip(get_instance_mgr(), msg->ip.s_addr);
if (instance == NULL) {
LTRAN_ERR("Can't find the client ip to check\n");
return;
@@ -369,7 +367,7 @@ void handle_resp_lstack_total(const struct gazelle_stat_msg_request *msg, int32_
}
for (uint32_t i = 0; i < instance->stack_cnt; i++) {
- ret = gazelle_filling_lstack_stat_total(&stat, instance->stack_array[i]);
+ int32_t ret = gazelle_filling_lstack_stat_total(&stat, instance->stack_array[i]);
if (ret != GAZELLE_OK) {
LTRAN_ERR("gazelle_filling_lstack_stat_total failed. ret=%d.\n", ret);
return;
@@ -387,61 +385,32 @@ void handle_resp_lstack_total(const struct gazelle_stat_msg_request *msg, int32_
}
}
-static int32_t find_sockfd_by_ip(struct gazelle_in_addr ip)
+void handle_resp_lstack_transfer(const struct gazelle_stat_msg_request *msg, int32_t dfx_fd)
{
- struct gazelle_instance *instance = NULL;
+ struct gazelle_stack_dfx_data stat = {0};
- instance = gazelle_instance_map_by_ip(get_instance_mgr(), ip.s_addr);
+ struct gazelle_instance *instance = (msg->pid > 0) ? gazelle_instance_get_by_pid(get_instance_mgr(), msg->pid) :
+ gazelle_instance_get_by_ip(get_instance_mgr(), msg->ip.s_addr);
if (instance == NULL) {
- LTRAN_WARN("get null instance by ip %u\n", ip.s_addr);
- return -1;
+ LTRAN_ERR("get null instance by ip %u pid %u\n", msg->ip.s_addr, msg->pid);
+ return;
}
- return instance->sockfd;
-}
-
-void handle_cmd_to_lstack(const struct gazelle_stat_msg_request *msg)
-{
- struct gazelle_stack_dfx_data stat = {0};
- int32_t lstack_fd, ret;
-
- lstack_fd = find_sockfd_by_ip(msg->ip);
+ int32_t lstack_fd = instance->sockfd;
if (lstack_fd < 0) {
return;
}
(void)write_specied_len(lstack_fd, (const char *)msg, sizeof(struct gazelle_stat_msg_request));
- /* wait lstack finish this cmd avoid two write to lstack */
while (stat.eof == 0) {
- ret = read_specied_len(lstack_fd, (char *)&stat, sizeof(stat));
+ int32_t ret = read_specied_len(lstack_fd, (char *)&stat, sizeof(stat));
if (ret != GAZELLE_OK) {
return;
}
- }
-}
-
-void handle_resp_lstack_transfer(const struct gazelle_stat_msg_request *msg, int32_t fd)
-{
- int32_t lstack_fd;
- struct gazelle_stack_dfx_data stat = {0};
- int32_t cmd_fd = fd;
- int32_t ret;
-
- lstack_fd = find_sockfd_by_ip(msg->ip);
- if (lstack_fd < 0) {
- return;
- }
- (void)write_specied_len(lstack_fd, (const char *)msg, sizeof(struct gazelle_stat_msg_request));
-
- while (stat.eof == 0) {
- ret = read_specied_len(lstack_fd, (char *)&stat, sizeof(stat));
- if (ret != GAZELLE_OK) {
- return;
+ if (dfx_fd > 0) {
+ (void)write_specied_len(dfx_fd, (char *)&stat, sizeof(stat));
}
- (void)write_specied_len(cmd_fd, (char *)&stat, sizeof(stat));
}
-
- return;
}
diff --git a/src/ltran/ltran_stat.h b/src/ltran/ltran_stat.h
index 494c83e..f91b0c4 100644
--- a/src/ltran/ltran_stat.h
+++ b/src/ltran/ltran_stat.h
@@ -145,14 +145,13 @@ struct statistics *get_statistics(void);
struct gazelle_stat_msg_request;
void handle_resp_ltran_latency(int32_t fd);
-void handle_cmd_to_lstack(const struct gazelle_stat_msg_request *msg);
void handle_resp_ltran_sock(int32_t fd);
void handle_resp_ltran_total(int32_t fd);
void handle_resp_ltran_client(int32_t fd);
void handle_resp_ltran_conn(int32_t fd);
void handle_resp_lstack_latency(int32_t fd);
void set_ltran_log_level(struct gazelle_stat_msg_request *msg);
-void handle_resp_lstack_transfer(const struct gazelle_stat_msg_request *msg, int32_t fd);
+void handle_resp_lstack_transfer(const struct gazelle_stat_msg_request *msg, int32_t dfx_fd);
void handle_resp_lstack_total(const struct gazelle_stat_msg_request *msg, int32_t fd);
#endif /* ifndef __GAZELLE_STAT_H__ */
diff --git a/src/ltran/ltran_tcp_conn.c b/src/ltran/ltran_tcp_conn.c
index faa42e1..e0ad562 100644
--- a/src/ltran/ltran_tcp_conn.c
+++ b/src/ltran/ltran_tcp_conn.c
@@ -27,7 +27,6 @@ struct gazelle_tcp_conn_htable *gazelle_get_tcp_conn_htable(void)
void gazelle_set_tcp_conn_htable(struct gazelle_tcp_conn_htable *htable)
{
g_tcp_conn_htable = htable;
- return;
}
struct gazelle_tcp_conn_htable *gazelle_tcp_conn_htable_create(uint32_t max_conn_num)
@@ -73,7 +72,6 @@ void gazelle_tcp_conn_htable_destroy(void)
g_tcp_conn_htable = NULL;
rte_free(conn_htable);
- return;
}
struct gazelle_tcp_conn_hbucket *gazelle_conn_hbucket_get(struct gazelle_tcp_conn_htable *conn_htable,
@@ -181,6 +179,5 @@ void gazelle_conn_del_by_quintuple(struct gazelle_tcp_conn_htable *conn_htable,
rte_free(conn);
conn_htable->cur_conn_num--;
conn_hbucket->chain_size--;
- return;
}
diff --git a/src/ltran/ltran_tcp_sock.c b/src/ltran/ltran_tcp_sock.c
index e3b696b..7ba23f0 100644
--- a/src/ltran/ltran_tcp_sock.c
+++ b/src/ltran/ltran_tcp_sock.c
@@ -30,7 +30,6 @@ struct gazelle_tcp_sock_htable *gazelle_get_tcp_sock_htable(void)
void gazelle_set_tcp_sock_htable(struct gazelle_tcp_sock_htable *htable)
{
g_tcp_sock_htable = htable;
- return;
}
static struct gazelle_tcp_sock_hbucket *gazelle_hbucket_get_by_ipport(struct gazelle_tcp_sock_htable *tcp_sock_htable,
@@ -84,7 +83,6 @@ void gazelle_tcp_sock_htable_destroy(void)
}
GAZELLE_FREE(g_tcp_sock_htable);
- return;
}
static struct gazelle_tcp_sock_hbucket *gazelle_hbucket_get_by_ipport(struct gazelle_tcp_sock_htable *tcp_sock_htable,
--
2.23.0

View File

@ -1,39 +0,0 @@
From 9404570889caba130960d55fdba39b8bffc61274 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Mon, 1 Aug 2022 17:27:49 +0800
Subject: [PATCH 07/20] fix rpc msg out of bound
---
src/lstack/core/lstack_thread_rpc.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index 5a05c82..358ce54 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -24,6 +24,7 @@
#include "lstack_thread_rpc.h"
#define RPC_MSG_MAX 32
+#define RPC_MSG_MASK (RPC_MSG_MAX - 1)
struct rpc_msg_pool {
struct rpc_msg msgs[RPC_MSG_MAX];
uint32_t prod __rte_cache_aligned;
@@ -37,12 +38,12 @@ static inline __attribute__((always_inline)) struct rpc_msg *get_rpc_msg(struct
uint32_t cons = __atomic_load_n(&rpc_pool->cons, __ATOMIC_ACQUIRE);
uint32_t prod = rpc_pool->prod + 1;
- if (prod == cons) {
+ if (prod - cons >= RPC_MSG_MAX) {
return NULL;
}
rpc_pool->prod = prod;
- return &rpc_pool->msgs[prod];
+ return &rpc_pool->msgs[prod & RPC_MSG_MASK];
}
static struct rpc_msg *rpc_msg_alloc(struct protocol_stack *stack, rpc_msg_func func)
--
2.23.0

View File

@ -1,27 +0,0 @@
From 44d9d6ed74efef409cd05dbd7d99aeaa70ffb359 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Mon, 1 Aug 2022 19:25:28 +0800
Subject: [PATCH 08/20] fix traversal array use NULL pointer
---
src/ltran/ltran_instance.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/ltran/ltran_instance.c b/src/ltran/ltran_instance.c
index 648eb89..fc5b0fb 100644
--- a/src/ltran/ltran_instance.c
+++ b/src/ltran/ltran_instance.c
@@ -106,6 +106,10 @@ void gazelle_instance_mgr_destroy(void)
struct gazelle_instance *gazelle_instance_get_by_ip(const struct gazelle_instance_mgr *mgr, uint32_t ip)
{
for (uint32_t i = 0; i < GAZELLE_MAX_INSTANCE_NUM; i++) {
+ if (mgr->instances[i] == NULL) {
+ continue;
+ }
+
if (mgr->instances[i]->ip_addr.s_addr == ip) {
return mgr->instances[i];
}
--
2.23.0

View File

@ -1,138 +0,0 @@
From 9c3fe074be66abe142f19709bf7d1fe9793e104f Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Mon, 1 Aug 2022 22:34:13 +0800
Subject: [PATCH 09/20] same stack thread don't repeate send msg
---
src/lstack/core/lstack_lwip.c | 13 +++++++------
src/lstack/core/lstack_protocol_stack.c | 6 +++---
src/lstack/core/lstack_thread_rpc.c | 8 +++++++-
src/lstack/include/lstack_protocol_stack.h | 5 +++--
4 files changed, 20 insertions(+), 12 deletions(-)
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 80d781f..96c6c96 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -310,10 +310,8 @@ static void do_lwip_send(int32_t fd, struct lwip_sock *sock, int32_t flags)
replenish_send_idlembuf(sock->send_ring);
}
- if (len > 0) {
- if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_OUTIDLE(sock)) {
- add_epoll_event(sock->conn, EPOLLOUT);
- }
+ if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_OUTIDLE(sock)) {
+ add_epoll_event(sock->conn, EPOLLOUT);
}
}
@@ -322,6 +320,9 @@ void stack_send(struct rpc_msg *msg)
int32_t fd = msg->args[MSG_ARG_0].i;
int32_t flags = msg->args[MSG_ARG_2].i;
+ struct protocol_stack *stack = get_protocol_stack();
+ __atomic_store_n(&stack->in_send, false, __ATOMIC_RELEASE);
+
struct lwip_sock *sock = get_socket(fd);
if (sock == NULL) {
msg->result = -1;
@@ -337,9 +338,9 @@ void stack_send(struct rpc_msg *msg)
/* have remain data add sendlist */
if (NETCONN_IS_DATAOUT(sock)) {
if (list_is_null(&sock->send_list)) {
- list_add_node(&sock->stack->send_list, &sock->send_list);
+ list_add_node(&stack->send_list, &sock->send_list);
}
- sock->stack->stats.send_self_rpc++;
+ stack->stats.send_self_rpc++;
}
}
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index a2dd62c..4f1ad41 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -157,7 +157,7 @@ void low_power_idling(struct protocol_stack *stack)
2. If the number of received packets exceeds the threshold, the authorization mark will end;
3. If the number of rx queue packets is less than the threshold, set the CPU delegation flag; */
if (get_protocol_traffic(stack) < LSTACK_LPM_RX_PKTS) {
- nanosleep(&st, &st);
+ nanosleep(&st, NULL);
stack->low_power = true;
return;
}
@@ -181,7 +181,7 @@ void low_power_idling(struct protocol_stack *stack)
}
if (stack->low_power) {
- nanosleep(&st, &st);
+ nanosleep(&st, NULL);
}
}
@@ -238,7 +238,7 @@ static void* gazelle_wakeup_thread(void *arg)
for (;;) {
if (cfg->low_power_mod != 0 && stack->low_power) {
- nanosleep(&st, &st);
+ nanosleep(&st, NULL);
}
sem_t *event_sem[WAKEUP_MAX_NUM];
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index 358ce54..d0f5257 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -429,7 +429,12 @@ int32_t rpc_call_ioctl(int fd, long cmd, void *argp)
void rpc_call_send(int fd, const void *buf, size_t len, int flags)
{
+ /* same stack don't repeat send msg */
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
+ if (__atomic_load_n(&stack->in_send, __ATOMIC_ACQUIRE)) {
+ return;
+ }
+
struct rpc_msg *msg = rpc_msg_alloc(stack, stack_send);
if (msg == NULL) {
return;
@@ -438,8 +443,9 @@ void rpc_call_send(int fd, const void *buf, size_t len, int flags)
msg->args[MSG_ARG_0].i = fd;
msg->args[MSG_ARG_1].size = len;
msg->args[MSG_ARG_2].i = flags;
-
msg->self_release = 0;
+
+ stack->in_send = true;
rpc_call(&stack->rpc_queue, msg);
}
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index 39d29d7..2a6aec7 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -50,7 +50,7 @@ struct protocol_stack {
struct reg_ring_msg *reg_buf;
volatile bool low_power;
- volatile uint16_t conn_num __rte_cache_aligned;
+ volatile bool in_send __rte_cache_aligned;
lockless_queue rpc_queue __rte_cache_aligned;
char pad __rte_cache_aligned;
@@ -62,9 +62,10 @@ struct protocol_stack {
struct list_node recv_list;
struct list_node send_list;
+ volatile uint16_t conn_num;
struct stats_ *lwip_stats;
struct gazelle_stack_latency latency;
- struct gazelle_stack_stat stats __rte_cache_aligned;
+ struct gazelle_stack_stat stats;
};
struct eth_params;
--
2.23.0

View File

@ -1,26 +0,0 @@
From 4d5832685f7fbdb5314acdf04fbd0882357880ec Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Tue, 2 Aug 2022 19:32:54 +0800
Subject: [PATCH 11/20] fix memcpy out bounds
---
src/lstack/core/lstack_stack_stat.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c
index 09aa04c..e8c5bc3 100644
--- a/src/lstack/core/lstack_stack_stat.c
+++ b/src/lstack/core/lstack_stack_stat.c
@@ -172,7 +172,8 @@ static void get_stack_stats(struct gazelle_stack_dfx_data *dfx, struct protocol_
lstack_get_low_power_info(&dfx->low_power_info);
- int32_t ret = memcpy_s(&dfx->data.pkts.stack_stat, sizeof(dfx->data.pkts), &stack->stats, sizeof(dfx->data.pkts));
+ int32_t ret = memcpy_s(&dfx->data.pkts.stack_stat, sizeof(struct gazelle_stack_stat),
+ &stack->stats, sizeof(struct gazelle_stack_stat));
if (ret != EOK) {
LSTACK_LOG(ERR, LSTACK, "memcpy_s err ret=%d \n", ret);
return;
--
2.23.0

View File

@ -1,62 +0,0 @@
From e0e21a4170ef062cb66288beb6800a7c43da7136 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Mon, 29 Aug 2022 16:54:20 +0800
Subject: [PATCH 15/20] fix miss send rpc msg err
---
src/lstack/core/lstack_lwip.c | 1 -
src/lstack/core/lstack_thread_rpc.c | 5 -----
src/lstack/include/lstack_protocol_stack.h | 1 -
3 files changed, 7 deletions(-)
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 96c6c96..35b67f5 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -321,7 +321,6 @@ void stack_send(struct rpc_msg *msg)
int32_t flags = msg->args[MSG_ARG_2].i;
struct protocol_stack *stack = get_protocol_stack();
- __atomic_store_n(&stack->in_send, false, __ATOMIC_RELEASE);
struct lwip_sock *sock = get_socket(fd);
if (sock == NULL) {
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index d0f5257..a6e9725 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -429,11 +429,7 @@ int32_t rpc_call_ioctl(int fd, long cmd, void *argp)
void rpc_call_send(int fd, const void *buf, size_t len, int flags)
{
- /* same stack don't repeat send msg */
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
- if (__atomic_load_n(&stack->in_send, __ATOMIC_ACQUIRE)) {
- return;
- }
struct rpc_msg *msg = rpc_msg_alloc(stack, stack_send);
if (msg == NULL) {
@@ -445,7 +441,6 @@ void rpc_call_send(int fd, const void *buf, size_t len, int flags)
msg->args[MSG_ARG_2].i = flags;
msg->self_release = 0;
- stack->in_send = true;
rpc_call(&stack->rpc_queue, msg);
}
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index 2a6aec7..36340ab 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -50,7 +50,6 @@ struct protocol_stack {
struct reg_ring_msg *reg_buf;
volatile bool low_power;
- volatile bool in_send __rte_cache_aligned;
lockless_queue rpc_queue __rte_cache_aligned;
char pad __rte_cache_aligned;
--
2.23.0

View File

@ -1,37 +0,0 @@
From 5d10ccf130b742f4e910568b642ac351a489c072 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Fri, 2 Sep 2022 19:26:05 +0800
Subject: [PATCH 17/20] fix proc can not exit due to lack of mem startup fail
---
src/lstack/core/lstack_protocol_stack.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 4f1ad41..3009286 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -373,10 +373,12 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id)
struct protocol_stack *stack = malloc(sizeof(*stack));
if (stack == NULL) {
LSTACK_LOG(ERR, LSTACK, "malloc stack failed\n");
+ sem_post(&stack_group->thread_phase1);
return NULL;
}
if (init_stack_value(stack, queue_id) != 0) {
+ sem_post(&stack_group->thread_phase1);
free(stack);
return NULL;
}
@@ -389,6 +391,7 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id)
if (use_ltran()) {
if (client_reg_thrd_ring() != 0) {
+ sem_post(&stack_group->thread_phase1);
free(stack);
return NULL;
}
--
2.23.0

View File

@ -1,25 +0,0 @@
From 27f6745def82693c661aaf0a1a6353790955755c Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Sat, 3 Sep 2022 20:51:41 +0800
Subject: [PATCH 18/20] read data with err event
---
src/lstack/core/lstack_lwip.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 35b67f5..10c2cd9 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -577,7 +577,7 @@ ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags)
GAZELLE_RETURN(EINVAL);
}
- if (sock->errevent > 0) {
+ if (sock->errevent > 0 && !NETCONN_IS_DATAIN(sock)) {
return 0;
}
--
2.23.0

View File

@ -1,44 +0,0 @@
From 138399196dcb2fb926cc2dbeedfcdb4bf1f1401b Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Sat, 3 Sep 2022 21:31:15 +0800
Subject: [PATCH 19/20] del gazelle ring cons.tail atomic protect
---
src/common/dpdk_common.h | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h
index 987fbdd..1c3e7e8 100644
--- a/src/common/dpdk_common.h
+++ b/src/common/dpdk_common.h
@@ -141,7 +141,7 @@ static __rte_always_inline uint32_t gazelle_light_ring_dequeue_burst(struct rte_
static __rte_always_inline uint32_t gazelle_ring_sp_enqueue(struct rte_ring *r, void **obj_table, uint32_t n)
{
uint32_t head = __atomic_load_n(&r->cons.head, __ATOMIC_ACQUIRE);
- uint32_t tail = __atomic_load_n(&r->cons.tail, __ATOMIC_ACQUIRE);
+ uint32_t tail = r->cons.tail;
uint32_t entries = r->capacity + tail - head;
if (n > entries) {
@@ -158,8 +158,8 @@ static __rte_always_inline uint32_t gazelle_ring_sp_enqueue(struct rte_ring *r,
static __rte_always_inline uint32_t gazelle_ring_sc_dequeue(struct rte_ring *r, void **obj_table, uint32_t n)
{
- uint32_t cons = __atomic_load_n(&r->cons.tail, __ATOMIC_ACQUIRE);
uint32_t prod = __atomic_load_n(&r->prod.tail, __ATOMIC_ACQUIRE);
+ uint32_t cons = r->cons.tail;
uint32_t entries = prod - cons;
if (n > entries) {
@@ -172,7 +172,7 @@ static __rte_always_inline uint32_t gazelle_ring_sc_dequeue(struct rte_ring *r,
__rte_ring_dequeue_elems(r, cons, obj_table, sizeof(void *), n);
- __atomic_store_n(&r->cons.tail, cons + n, __ATOMIC_RELEASE);
+ r->cons.tail = cons + n;
return n;
}
--
2.23.0

View File

@ -1,40 +0,0 @@
From 09ca97c3777c5459fa8717e3ce298a62ff0c84e6 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Sat, 3 Sep 2022 21:50:27 +0800
Subject: [PATCH 20/20] fix send return vale
---
src/lstack/core/lstack_lwip.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 10c2cd9..5174e4c 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -256,12 +256,12 @@ static inline void del_data_out_event(struct lwip_sock *sock)
ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len)
{
if (sock->errevent > 0) {
- return 0;
+ GAZELLE_RETURN(ENOTCONN);
}
uint32_t free_count = gazelle_ring_readable_count(sock->send_ring);
if (free_count == 0) {
- return -1;
+ return 0;
}
struct pbuf *pbuf = NULL;
@@ -293,7 +293,7 @@ ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len)
}
}
- return (send_len <= 0) ? -1 : send_len;
+ return send_len;
}
static void do_lwip_send(int32_t fd, struct lwip_sock *sock, int32_t flags)
--
2.23.0

File diff suppressed because it is too large Load Diff

View File

@ -1,25 +0,0 @@
From 6c88041590ef9f79e85a243fa905267898f3ab98 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Mon, 5 Sep 2022 16:54:55 +0800
Subject: [PATCH] expand thread rpc msg pool size
---
src/lstack/core/lstack_thread_rpc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index a6e9725..c9fc4e9 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -23,7 +23,7 @@
#include "lstack_dpdk.h"
#include "lstack_thread_rpc.h"
-#define RPC_MSG_MAX 32
+#define RPC_MSG_MAX 512
#define RPC_MSG_MASK (RPC_MSG_MAX - 1)
struct rpc_msg_pool {
struct rpc_msg msgs[RPC_MSG_MAX];
--
2.23.0

View File

@ -1,80 +0,0 @@
From 0e4e3a3357d5a2ffff06bf9a32bba95e207e8ff0 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Tue, 6 Sep 2022 16:23:58 +0800
Subject: [PATCH 01/21] fix fd leak
---
src/lstack/core/lstack_control_plane.c | 6 +++++-
src/ltran/ltran_monitor.c | 4 +++-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/lstack/core/lstack_control_plane.c b/src/lstack/core/lstack_control_plane.c
index 8012fa6..7f62254 100644
--- a/src/lstack/core/lstack_control_plane.c
+++ b/src/lstack/core/lstack_control_plane.c
@@ -713,6 +713,7 @@ void control_server_thread(void *arg)
int32_t epfd = init_epoll(listenfd);
if (epfd < 0) {
+ posix_api->close_fn(listenfd);
LSTACK_LOG(ERR, LSTACK, "init_epoll failed\n");
return;
}
@@ -744,7 +745,9 @@ void control_server_thread(void *arg)
evt_array.data.fd = connfd;
evt_array.events = EPOLLIN;
- posix_api->epoll_ctl_fn(epfd, EPOLL_CTL_ADD, connfd, &evt_array);
+ if (posix_api->epoll_ctl_fn(epfd, EPOLL_CTL_ADD, connfd, &evt_array) < 0) {
+ posix_api->close_fn(connfd);
+ }
} else {
if (handle_stat_request(evt_array.data.fd) < 0) {
posix_api->close_fn(evt_array.data.fd);
@@ -761,6 +764,7 @@ void control_client_thread(void *arg)
epfd = init_epoll(sockfd);
if (epfd < 0) {
+ posix_api->close_fn(sockfd);
LSTACK_LOG(ERR, LSTACK, "control_thread fail\n");
return;
}
diff --git a/src/ltran/ltran_monitor.c b/src/ltran/ltran_monitor.c
index dfda93f..7da65ea 100644
--- a/src/ltran/ltran_monitor.c
+++ b/src/ltran/ltran_monitor.c
@@ -188,6 +188,7 @@ static int32_t gazelle_ctl_init(void)
ret = gazelle_ep_event_init(&event_dfx, GAZELLE_DFX_SERVER_FD, listenfd);
if (ret != GAZELLE_OK) {
+ close(listenfd);
return GAZELLE_ERR;
}
@@ -207,6 +208,7 @@ static int32_t gazelle_ctl_init(void)
ret = gazelle_ep_event_init(&event_reg, GAZELLE_REG_SERVER_FD, listenfd);
if (ret != GAZELLE_OK) {
+ close(listenfd);
sockfd_data_free(event_dfx.data.ptr);
return GAZELLE_ERR;
}
@@ -283,7 +285,6 @@ static void dfx_server_msg_proc(uint32_t events, struct sockfd_data *data)
if (ret < 0) {
LTRAN_ERR("epoll_ctl ERROR, errno: %d. ret=%d.\n", errno, ret);
sockfd_data_free(event.data.ptr);
- close(conn_fd);
return;
}
}
@@ -421,6 +422,7 @@ static void reg_server_msg_proc(uint32_t events, struct sockfd_data *data)
event.events = EPOLLIN;
if (event.data.ptr == NULL) {
LTRAN_ERR("alloc sockfd_data ERROR\n");
+ close(conn_fd);
return;
}
--
2.23.0

View File

@ -1,29 +0,0 @@
From 898e627aad3f0a997fa87a54ee397e999953d695 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Tue, 6 Sep 2022 19:08:25 +0800
Subject: [PATCH 02/21] fix del conn use after free
---
src/ltran/ltran_timer.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ltran/ltran_timer.c b/src/ltran/ltran_timer.c
index 3ee266c..85ea324 100644
--- a/src/ltran/ltran_timer.c
+++ b/src/ltran/ltran_timer.c
@@ -101,11 +101,11 @@ void gazelle_detect_conn_logout(struct gazelle_tcp_conn_htable *conn_htable)
hlist_del_init(&conn->conn_node);
conn_htable->cur_conn_num--;
conn_htable->array[i].chain_size--;
- rte_free(conn);
LTRAN_DEBUG("delete the tcp conn htable: tid %u quintuple[%u %u %u %u %u]\n",
conn->tid, conn->quintuple.protocol,
conn->quintuple.src_ip, (uint32_t)ntohs(conn->quintuple.src_port),
conn->quintuple.dst_ip, (uint32_t)ntohs(conn->quintuple.dst_port));
+ rte_free(conn);
}
}
}
--
2.23.0

View File

@ -1,24 +0,0 @@
From b7fe5b572c7d09a0e5ce58d0102ff76777edc8c4 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Tue, 6 Sep 2022 19:16:00 +0800
Subject: [PATCH 03/21] init g_gazelle_errno before use
---
src/ltran/ltran_param.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/ltran/ltran_param.c b/src/ltran/ltran_param.c
index 75cc2f9..fc45895 100644
--- a/src/ltran/ltran_param.c
+++ b/src/ltran/ltran_param.c
@@ -574,6 +574,7 @@ int32_t parse_config_file_args(const char *conf_file_path, struct ltran_config *
int32_t param_num = sizeof(g_param_parse_tbl) / sizeof(g_param_parse_tbl[0]);
for (int32_t i = 0; i < param_num; i++) {
+ gazelle_set_errno(GAZELLE_SUCCESS);
ret = g_param_parse_tbl[i].func(&config, g_param_parse_tbl[i].param_name, ltran_config);
if (ret != GAZELLE_OK) {
config_destroy(&config);
--
2.23.0

View File

@ -1,39 +0,0 @@
From c414e36e78b616b9d8a34317b2fd473c3c3ab000 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Tue, 6 Sep 2022 20:18:34 +0800
Subject: [PATCH 04/21] code format specification
---
src/lstack/core/lstack_dpdk.c | 2 +-
src/ltran/ltran_monitor.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index 366655c..340ae94 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -446,7 +446,7 @@ int32_t dpdk_ethdev_init(void)
rss_setup(port_id, nb_queues);
}
- return ERR_OK;
+ return 0;
}
static int32_t dpdk_ethdev_setup(const struct eth_params *eth_params, const struct protocol_stack *stack)
diff --git a/src/ltran/ltran_monitor.c b/src/ltran/ltran_monitor.c
index 7da65ea..d535726 100644
--- a/src/ltran/ltran_monitor.c
+++ b/src/ltran/ltran_monitor.c
@@ -414,7 +414,7 @@ static void reg_server_msg_proc(uint32_t events, struct sockfd_data *data)
timeout.tv_sec = 60; /* 60: timeout 60S */
ret = setsockopt(conn_fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
if (ret != 0) {
- LTRAN_ERR("setsockopt ERROR, errno: %d. ret=%d.\n", errno, ret);
+ LTRAN_WARN("setsockopt ERROR, errno: %d. ret=%d.\n", errno, ret);
}
struct epoll_event event = {0};
--
2.23.0

View File

@ -1,48 +0,0 @@
From 7a5a641ad5d56df224fd352b0a8366814bb819d2 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Tue, 13 Sep 2022 19:32:14 +0800
Subject: [PATCH 06/21] fix gazelle kernel event thread affinity same with
stack thread
---
src/lstack/core/lstack_protocol_stack.c | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 3009286..1dc6c3f 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -270,11 +270,7 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id)
stack_group->stacks[queue_id] = stack;
- cpu_set_t cpuset;
- CPU_ZERO(&cpuset);
- CPU_SET(stack->cpu_id, &cpuset);
- if (rte_thread_set_affinity(&cpuset) != 0) {
- LSTACK_LOG(ERR, LSTACK, "rte_thread_set_affinity failed\n");
+ if (thread_affinity_init(stack->cpu_id) != 0) {
return -1;
}
RTE_PER_LCORE(_lcore_id) = stack->cpu_id;
@@ -301,6 +297,8 @@ static void* gazelle_kernel_event(void *arg)
uint16_t queue_id = *(uint16_t *)arg;
struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id];
+ bind_to_stack_numa(stack);
+
int32_t epoll_fd = posix_api->epoll_create_fn(GAZELLE_LSTACK_MAX_CONN);
if (epoll_fd < 0) {
LSTACK_LOG(ERR, LSTACK, "queue_id=%hu epoll_fd=%d errno=%d\n", queue_id, epoll_fd, errno);
@@ -383,8 +381,6 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id)
return NULL;
}
- thread_affinity_init(stack->cpu_id);
-
hugepage_init();
tcpip_init(NULL, NULL);
--
2.23.0

View File

@ -1,77 +0,0 @@
From 37f9a2c0f60cb2757a0f1f64ad140ccbdc120501 Mon Sep 17 00:00:00 2001
From: compile_success <980965867@qq.com>
Date: Wed, 21 Sep 2022 07:57:35 +0000
Subject: [PATCH 07/21] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20have=5Fcorelist=5Far?=
=?UTF-8?q?g?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/lstack/core/lstack_cfg.c | 42 ++++++++++++++++++++++++++++++------
1 file changed, 35 insertions(+), 7 deletions(-)
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
index 5cd326b..b6a517b 100644
--- a/src/lstack/core/lstack_cfg.c
+++ b/src/lstack/core/lstack_cfg.c
@@ -208,6 +208,33 @@ static int32_t get_param_idx(int32_t argc, char **argv, const char *param)
return -1;
}
+static bool have_corelist_arg(int32_t argc, char **argv)
+{
+ for (uint32_t i = 0; i < argc; i++) {
+ if (strncmp(argv[i], OPT_BIND_CORELIST, strlen(OPT_BIND_CORELIST)) == 0) {
+ return true;
+ }
+
+ if (strncmp(argv[i], "--lcores", strlen("--lcores")) == 0) {
+ return true;
+ }
+
+ if (strncmp(argv[i], "-c", strlen("-c")) == 0) {
+ return true;
+ }
+
+ if (strncmp(argv[i], "-s", strlen("-s")) == 0) {
+ return true;
+ }
+
+ if (strncmp(argv[i], "-S", strlen("-S")) == 0) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
static int32_t parse_stack_cpu_number(void)
{
const config_setting_t *num_cpus = NULL;
@@ -222,14 +249,15 @@ static int32_t parse_stack_cpu_number(void)
if (args == NULL) {
return -EINVAL;
}
+ if (!have_corelist_arg(g_config_params.dpdk_argc, g_config_params.dpdk_argv)) {
+ int32_t idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST);
+ if (idx < 0) {
+ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(OPT_BIND_CORELIST);
+ g_config_params.dpdk_argc++;
- int32_t idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST);
- if (idx < 0) {
- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(OPT_BIND_CORELIST);
- g_config_params.dpdk_argc++;
-
- g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(args);
- g_config_params.dpdk_argc++;
+ g_config_params.dpdk_argv[g_config_params.dpdk_argc] = strdup(args);
+ g_config_params.dpdk_argc++;
+ }
}
char *tmp_arg = strdup(args);
--
2.23.0

View File

@ -1,48 +0,0 @@
From d609d7a16c0ab0e0215e7c84909bc19b8216727f Mon Sep 17 00:00:00 2001
From: compile_success <980965867@qq.com>
Date: Wed, 21 Sep 2022 12:06:21 +0000
Subject: [PATCH 08/21] ltran update list
---
src/ltran/ltran_forward.c | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/src/ltran/ltran_forward.c b/src/ltran/ltran_forward.c
index 1a92348..9ca04aa 100644
--- a/src/ltran/ltran_forward.c
+++ b/src/ltran/ltran_forward.c
@@ -432,18 +432,25 @@ static __rte_always_inline void tcp_hash_table_add_conn(struct gazelle_stack *st
struct gazelle_quintuple *transfer_qtuple, uint32_t tid)
{
struct gazelle_tcp_conn *tcp_conn = NULL;
+ struct gazelle_tcp_conn_htable *conn_htable = gazelle_get_tcp_conn_htable();
- /* When lstack is the server, conn is created in tcp_handle func. lwip send the connect command after
- receiving syn, and delete conn timeout. */
- tcp_conn = gazelle_conn_get_by_quintuple(gazelle_get_tcp_conn_htable(), transfer_qtuple);
+ tcp_conn = gazelle_conn_get_by_quintuple(conn_htable, transfer_qtuple);
if (tcp_conn) {
- tcp_conn->conn_timeout = -1;
- return;
+ /* When lstack is the server, conn is created in tcp_handle func. lwip send the connect command after
+ * receiving syn, and delete conn timeout. */
+ if (tcp_conn->conn_timeout >= 0) {
+ tcp_conn->conn_timeout = -1;
+ return;
+ } else {
+ /* del old invaild conn */
+ gazelle_conn_del_by_quintuple(conn_htable, transfer_qtuple);
+ printf("del old conn port=%d\n", ntohs(transfer_qtuple->dst_port));
+ }
}
/* When lstack is the client, lwip send the connect command while calling connect func. conn is created
without a timeout */
- tcp_conn = gazelle_conn_add_by_quintuple(gazelle_get_tcp_conn_htable(), transfer_qtuple);
+ tcp_conn = gazelle_conn_add_by_quintuple(conn_htable, transfer_qtuple);
if (tcp_conn == NULL) {
LTRAN_ERR("add tcp conn htable failed\n");
return;
--
2.23.0

View File

@ -1,37 +0,0 @@
From b2cb29c59dcfbeb2652d57e5f6484c5e1239dd94 Mon Sep 17 00:00:00 2001
From: compile_success <980965867@qq.com>
Date: Wed, 21 Sep 2022 11:56:18 +0000
Subject: [PATCH 09/21] remove get_reg_ring_free_count
---
src/lstack/netif/lstack_vdev.c | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c
index 31c1843..f9fa5a3 100644
--- a/src/lstack/netif/lstack_vdev.c
+++ b/src/lstack/netif/lstack_vdev.c
@@ -99,11 +99,6 @@ static uint32_t vdev_tx_xmit(struct protocol_stack *stack, struct rte_mbuf **pkt
return sent_pkts;
}
-static inline uint32_t get_reg_ring_free_count(const struct rte_ring *reg_ring)
-{
- return (reg_ring->capacity + reg_ring->cons.tail - reg_ring->cons.head);
-}
-
int32_t vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple)
{
if (!use_ltran()) {
@@ -132,7 +127,7 @@ int32_t vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple)
do {
(void)gazelle_ring_sc_dequeue(stack->reg_ring, free_buf, VDEV_REG_QUEUE_SZ);
- if (get_reg_ring_free_count(stack->reg_ring) == 0) {
+ if (gazelle_ring_free_count(stack->reg_ring) == 0) {
continue;
}
--
2.23.0

View File

@ -1,25 +0,0 @@
From 39cbe5776adb427d0e7d9a9bec58302a08202145 Mon Sep 17 00:00:00 2001
From: compile_success <980965867@qq.com>
Date: Wed, 21 Sep 2022 14:31:15 +0000
Subject: [PATCH 10/21] add errorno EISCONN
---
src/lstack/api/lstack_wrap.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c
index e402ce1..296906e 100644
--- a/src/lstack/api/lstack_wrap.c
+++ b/src/lstack/api/lstack_wrap.c
@@ -185,7 +185,7 @@ static int32_t do_connect(int32_t s, const struct sockaddr *name, socklen_t name
}
int32_t ret = rpc_call_connect(s, name, namelen);
- if (ret == 0) {
+ if (ret == 0 || errno == EISCONN) {
return ret;
}
--
2.23.0

View File

@ -1,29 +0,0 @@
From 241c72599d7da72ada7cc15da90b7309e74241ea Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Sat, 24 Sep 2022 21:48:12 +0800
Subject: [PATCH 11/21] fix sendmsg data write wrong
---
src/lstack/core/lstack_lwip.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 5174e4c..d1e09ce 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -526,7 +526,12 @@ ssize_t sendmsg_to_stack(int32_t s, const struct msghdr *message, int32_t flags)
if (ret < 0) {
return buflen == 0 ? ret : buflen;
}
+
buflen += ret;
+
+ if (ret < message->msg_iov[i].iov_len) {
+ return buflen;
+ }
}
return buflen;
--
2.23.0

View File

@ -1,69 +0,0 @@
From 4d12b47a714217615a04f2a084b9c4857167e258 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Thu, 6 Oct 2022 15:14:21 +0800
Subject: [PATCH 12/21] lstack restore pci bus after init
---
src/lstack/core/lstack_dpdk.c | 14 +++++++++++---
src/lstack/core/lstack_init.c | 1 +
src/lstack/include/lstack_dpdk.h | 1 +
3 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index 340ae94..10207d1 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -53,6 +53,7 @@ struct eth_params {
struct rte_eth_txconf tx_conf;
};
struct rte_kni;
+static rte_bus *g_pci_bus = NULL;
int32_t thread_affinity_default(void)
{
@@ -536,9 +537,16 @@ int32_t dpdk_init_lstack_kni(void)
void dpdk_skip_nic_init(void)
{
/* when lstack init nic again, ltran can't read pkts from nic. unregister pci_bus to avoid init nic in lstack */
- struct rte_bus *pci_bus = rte_bus_find_by_name("pci");
- if (pci_bus != NULL) {
- rte_bus_unregister(pci_bus);
+ g_pci_bus = rte_bus_find_by_name("pci");
+ if (g_pci_bus != NULL) {
+ rte_bus_unregister(g_pci_bus);
+ }
+}
+
+void dpdk_restore_pci(void)
+{
+ if (g_pci_bus != NULL) {
+ rte_bus_register(g_pci_bus);
}
}
diff --git a/src/lstack/core/lstack_init.c b/src/lstack/core/lstack_init.c
index 9fafda9..b1c69e6 100644
--- a/src/lstack/core/lstack_init.c
+++ b/src/lstack/core/lstack_init.c
@@ -251,6 +251,7 @@ __attribute__((constructor)) void gazelle_network_init(void)
/*
* Init control plane and dpdk init */
create_control_thread();
+ dpdk_restore_pci();
/*
* cancel the core binding from DPDK initialization */
diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h
index f0bf4a1..e224f23 100644
--- a/src/lstack/include/lstack_dpdk.h
+++ b/src/lstack/include/lstack_dpdk.h
@@ -50,5 +50,6 @@ int dpdk_ethdev_init(void);
int dpdk_ethdev_start(void);
void dpdk_skip_nic_init(void);
int32_t dpdk_init_lstack_kni(void);
+void dpdk_restore_pci(void);
#endif /* GAZELLE_DPDK_H */
--
2.23.0

View File

@ -1,133 +0,0 @@
From d168ee1528444bbdf3e1fd8f6a566295531177a8 Mon Sep 17 00:00:00 2001
From: wuchangsheng <wuchangsheng2@huawei.com>
Date: Thu, 6 Oct 2022 15:35:02 +0800
Subject: [PATCH 13/21] fix malloc rpc msg fail
---
src/lstack/core/lstack_dpdk.c | 2 +-
src/lstack/core/lstack_lwip.c | 17 ++++++++++++++++-
src/lstack/core/lstack_thread_rpc.c | 6 ++++--
src/lstack/include/lstack_thread_rpc.h | 2 +-
4 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index 10207d1..8d45838 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -53,7 +53,7 @@ struct eth_params {
struct rte_eth_txconf tx_conf;
};
struct rte_kni;
-static rte_bus *g_pci_bus = NULL;
+static struct rte_bus *g_pci_bus = NULL;
int32_t thread_affinity_default(void)
{
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index d1e09ce..6f08a1c 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -77,6 +77,7 @@ static void reset_sock_data(struct lwip_sock *sock)
sock->listen_next = NULL;
sock->epoll_events = 0;
sock->events = 0;
+ sock->in_send = 0;
if (sock->recv_lastdata) {
pbuf_free(sock->recv_lastdata);
@@ -328,6 +329,9 @@ void stack_send(struct rpc_msg *msg)
return;
}
+ __atomic_store_n(&sock->in_send, 0, __ATOMIC_RELEASE);
+ rte_mb();
+
if (!NETCONN_IS_DATAOUT(sock)) {
return;
}
@@ -338,6 +342,7 @@ void stack_send(struct rpc_msg *msg)
if (NETCONN_IS_DATAOUT(sock)) {
if (list_is_null(&sock->send_list)) {
list_add_node(&stack->send_list, &sock->send_list);
+ __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE);
}
stack->stats.send_self_rpc++;
}
@@ -352,6 +357,9 @@ void send_stack_list(struct protocol_stack *stack, uint32_t send_max)
list_for_each_safe(node, temp, &stack->send_list) {
sock = container_of(node, struct lwip_sock, send_list);
+ __atomic_store_n(&sock->in_send, 0, __ATOMIC_RELEASE);
+ rte_mb();
+
if (sock->conn == NULL || !NETCONN_IS_DATAOUT(sock)) {
list_del_node_null(&sock->send_list);
continue;
@@ -361,6 +369,8 @@ void send_stack_list(struct protocol_stack *stack, uint32_t send_max)
if (!NETCONN_IS_DATAOUT(sock)) {
list_del_node_null(&sock->send_list);
+ } else {
+ __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE);
}
if (++read_num >= send_max) {
@@ -507,7 +517,12 @@ ssize_t gazelle_send(int32_t fd, const void *buf, size_t len, int32_t flags)
return 0;
}
- rpc_call_send(fd, NULL, send, flags);
+ if (__atomic_load_n(&sock->in_send, __ATOMIC_ACQUIRE) == 0) {
+ __atomic_store_n(&sock->in_send, 1, __ATOMIC_RELEASE);
+ if (rpc_call_send(fd, NULL, send, flags) != 0) {
+ __atomic_store_n(&sock->in_send, 0, __ATOMIC_RELEASE);
+ }
+ }
return send;
}
diff --git a/src/lstack/core/lstack_thread_rpc.c b/src/lstack/core/lstack_thread_rpc.c
index c9fc4e9..d1f7580 100644
--- a/src/lstack/core/lstack_thread_rpc.c
+++ b/src/lstack/core/lstack_thread_rpc.c
@@ -427,13 +427,13 @@ int32_t rpc_call_ioctl(int fd, long cmd, void *argp)
return rpc_sync_call(&stack->rpc_queue, msg);
}
-void rpc_call_send(int fd, const void *buf, size_t len, int flags)
+int32_t rpc_call_send(int fd, const void *buf, size_t len, int flags)
{
struct protocol_stack *stack = get_protocol_stack_by_fd(fd);
struct rpc_msg *msg = rpc_msg_alloc(stack, stack_send);
if (msg == NULL) {
- return;
+ return -1;
}
msg->args[MSG_ARG_0].i = fd;
@@ -442,6 +442,8 @@ void rpc_call_send(int fd, const void *buf, size_t len, int flags)
msg->self_release = 0;
rpc_call(&stack->rpc_queue, msg);
+
+ return 0;
}
int32_t rpc_call_sendmsg(int fd, const struct msghdr *msghdr, int flags)
diff --git a/src/lstack/include/lstack_thread_rpc.h b/src/lstack/include/lstack_thread_rpc.h
index 3732167..e1223de 100644
--- a/src/lstack/include/lstack_thread_rpc.h
+++ b/src/lstack/include/lstack_thread_rpc.h
@@ -66,7 +66,7 @@ int32_t rpc_call_bind(int32_t fd, const struct sockaddr *addr, socklen_t addrlen
int32_t rpc_call_listen(int s, int backlog);
int32_t rpc_call_accept(int fd, struct sockaddr *addr, socklen_t *addrlen);
int32_t rpc_call_connect(int fd, const struct sockaddr *addr, socklen_t addrlen);
-void rpc_call_send(int fd, const void *buf, size_t len, int flags);
+int32_t rpc_call_send(int fd, const void *buf, size_t len, int flags);
int32_t rpc_call_sendmsg(int fd, const struct msghdr *msg, int flags);
int32_t rpc_call_recvmsg(int fd, struct msghdr *msg, int flags);
int32_t rpc_call_getpeername(int fd, struct sockaddr *addr, socklen_t *addrlen);
--
2.23.0

View File

@ -1,64 +0,0 @@
From cc9db5e298dab1c1bac927464538ba51da07d9c6 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Sat, 8 Oct 2022 10:55:05 +0800
Subject: [PATCH 14/21] support dpdk dynamic memory
---
src/lstack/core/lstack_cfg.c | 20 +++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
index b6a517b..19a5b30 100644
--- a/src/lstack/core/lstack_cfg.c
+++ b/src/lstack/core/lstack_cfg.c
@@ -192,7 +192,6 @@ static int32_t parse_devices(void)
static int32_t get_param_idx(int32_t argc, char **argv, const char *param)
{
- int32_t ret;
int32_t idx;
if ((argc <= 0) || (argv == NULL) || (param == NULL)) {
@@ -200,8 +199,7 @@ static int32_t get_param_idx(int32_t argc, char **argv, const char *param)
}
for (idx = 0; idx < argc; ++idx) {
- ret = strncmp(argv[idx], param, strlen(param));
- if (ret == 0) {
+ if (strncmp(argv[idx], param, strlen(param)) == 0) {
return idx;
}
}
@@ -249,6 +247,7 @@ static int32_t parse_stack_cpu_number(void)
if (args == NULL) {
return -EINVAL;
}
+
if (!have_corelist_arg(g_config_params.dpdk_argc, g_config_params.dpdk_argv)) {
int32_t idx = get_param_idx(g_config_params.dpdk_argc, g_config_params.dpdk_argv, OPT_BIND_CORELIST);
if (idx < 0) {
@@ -465,12 +464,15 @@ static int32_t turn_args_to_config(int32_t argc, char **argv)
// OPT_SOCKET_MEM
idx = get_param_idx(argc, argv, OPT_SOCKET_MEM);
if ((idx < 0) || (idx + 1 >= argc)) {
- LSTACK_LOG(ERR, LSTACK, "Cannot find param %s\n", OPT_SOCKET_MEM);
- return idx;
- }
- ret = gazelle_parse_socket_mem(argv[idx + 1], &g_config_params.sec_attach_arg);
- if (ret < 0) {
- return ret;
+ if (use_ltran()) {
+ LSTACK_LOG(ERR, LSTACK, "Cannot find param %s\n", OPT_SOCKET_MEM);
+ return idx;
+ }
+ } else {
+ ret = gazelle_parse_socket_mem(argv[idx + 1], &g_config_params.sec_attach_arg);
+ if (ret < 0) {
+ return ret;
+ }
}
// OPT_BASE_VIRTADDR
--
2.23.0

View File

@ -1,87 +0,0 @@
From b3ccf93dec7581adfcfaf99c6ea8b8478da263b1 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Sat, 8 Oct 2022 11:10:24 +0800
Subject: [PATCH 15/21] fix lwip_send fail free pbuf miss data
---
src/common/dpdk_common.h | 25 +++++++++++++++++++++++++
src/lstack/core/lstack_lwip.c | 7 ++++++-
src/lstack/include/lstack_lwip.h | 1 +
3 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/src/common/dpdk_common.h b/src/common/dpdk_common.h
index 1c3e7e8..c2cbda7 100644
--- a/src/common/dpdk_common.h
+++ b/src/common/dpdk_common.h
@@ -177,6 +177,31 @@ static __rte_always_inline uint32_t gazelle_ring_sc_dequeue(struct rte_ring *r,
return n;
}
+/* get ring obj dont dequeue */
+static __rte_always_inline uint32_t gazelle_ring_sc_peek(struct rte_ring *r, void **obj_table, uint32_t n)
+{
+ uint32_t prod = __atomic_load_n(&r->prod.tail, __ATOMIC_ACQUIRE);
+ uint32_t cons = r->cons.tail;
+
+ uint32_t entries = prod - cons;
+ if (n > entries) {
+ n = entries;
+ }
+ if (unlikely(n == 0)) {
+ return 0;
+ }
+
+
+ __rte_ring_dequeue_elems(r, cons, obj_table, sizeof(void *), n);
+
+ return n;
+}
+
+static __rte_always_inline void gazelle_ring_dequeue_over(struct rte_ring *r, uint32_t n)
+{
+ r->cons.tail += n;
+}
+
static __rte_always_inline uint32_t gazelle_ring_read(struct rte_ring *r, void **obj_table, uint32_t n)
{
uint32_t cons = __atomic_load_n(&r->cons.head, __ATOMIC_ACQUIRE);
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 6f08a1c..3f21a3a 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -229,7 +229,7 @@ struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8
{
struct pbuf *pbuf = NULL;
- if (gazelle_ring_sc_dequeue(sock->send_ring, (void **)&pbuf, 1) != 1) {
+ if (gazelle_ring_sc_peek(sock->send_ring, (void **)&pbuf, 1) != 1) {
*apiflags &= ~TCP_WRITE_FLAG_MORE;
return NULL;
}
@@ -238,6 +238,11 @@ struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8
return pbuf;
}
+void write_lwip_over(struct lwip_sock *sock, uint32_t n)
+{
+ gazelle_ring_dequeue_over(sock->send_ring, n);
+}
+
static inline void del_data_out_event(struct lwip_sock *sock)
{
pthread_spin_lock(&sock->wakeup->event_list_lock);
diff --git a/src/lstack/include/lstack_lwip.h b/src/lstack/include/lstack_lwip.h
index c62e99d..968eff2 100644
--- a/src/lstack/include/lstack_lwip.h
+++ b/src/lstack/include/lstack_lwip.h
@@ -27,6 +27,7 @@ void gazelle_init_sock(int32_t fd);
int32_t gazelle_socket(int domain, int type, int protocol);
void gazelle_clean_sock(int32_t fd);
struct pbuf *write_lwip_data(struct lwip_sock *sock, uint16_t remain_size, uint8_t *apiflags);
+void write_lwip_over(struct lwip_sock *sock, uint32_t n);
ssize_t write_stack_data(struct lwip_sock *sock, const void *buf, size_t len);
ssize_t read_stack_data(int32_t fd, void *buf, size_t len, int32_t flags);
ssize_t read_lwip_data(struct lwip_sock *sock, int32_t flags, uint8_t apiflags);
--
2.23.0

View File

@ -1,984 +0,0 @@
From 045c0ea6fa5a2251a4a205bc9a732e694ddbb5a7 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Sat, 8 Oct 2022 16:51:11 +0800
Subject: [PATCH 16/21] merger wakeup
---
src/lstack/api/lstack_epoll.c | 366 +++++++++------------
src/lstack/core/lstack_lwip.c | 29 +-
src/lstack/core/lstack_protocol_stack.c | 92 ++----
src/lstack/core/lstack_stack_stat.c | 34 +-
src/lstack/include/lstack_protocol_stack.h | 4 +-
src/lstack/include/lstack_stack_stat.h | 5 +-
src/lstack/include/posix/lstack_epoll.h | 19 +-
7 files changed, 232 insertions(+), 317 deletions(-)
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
index 9c44f87..cc1cbf0 100644
--- a/src/lstack/api/lstack_epoll.c
+++ b/src/lstack/api/lstack_epoll.c
@@ -40,33 +40,35 @@
#define SEC_TO_NSEC 1000000000
#define SEC_TO_MSEC 1000
#define MSEC_TO_NSEC 1000000
-#define POLL_KERNEL_EVENTS 32
+#define POLL_KERNEL_EVENTS 128
-void add_epoll_event(struct netconn *conn, uint32_t event)
+void add_sock_event(struct lwip_sock *sock, uint32_t event)
{
- /* conn sock nerver null, because lwip call this func */
- struct lwip_sock *sock = get_socket_by_fd(conn->socket);
- if (sock->wakeup == NULL || (event & sock->epoll_events) == 0) {
+ struct wakeup_poll *wakeup = sock->wakeup;
+ if (wakeup == NULL || (event & sock->epoll_events) == 0) {
return;
}
- struct wakeup_poll *wakeup = sock->wakeup;
- struct protocol_stack *stack = sock->stack;
- if (wakeup->type == WAKEUP_EPOLL) {
- pthread_spin_lock(&wakeup->event_list_lock);
- sock->events |= (event == EPOLLERR) ? (EPOLLIN | EPOLLERR) : (event & sock->epoll_events);
- if (list_is_null(&sock->event_list)) {
- list_add_node(&wakeup->event_list, &sock->event_list);
- }
- pthread_spin_unlock(&wakeup->event_list_lock);
+ wakeup->have_event = true;
+
+ if (wakeup->type == WAKEUP_POLL) {
+ return;
}
- stack->stats.wakeup_events++;
- sem_t *sem = &wakeup->event_sem;
- if (get_protocol_stack_group()->wakeup_enable) {
- gazelle_light_ring_enqueue_busrt(stack->wakeup_ring, (void **)&sem, 1);
- } else {
- sem_post(sem);
+ pthread_spin_lock(&wakeup->event_list_lock);
+ sock->events |= (event == EPOLLERR) ? (EPOLLIN | EPOLLERR) : (event & sock->epoll_events);
+ if (list_is_null(&sock->event_list)) {
+ list_add_node(&wakeup->event_list, &sock->event_list);
+ }
+ pthread_spin_unlock(&wakeup->event_list_lock);
+}
+
+void wakeup_epoll(struct protocol_stack *stack, struct wakeup_poll *wakeup)
+{
+ if (__atomic_load_n(&wakeup->in_wait, __ATOMIC_ACQUIRE)) {
+ uint64_t tmp = 1;
+ posix_api->write_fn(wakeup->eventfd, &tmp, sizeof(tmp));
+ stack->stats.wakeup_events++;
}
}
@@ -98,11 +100,7 @@ static void raise_pending_events(struct wakeup_poll *wakeup, struct lwip_sock *s
{
sock->events = update_events(sock);
if (sock->events) {
- pthread_spin_lock(&wakeup->event_list_lock);
- if (list_is_null(&sock->event_list)) {
- list_add_node(&wakeup->event_list, &sock->event_list);
- }
- pthread_spin_unlock(&wakeup->event_list_lock);
+ add_sock_event(sock, sock->events);
}
}
@@ -120,28 +118,38 @@ int32_t lstack_epoll_create(int32_t size)
GAZELLE_RETURN(EINVAL);
}
- struct wakeup_poll *wakeup = malloc(sizeof(struct wakeup_poll));
+ struct wakeup_poll *wakeup = calloc(1, sizeof(struct wakeup_poll));
if (wakeup == NULL) {
+ LSTACK_LOG(ERR, LSTACK, "calloc null\n");
posix_api->close_fn(fd);
GAZELLE_RETURN(EINVAL);
}
- if (memset_s(wakeup, sizeof(struct wakeup_poll), 0, sizeof(struct wakeup_poll)) != 0) {
- LSTACK_LOG(ERR, LSTACK, "memset_s failed\n");
+
+ wakeup->eventfd = eventfd(0, EFD_NONBLOCK);
+ if (wakeup->eventfd < 0) {
+ LSTACK_LOG(ERR, LSTACK, "eventfd fail=%d errno=%d\n", wakeup->eventfd, errno);
+ posix_api->close_fn(fd);
free(wakeup);
+ GAZELLE_RETURN(EINVAL);
+ }
+
+ struct epoll_event event;
+ event.data.fd = wakeup->eventfd;
+ event.events = EPOLLIN | EPOLLET;
+ if (posix_api->epoll_ctl_fn(fd, EPOLL_CTL_ADD, wakeup->eventfd, &event) < 0) {
+ LSTACK_LOG(ERR, LSTACK, "eventfd errno=%d\n", errno);
posix_api->close_fn(fd);
+ free(wakeup);
GAZELLE_RETURN(EINVAL);
}
init_list_node(&wakeup->event_list);
- sem_init(&wakeup->event_sem, 0, 0);
pthread_spin_init(&wakeup->event_list_lock, PTHREAD_PROCESS_PRIVATE);
wakeup->type = WAKEUP_EPOLL;
wakeup->epollfd = fd;
sock->wakeup = wakeup;
- register_wakeup(wakeup);
-
return fd;
}
@@ -156,8 +164,10 @@ int32_t lstack_epoll_close(int32_t fd)
}
if (sock->wakeup) {
- unregister_wakeup(sock->wakeup);
- sem_destroy(&sock->wakeup->event_sem);
+ if (sock->stack) {
+ unregister_wakeup(sock->stack, sock->wakeup);
+ }
+ posix_api->close_fn(sock->wakeup->eventfd);
pthread_spin_destroy(&sock->wakeup->event_list_lock);
free(sock->wakeup);
}
@@ -217,19 +227,22 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even
return posix_api->epoll_ctl_fn(epfd, op, fd, event);
}
+
+ struct wakeup_poll *wakeup = epoll_sock->wakeup;
struct lwip_sock *sock = get_socket(fd);
if (sock == NULL) {
+ wakeup->have_kernel_fd = true;
return posix_api->epoll_ctl_fn(epfd, op, fd, event);
}
if (CONN_TYPE_HAS_HOST(sock->conn)) {
+ wakeup->have_kernel_fd = true;
int32_t ret = posix_api->epoll_ctl_fn(epfd, op, fd, event);
if (ret < 0) {
LSTACK_LOG(ERR, LSTACK, "fd=%d epfd=%d op=%d\n", fd, epfd, op);
}
}
- struct wakeup_poll *wakeup = epoll_sock->wakeup;
do {
switch (op) {
case EPOLL_CTL_ADD:
@@ -258,34 +271,10 @@ int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_even
return 0;
}
-static void del_node_array(struct epoll_event *events, int32_t event_num, int32_t del_index)
-{
- for (int32_t i = del_index; i + 1 < event_num; i++) {
- events[i] = events[i + 1];
- }
-}
-
-static int32_t del_duplicate_event(struct epoll_event *events, int32_t event_num)
-{
- int32_t num = event_num;
-
- for (int32_t i = 0; i < num; i++) {
- for (int32_t j = i + 1; j < num; j++) {
- if (events[i].data.u64 == events[j].data.u64) {
- del_node_array(events, num, j);
- num--;
- }
- }
- }
-
- return num;
-}
-
static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event *events, uint32_t maxevents)
{
int32_t event_num = 0;
struct list_node *node, *temp;
- int32_t accept_num = 0;
pthread_spin_lock(&wakeup->event_list_lock);
@@ -297,10 +286,6 @@ static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event *
continue;
}
- if (sock->conn && sock->conn->acceptmbox) {
- accept_num++;
- }
-
if (sock->epoll_events & EPOLLET) {
list_del_node_null(&sock->event_list);
}
@@ -323,10 +308,6 @@ static int32_t epoll_lwip_event(struct wakeup_poll *wakeup, struct epoll_event *
pthread_spin_unlock(&wakeup->event_list_lock);
- if (accept_num > 1) {
- event_num = del_duplicate_event(events, event_num);
- }
-
wakeup->stat.app_events += event_num;
return event_num;
}
@@ -354,33 +335,6 @@ static int32_t poll_lwip_event(struct pollfd *fds, nfds_t nfds)
return event_num;
}
-static void ms_to_timespec(struct timespec *timespec, int32_t timeout)
-{
- clock_gettime(CLOCK_REALTIME, timespec);
- timespec->tv_sec += timeout / SEC_TO_MSEC;
- timespec->tv_nsec += (timeout % SEC_TO_MSEC) * MSEC_TO_NSEC;
- timespec->tv_sec += timespec->tv_nsec / SEC_TO_NSEC;
- timespec->tv_nsec = timespec->tv_nsec % SEC_TO_NSEC;
-}
-
-static void change_epollfd_kernel_thread(struct wakeup_poll *wakeup, struct protocol_stack *old_stack,
- struct protocol_stack *new_stack)
-{
- if (old_stack) {
- if (posix_api->epoll_ctl_fn(old_stack->epollfd, EPOLL_CTL_DEL, wakeup->epollfd, NULL) != 0) {
- LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno);
- }
- }
-
- /* avoid kernel thread post too much, use EPOLLET */
- struct epoll_event event;
- event.data.ptr = wakeup;
- event.events = EPOLLIN | EPOLLOUT | EPOLLERR | EPOLLHUP | EPOLLET;
- if (posix_api->epoll_ctl_fn(new_stack->epollfd, EPOLL_CTL_ADD, wakeup->epollfd, &event) != 0) {
- LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno);
- }
-}
-
static void epoll_bind_statck(struct wakeup_poll *wakeup)
{
/* all fd is kernel, set rand stack */
@@ -390,11 +344,27 @@ static void epoll_bind_statck(struct wakeup_poll *wakeup)
if (wakeup->bind_stack != wakeup->max_stack && wakeup->max_stack) {
bind_to_stack_numa(wakeup->max_stack);
- change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, wakeup->max_stack);
+ if (wakeup->bind_stack) {
+ unregister_wakeup(wakeup->bind_stack, wakeup);
+ }
wakeup->bind_stack = wakeup->max_stack;
+ register_wakeup(wakeup->bind_stack, wakeup);
}
}
+static bool del_event_fd(struct epoll_event* events, int32_t eventnum, int32_t eventfd)
+{
+ for (int32_t i = 0; i < eventnum; i++) {
+ if (events[i].data.fd == eventfd) {
+ events[i].data.u64 = events[eventnum - 1].data.u64;
+ events[i].events = events[eventnum - 1].events;
+ return true;
+ }
+ }
+
+ return false;
+}
+
int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxevents, int32_t timeout)
{
struct lwip_sock *sock = get_socket_by_fd(epfd);
@@ -402,61 +372,66 @@ int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event* events, int32_t maxe
return posix_api->epoll_wait_fn(epfd, events, maxevents, timeout);
}
- int32_t event_num = 0;
- int32_t ret;
-
- struct timespec epoll_time;
- if (timeout >= 0) {
- ms_to_timespec(&epoll_time, timeout);
- }
+ struct wakeup_poll *wakeup = sock->wakeup;
+ int32_t kernel_num = 0;
epoll_bind_statck(sock->wakeup);
- do {
- event_num += epoll_lwip_event(sock->wakeup, &events[event_num], maxevents - event_num);
- sock->wakeup->stat.app_events += event_num;
+ __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE);
+ rte_mb();
- if (__atomic_load_n(&sock->wakeup->have_kernel_event, __ATOMIC_RELAXED)) {
- event_num += posix_api->epoll_wait_fn(epfd, &events[event_num], maxevents - event_num, 0);
- }
+ int32_t lwip_num = epoll_lwip_event(wakeup, events, maxevents);
+ wakeup->stat.app_events += lwip_num;
+ if (!wakeup->have_kernel_fd && lwip_num > 0) {
+ return lwip_num;
+ }
- if (event_num > 0) {
- while (sem_trywait(&sock->wakeup->event_sem) == 0);
- break;
- }
+ if (lwip_num > 0) {
+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE);
+ rte_mb();
+ kernel_num = posix_api->epoll_wait_fn(epfd, &events[lwip_num], maxevents - lwip_num, 0);
+ } else {
+ kernel_num = posix_api->epoll_wait_fn(epfd, &events[lwip_num], maxevents - lwip_num, timeout);
+ rte_mb();
+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE);
+ }
+
+ if (kernel_num <= 0) {
+ return (lwip_num > 0) ? lwip_num : kernel_num;
+ }
- sock->wakeup->have_kernel_event = false;
- if (timeout < 0) {
- ret = sem_wait(&sock->wakeup->event_sem);
- } else {
- ret = sem_timedwait(&sock->wakeup->event_sem, &epoll_time);
+ if (del_event_fd(&events[lwip_num], kernel_num, wakeup->eventfd)) {
+ if (lwip_num == 0) {
+ lwip_num = epoll_lwip_event(wakeup, events, maxevents);
}
- } while (ret == 0);
+ kernel_num--;
+ }
- return event_num;
+ return lwip_num + kernel_num;
}
-static void init_poll_wakeup_data(struct wakeup_poll *wakeup)
+static int32_t init_poll_wakeup_data(struct wakeup_poll *wakeup)
{
- sem_init(&wakeup->event_sem, 0, 0);
wakeup->type = WAKEUP_POLL;
- wakeup->last_fds = calloc(POLL_KERNEL_EVENTS, sizeof(struct pollfd));
- if (wakeup->last_fds == NULL) {
- LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno);
+ wakeup->eventfd = eventfd(0, EFD_NONBLOCK);
+ if (wakeup->eventfd < 0) {
+ LSTACK_LOG(ERR, LSTACK, "eventfd failed errno=%d\n", errno);
+ GAZELLE_RETURN(EINVAL);
}
- wakeup->events = calloc(POLL_KERNEL_EVENTS, sizeof(struct epoll_event));
- if (wakeup->events == NULL) {
+ wakeup->last_fds = calloc(POLL_KERNEL_EVENTS, sizeof(struct pollfd));
+ if (wakeup->last_fds == NULL) {
LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno);
+ posix_api->close_fn(wakeup->eventfd);
+ GAZELLE_RETURN(EINVAL);
}
+ wakeup->last_fds[0].fd = wakeup->eventfd;
+ wakeup->last_fds[0].events = POLLIN;
wakeup->last_max_nfds = POLL_KERNEL_EVENTS;
- wakeup->epollfd = posix_api->epoll_create_fn(POLL_KERNEL_EVENTS);
- if (wakeup->epollfd < 0) {
- LSTACK_LOG(ERR, LSTACK, "epoll_create_fn errno=%d\n", errno);
- }
+ return 0;
}
static void resize_kernel_poll(struct wakeup_poll *wakeup, nfds_t nfds)
@@ -464,23 +439,14 @@ static void resize_kernel_poll(struct wakeup_poll *wakeup, nfds_t nfds)
if (wakeup->last_fds) {
free(wakeup->last_fds);
}
- wakeup->last_fds = calloc(nfds, sizeof(struct pollfd));
+ wakeup->last_fds = calloc(nfds + 1, sizeof(struct pollfd));
if (wakeup->last_fds == NULL) {
LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno);
}
- if (wakeup->events) {
- free(wakeup->events);
- }
- wakeup->events = calloc(nfds, sizeof(struct epoll_event));
- if (wakeup->events == NULL) {
- LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno);
- }
-
+ wakeup->last_fds[0].fd = wakeup->eventfd;
+ wakeup->last_fds[0].events = POLLIN;
wakeup->last_max_nfds = nfds;
- if (memset_s(wakeup->last_fds, nfds * sizeof(struct pollfd), 0, nfds * sizeof(struct pollfd)) != 0) {
- LSTACK_LOG(ERR, LSTACK, "memset_s faile\n");
- }
}
static void poll_bind_statck(struct wakeup_poll *wakeup, int32_t *stack_count)
@@ -492,35 +458,16 @@ static void poll_bind_statck(struct wakeup_poll *wakeup, int32_t *stack_count)
return;
}
- change_epollfd_kernel_thread(wakeup, wakeup->bind_stack, stack_group->stacks[bind_id]);
+ if (wakeup->bind_stack) {
+ unregister_wakeup(wakeup->bind_stack, wakeup);
+ }
bind_to_stack_numa(stack_group->stacks[bind_id]);
wakeup->bind_stack = stack_group->stacks[bind_id];
-}
-
-static void update_kernel_poll(struct wakeup_poll *wakeup, uint32_t index, struct pollfd *new_fd)
-{
- posix_api->epoll_ctl_fn(wakeup->epollfd, EPOLL_CTL_DEL, wakeup->last_fds[index].fd, NULL);
-
- if (new_fd == NULL) {
- return;
- }
-
- struct epoll_event event;
- event.data.u32 = index;
- event.events = new_fd->events;
- if (posix_api->epoll_ctl_fn(wakeup->epollfd, EPOLL_CTL_ADD, new_fd->fd, &event) != 0) {
- LSTACK_LOG(ERR, LSTACK, "epoll_ctl_fn errno=%d\n", errno);
- }
+ register_wakeup(wakeup->bind_stack, wakeup);
}
static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfds)
{
- if (!wakeup->init) {
- wakeup->init = true;
- init_poll_wakeup_data(wakeup);
- register_wakeup(wakeup);
- }
-
int32_t stack_count[PROTOCOL_STACK_MAX] = {0};
int32_t poll_change = 0;
@@ -529,31 +476,22 @@ static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfd
resize_kernel_poll(wakeup, nfds);
poll_change = 1;
}
- /* poll fds num less, del old fd */
- for (uint32_t i = nfds; i < wakeup->last_nfds; i++) {
- update_kernel_poll(wakeup, i, NULL);
- poll_change = 1;
- }
for (uint32_t i = 0; i < nfds; i++) {
int32_t fd = fds[i].fd;
fds[i].revents = 0;
struct lwip_sock *sock = get_socket_by_fd(fd);
- if (fd == wakeup->last_fds[i].fd && fds[i].events == wakeup->last_fds[i].events) {
+ if (fd == wakeup->last_fds[i + 1].fd && fds[i].events == wakeup->last_fds[i + 1].events) {
/* fd close then socket may get same fd. */
if (sock == NULL || sock->wakeup != NULL) {
continue;
}
}
- wakeup->last_fds[i].fd = fd;
- wakeup->last_fds[i].events = fds[i].events;
+ wakeup->last_fds[i + 1].fd = fd;
+ wakeup->last_fds[i + 1].events = fds[i].events;
poll_change = 1;
- if (sock == NULL || sock->conn == NULL || CONN_TYPE_HAS_HOST(sock->conn)) {
- update_kernel_poll(wakeup, i, fds + i);
- }
-
while (sock && sock->conn) {
if (sock->epoll_events != (fds[i].events | POLLERR)) {
sock->epoll_events = fds[i].events | POLLERR;
@@ -571,51 +509,65 @@ static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfd
if (poll_change == 0) {
return;
}
- wakeup->last_nfds = nfds;
+ wakeup->last_nfds = nfds + 1;
poll_bind_statck(wakeup, stack_count);
}
int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout)
{
- static PER_THREAD struct wakeup_poll wakeup_poll = {0};
+ static PER_THREAD struct wakeup_poll *wakeup = NULL;
+ if (wakeup == NULL) {
+ wakeup = calloc(1, sizeof(struct wakeup_poll));
+ if (wakeup == NULL) {
+ GAZELLE_RETURN(EINVAL);
+ }
- poll_init(&wakeup_poll, fds, nfds);
+ if (init_poll_wakeup_data(wakeup) < 0) {
+ free(wakeup);
+ GAZELLE_RETURN(EINVAL);
+ }
+ }
- int32_t event_num = 0;
- int32_t ret;
+ poll_init(wakeup, fds, nfds);
+
+ __atomic_store_n(&wakeup->in_wait, true, __ATOMIC_RELEASE);
+ rte_mb();
- struct timespec poll_time;
- if (timeout >= 0) {
- ms_to_timespec(&poll_time, timeout);
+ int32_t lwip_num = poll_lwip_event(fds, nfds);
+ wakeup->stat.app_events += lwip_num;
+ if (lwip_num >= nfds) {
+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE);
+ return lwip_num;
}
- /* when epfd > 0 is epoll type */
- do {
- event_num += poll_lwip_event(fds, nfds);
-
- /* reduce syscall epoll_wait */
- if (__atomic_load_n(&wakeup_poll.have_kernel_event, __ATOMIC_RELAXED)) {
- int32_t kernel_num = posix_api->epoll_wait_fn(wakeup_poll.epollfd, wakeup_poll.events, nfds, 0);
- for (int32_t i = 0; i < kernel_num; i++) {
- uint32_t index = wakeup_poll.events[i].data.u32;
- fds[index].revents = wakeup_poll.events[i].events;
- }
- event_num += kernel_num >= 0 ? kernel_num : 0;
- }
+ int32_t kernel_num = 0;
+ if (lwip_num > 0) {
+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE);
+ rte_mb();
+ kernel_num = posix_api->poll_fn(wakeup->last_fds, wakeup->last_nfds, 0);
+ } else {
+ kernel_num = posix_api->poll_fn(wakeup->last_fds, wakeup->last_nfds, timeout);
+ rte_mb();
+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE);
+ }
- if (event_num > 0) {
- while (sem_trywait(&wakeup_poll.event_sem) == 0);
- break;
+ if (kernel_num <= 0) {
+ return (lwip_num > 0) ? lwip_num : kernel_num;
+ }
+
+ for (nfds_t i = 0; i < nfds; i++) {
+ if (fds[i].revents == 0 && wakeup->last_fds[i + 1].revents != 0) {
+ fds[i].revents = wakeup->last_fds[i + 1].revents;
}
+ }
- wakeup_poll.have_kernel_event = false;
- if (timeout < 0) {
- ret = sem_wait(&wakeup_poll.event_sem);
- } else {
- ret = sem_timedwait(&wakeup_poll.event_sem, &poll_time);
+ if (wakeup->last_fds[0].revents) {
+ if (lwip_num == 0) {
+ lwip_num = poll_lwip_event(fds, nfds);
}
- } while (ret == 0);
+ kernel_num--;
+ }
- return event_num;
+ return kernel_num + lwip_num;
}
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
index 3f21a3a..bb5a7e5 100644
--- a/src/lstack/core/lstack_lwip.c
+++ b/src/lstack/core/lstack_lwip.c
@@ -309,7 +309,7 @@ static void do_lwip_send(int32_t fd, struct lwip_sock *sock, int32_t flags)
if (len == 0) {
/* FIXME: should use POLLRDHUP, when connection be closed. lwip event-callback no POLLRDHUP */
sock->errevent = 1;
- add_epoll_event(sock->conn, EPOLLERR);
+ add_sock_event(sock, EPOLLERR);
}
if (gazelle_ring_readable_count(sock->send_ring) < SOCK_SEND_REPLENISH_THRES) {
@@ -317,7 +317,7 @@ static void do_lwip_send(int32_t fd, struct lwip_sock *sock, int32_t flags)
}
if ((sock->epoll_events & EPOLLOUT) && NETCONN_IS_OUTIDLE(sock)) {
- add_epoll_event(sock->conn, EPOLLOUT);
+ add_sock_event(sock, EPOLLOUT);
}
}
@@ -678,9 +678,9 @@ void read_recv_list(struct protocol_stack *stack, uint32_t max_num)
if (len == 0) {
/* FIXME: should use POLLRDHUP, when connection be closed. lwip event-callback no POLLRDHUP */
sock->errevent = 1;
- add_epoll_event(sock->conn, EPOLLERR);
+ add_sock_event(sock, EPOLLERR);
} else if (len > 0) {
- add_epoll_event(sock->conn, EPOLLIN);
+ add_sock_event(sock, EPOLLIN);
}
/* last_node:recv only once per sock. max_num avoid cost too much time this loop */
@@ -690,6 +690,23 @@ void read_recv_list(struct protocol_stack *stack, uint32_t max_num)
}
}
+void gazelle_connected_callback(struct netconn *conn)
+{
+ if (conn == NULL) {
+ return;
+ }
+
+ int32_t fd = conn->socket;
+ struct lwip_sock *sock = get_socket_by_fd(fd);
+ if (sock == NULL || sock->conn == NULL) {
+ return;
+ }
+
+ SET_CONN_TYPE_LIBOS(conn);
+
+ add_sock_event(sock, EPOLLOUT);
+}
+
static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const struct tcp_pcb *pcb)
{
struct netconn *netconn = (struct netconn *)pcb->callback_arg;
@@ -711,10 +728,6 @@ static void copy_pcb_to_conn(struct gazelle_stat_lstack_conn_info *conn, const s
conn->recv_ring_cnt += (sock->recv_lastdata) ? 1 : 0;
conn->send_ring_cnt = gazelle_ring_readover_count(sock->send_ring);
-
- if (sock->wakeup) {
- sem_getvalue(&sock->wakeup->event_sem, &conn->sem_cnt);
- }
}
}
}
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 1dc6c3f..6119975 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -262,6 +262,8 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id)
stack->cpu_id = get_global_cfg_params()->cpus[queue_id];
stack->lwip_stats = &lwip_stats;
+ pthread_spin_init(&stack->wakeup_list_lock, PTHREAD_PROCESS_PRIVATE);
+
init_list_node(&stack->recv_list);
init_list_node(&stack->send_list);
@@ -292,70 +294,6 @@ static int32_t init_stack_value(struct protocol_stack *stack, uint16_t queue_id)
return 0;
}
-static void* gazelle_kernel_event(void *arg)
-{
- uint16_t queue_id = *(uint16_t *)arg;
- struct protocol_stack *stack = get_protocol_stack_group()->stacks[queue_id];
-
- bind_to_stack_numa(stack);
-
- int32_t epoll_fd = posix_api->epoll_create_fn(GAZELLE_LSTACK_MAX_CONN);
- if (epoll_fd < 0) {
- LSTACK_LOG(ERR, LSTACK, "queue_id=%hu epoll_fd=%d errno=%d\n", queue_id, epoll_fd, errno);
- /* exit in main thread, avoid create mempool and exit at the same time */
- set_init_fail();
- stack->epollfd = -1;
- return NULL;
- }
-
- stack->epollfd = epoll_fd;
-
- LSTACK_LOG(INFO, LSTACK, "kernel_event_%02hu start\n", queue_id);
-
- struct epoll_event events[KERNEL_EPOLL_MAX];
- for (;;) {
- int32_t event_num = posix_api->epoll_wait_fn(epoll_fd, events, KERNEL_EPOLL_MAX, -1);
- if (event_num <= 0) {
- continue;
- }
-
- for (int32_t i = 0; i < event_num; i++) {
- struct wakeup_poll *wakeup = events[i].data.ptr;
- if (wakeup) {
- __atomic_store_n(&wakeup->have_kernel_event, true, __ATOMIC_RELEASE);
- sem_post(&wakeup->event_sem);
- }
- }
- }
-
- return NULL;
-}
-
-static int32_t create_companion_thread(struct protocol_stack_group *stack_group, struct protocol_stack *stack)
-{
- int32_t ret;
-
- ret = create_thread(stack->queue_id, "gazellekernel", gazelle_kernel_event);
- if (ret != 0) {
- LSTACK_LOG(ERR, LSTACK, "gazellekernelEvent ret=%d errno=%d\n", ret, errno);
- return ret;
- }
-
- /* wait gazelle_kernel_event finish use stack.avoid use stack after free when create gazelle_weakup_thread fail */
- while (stack->epollfd == 0) {
- usleep(1);
- }
-
- if (stack_group->wakeup_enable) {
- ret = create_thread(stack->queue_id, "gazelleweakup", gazelle_wakeup_thread);
- if (ret != 0) {
- LSTACK_LOG(ERR, LSTACK, "gazelleweakup ret=%d errno=%d\n", ret, errno);
- }
- }
-
- return ret;
-}
-
void wait_sem_value(sem_t *sem, int32_t wait_value)
{
int32_t sem_val;
@@ -404,14 +342,29 @@ static struct protocol_stack *stack_thread_init(uint16_t queue_id)
return NULL;
}
- if (create_companion_thread(stack_group, stack) != 0) {
- free(stack);
- return NULL;
+ if (stack_group->wakeup_enable) {
+ if (create_thread(stack->queue_id, "gazelleweakup", gazelle_wakeup_thread) != 0) {
+ LSTACK_LOG(ERR, LSTACK, "gazelleweakup errno=%d\n", errno);
+ free(stack);
+ return NULL;
+ }
}
return stack;
}
+static void wakeup_stack_wait(struct protocol_stack *stack)
+{
+ struct wakeup_poll *node = stack->wakeup_list;
+ while (node) {
+ if (node->have_event) {
+ wakeup_epoll(stack, node);
+ node->have_event = false;
+ }
+ node = node->next;
+ }
+}
+
static void* gazelle_stack_thread(void *arg)
{
uint16_t queue_id = *(uint16_t *)arg;
@@ -437,6 +390,8 @@ static void* gazelle_stack_thread(void *arg)
send_stack_list(stack, SEND_LIST_MAX);
+ wakeup_stack_wait(stack);
+
sys_timer_run();
if (get_global_cfg_params()->low_power_mod != 0) {
@@ -452,8 +407,6 @@ static int32_t init_protocol_sem(void)
int32_t ret;
struct protocol_stack_group *stack_group = get_protocol_stack_group();
- pthread_spin_init(&stack_group->wakeup_list_lock, PTHREAD_PROCESS_PRIVATE);
-
if (!use_ltran()) {
ret = sem_init(&stack_group->ethdev_init, 0, 0);
if (ret < 0) {
@@ -484,7 +437,6 @@ int32_t init_protocol_stack(void)
stack_group->stack_num = get_global_cfg_params()->num_cpu;
stack_group->wakeup_enable = (get_global_cfg_params()->num_wakeup > 0) ? true : false;
- stack_group->wakeup_list = NULL;
if (init_protocol_sem() != 0) {
return -1;
diff --git a/src/lstack/core/lstack_stack_stat.c b/src/lstack/core/lstack_stack_stat.c
index e8c5bc3..245bcd7 100644
--- a/src/lstack/core/lstack_stack_stat.c
+++ b/src/lstack/core/lstack_stack_stat.c
@@ -92,25 +92,21 @@ static void set_latency_start_flag(bool start)
}
}
-void register_wakeup(struct wakeup_poll *wakeup)
+void register_wakeup(struct protocol_stack *stack, struct wakeup_poll *wakeup)
{
- struct protocol_stack_group *stack_group = get_protocol_stack_group();
-
- pthread_spin_lock(&stack_group->wakeup_list_lock);
+ pthread_spin_lock(&stack->wakeup_list_lock);
- wakeup->next = stack_group->wakeup_list;
- stack_group->wakeup_list = wakeup;
+ wakeup->next = stack->wakeup_list;
+ stack->wakeup_list = wakeup;
- pthread_spin_unlock(&stack_group->wakeup_list_lock);
+ pthread_spin_unlock(&stack->wakeup_list_lock);
}
-void unregister_wakeup(struct wakeup_poll *wakeup)
+void unregister_wakeup(struct protocol_stack *stack, struct wakeup_poll *wakeup)
{
- struct protocol_stack_group *stack_group = get_protocol_stack_group();
+ pthread_spin_lock(&stack->wakeup_list_lock);
- pthread_spin_lock(&stack_group->wakeup_list_lock);
-
- struct wakeup_poll *node = stack_group->wakeup_list;
+ struct wakeup_poll *node = stack->wakeup_list;
struct wakeup_poll *pre = NULL;
while (node && node != wakeup) {
@@ -119,26 +115,24 @@ void unregister_wakeup(struct wakeup_poll *wakeup)
}
if (node == NULL) {
- pthread_spin_unlock(&stack_group->wakeup_list_lock);
+ pthread_spin_unlock(&stack->wakeup_list_lock);
return;
}
if (pre) {
pre->next = node->next;
} else {
- stack_group->wakeup_list = node->next;
+ stack->wakeup_list = node->next;
}
- pthread_spin_unlock(&stack_group->wakeup_list_lock);
+ pthread_spin_unlock(&stack->wakeup_list_lock);
}
static void get_wakeup_stat(struct protocol_stack *stack, struct gazelle_wakeup_stat *stat)
{
- struct protocol_stack_group *stack_group = get_protocol_stack_group();
-
- pthread_spin_lock(&stack_group->wakeup_list_lock);
+ pthread_spin_lock(&stack->wakeup_list_lock);
- struct wakeup_poll *node = stack_group->wakeup_list;
+ struct wakeup_poll *node = stack->wakeup_list;
while (node) {
if (node->bind_stack == stack) {
stat->app_events += node->stat.app_events;
@@ -151,7 +145,7 @@ static void get_wakeup_stat(struct protocol_stack *stack, struct gazelle_wakeup_
node = node->next;
}
- pthread_spin_unlock(&stack_group->wakeup_list_lock);
+ pthread_spin_unlock(&stack->wakeup_list_lock);
}
void lstack_get_low_power_info(struct gazelle_stat_low_power_info *low_power_info)
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index 36340ab..0a060b4 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -50,6 +50,8 @@ struct protocol_stack {
struct reg_ring_msg *reg_buf;
volatile bool low_power;
+ struct wakeup_poll *wakeup_list;
+ pthread_spinlock_t wakeup_list_lock;
lockless_queue rpc_queue __rte_cache_aligned;
char pad __rte_cache_aligned;
@@ -84,8 +86,6 @@ struct protocol_stack_group {
/* dfx stats */
bool latency_start;
uint64_t call_alloc_fail;
- pthread_spinlock_t wakeup_list_lock;
- struct wakeup_poll *wakeup_list __rte_cache_aligned;
};
long get_stack_tid(void);
diff --git a/src/lstack/include/lstack_stack_stat.h b/src/lstack/include/lstack_stack_stat.h
index aacade1..98ffe8f 100644
--- a/src/lstack/include/lstack_stack_stat.h
+++ b/src/lstack/include/lstack_stack_stat.h
@@ -17,6 +17,7 @@ struct gazelle_stack_latency;
struct pbuf;
struct gazelle_stat_low_power_info;
struct wakeup_poll;
+struct protocol_stack;
enum GAZELLE_LATENCY_TYPE;
enum GAZELLE_STAT_MODE;
@@ -26,7 +27,7 @@ void stack_stat_init(void);
int32_t handle_stack_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 register_wakeup(struct wakeup_poll *wakeup);
-void unregister_wakeup(struct wakeup_poll *wakeup);
+void register_wakeup(struct protocol_stack *stack, struct wakeup_poll *wakeup);
+void unregister_wakeup(struct protocol_stack *stack, struct wakeup_poll *wakeup);
#endif /* GAZELLE_STACK_STAT_H */
diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/posix/lstack_epoll.h
index a94b49f..5799028 100644
--- a/src/lstack/include/posix/lstack_epoll.h
+++ b/src/lstack/include/posix/lstack_epoll.h
@@ -17,6 +17,7 @@
#include <stdbool.h>
#include <semaphore.h>
#include <pthread.h>
+#include <sys/eventfd.h>
#include <lwip/list.h>
@@ -35,24 +36,24 @@ enum wakeup_type {
struct protocol_stack;
struct wakeup_poll {
/* stack thread read frequently */
- sem_t event_sem __rte_cache_aligned;
- enum wakeup_type type __rte_cache_aligned;
- volatile bool have_kernel_event __rte_cache_aligned;
- struct gazelle_wakeup_stat stat __rte_cache_aligned;
+ int32_t eventfd;
+ enum wakeup_type type;
+ bool have_event;
+ volatile bool in_wait __rte_cache_aligned;
char pad __rte_cache_aligned;
- bool init;
+ struct gazelle_wakeup_stat stat;
struct protocol_stack *bind_stack;
- int32_t epollfd; /* epoll kernel fd, ctl add into gazelle_kernel_event thread */
struct wakeup_poll *next;
/* poll */
struct pollfd *last_fds;
nfds_t last_nfds;
nfds_t last_max_nfds;
- struct epoll_event *events;
/* epoll */
+ int32_t epollfd; /* epoll kernel fd */
+ bool have_kernel_fd;
int32_t stack_fd_cnt[PROTOCOL_STACK_MAX];
struct protocol_stack *max_stack;
struct list_node event_list;
@@ -60,7 +61,9 @@ struct wakeup_poll {
};
struct netconn;
-void add_epoll_event(struct netconn *conn, uint32_t event);
+struct lwip_sock;
+void add_sock_event(struct lwip_sock *sock, uint32_t event);
+void wakeup_epoll(struct protocol_stack *stack, struct wakeup_poll *wakeup);
int32_t lstack_epoll_create(int32_t size);
int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event *event);
int32_t lstack_epoll_wait(int32_t epfd, struct epoll_event *events, int32_t maxevents, int32_t timeout);
--
2.23.0

Some files were not shown because too many files have changed in this diff Show More