!5 [sync] PR-4: 修复一些测试问题
From: @openeuler-sync-bot Reviewed-by: @wu-changsheng Signed-off-by: @wu-changsheng
This commit is contained in:
commit
cc1b12d95f
27
0003-execute-gazelle_init_sock-before-read-event.patch
Normal file
27
0003-execute-gazelle_init_sock-before-read-event.patch
Normal file
@ -0,0 +1,27 @@
|
||||
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
|
||||
|
||||
193
0004-recvmsg-sendmsg-should-use-recvmsg_from_stack-sendms.patch
Normal file
193
0004-recvmsg-sendmsg-should-use-recvmsg_from_stack-sendms.patch
Normal file
@ -0,0 +1,193 @@
|
||||
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
|
||||
|
||||
31
0005-fix-LD_PRELOAD.patch
Normal file
31
0005-fix-LD_PRELOAD.patch
Normal file
@ -0,0 +1,31 @@
|
||||
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
|
||||
|
||||
65
0006-reduce-replenish-send_idle_ring-rpc-call.patch
Normal file
65
0006-reduce-replenish-send_idle_ring-rpc-call.patch
Normal file
@ -0,0 +1,65 @@
|
||||
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
|
||||
|
||||
@ -0,0 +1,50 @@
|
||||
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
|
||||
|
||||
56
0008-fix-gazellectl-l-option-error.patch
Normal file
56
0008-fix-gazellectl-l-option-error.patch
Normal file
@ -0,0 +1,56 @@
|
||||
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
|
||||
|
||||
24
0009-bind-cpu-fail-just-walrm.patch
Normal file
24
0009-bind-cpu-fail-just-walrm.patch
Normal file
@ -0,0 +1,24 @@
|
||||
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
|
||||
|
||||
38
0010-mfix-close-not-release-sock.patch
Normal file
38
0010-mfix-close-not-release-sock.patch
Normal file
@ -0,0 +1,38 @@
|
||||
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
|
||||
|
||||
66
0011-fix-evetns-err.patch
Normal file
66
0011-fix-evetns-err.patch
Normal file
@ -0,0 +1,66 @@
|
||||
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
|
||||
|
||||
56
0012-fix-dfx-info-show.patch
Normal file
56
0012-fix-dfx-info-show.patch
Normal file
@ -0,0 +1,56 @@
|
||||
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
|
||||
|
||||
49
0013-balance-acept.patch
Normal file
49
0013-balance-acept.patch
Normal file
@ -0,0 +1,49 @@
|
||||
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
|
||||
|
||||
248
0014-fix-miss-evetn.patch
Normal file
248
0014-fix-miss-evetn.patch
Normal file
@ -0,0 +1,248 @@
|
||||
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
|
||||
|
||||
204
0015-fix-too-much-evetns.patch
Normal file
204
0015-fix-too-much-evetns.patch
Normal file
@ -0,0 +1,204 @@
|
||||
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
|
||||
|
||||
24
0016-fix-dead-loop.patch
Normal file
24
0016-fix-dead-loop.patch
Normal file
@ -0,0 +1,24 @@
|
||||
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
|
||||
|
||||
110
0017-remove-unuse-event.patch
Normal file
110
0017-remove-unuse-event.patch
Normal file
@ -0,0 +1,110 @@
|
||||
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
|
||||
|
||||
45
0018-fix-gazellectl-show.patch
Normal file
45
0018-fix-gazellectl-show.patch
Normal file
@ -0,0 +1,45 @@
|
||||
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
|
||||
|
||||
423
0019-fix-repeate-msg.patch
Normal file
423
0019-fix-repeate-msg.patch
Normal file
@ -0,0 +1,423 @@
|
||||
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
|
||||
|
||||
103
0020-fix-wakeup-typos.patch
Normal file
103
0020-fix-wakeup-typos.patch
Normal file
@ -0,0 +1,103 @@
|
||||
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
|
||||
|
||||
50
0021-fix-pasre-numacpulist.patch
Normal file
50
0021-fix-pasre-numacpulist.patch
Normal file
@ -0,0 +1,50 @@
|
||||
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
|
||||
|
||||
267
0022-fix-get-data-error.patch
Normal file
267
0022-fix-get-data-error.patch
Normal file
@ -0,0 +1,267 @@
|
||||
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
|
||||
|
||||
197
0023-delete-numa-bind-param.patch
Normal file
197
0023-delete-numa-bind-param.patch
Normal file
@ -0,0 +1,197 @@
|
||||
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
|
||||
|
||||
806
0024-refactor-event.patch
Normal file
806
0024-refactor-event.patch
Normal file
@ -0,0 +1,806 @@
|
||||
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
|
||||
|
||||
420
0025-fix-event-miss.patch
Normal file
420
0025-fix-event-miss.patch
Normal file
@ -0,0 +1,420 @@
|
||||
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
|
||||
|
||||
45
0026-get-fin-notice-app.patch
Normal file
45
0026-get-fin-notice-app.patch
Normal file
@ -0,0 +1,45 @@
|
||||
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
|
||||
|
||||
832
0027-fix-parse-config.patch
Normal file
832
0027-fix-parse-config.patch
Normal file
@ -0,0 +1,832 @@
|
||||
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
|
||||
|
||||
60
0028-fix-lstack-show-latency.patch
Normal file
60
0028-fix-lstack-show-latency.patch
Normal file
@ -0,0 +1,60 @@
|
||||
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
|
||||
|
||||
217
0029-fix-code-check.patch
Normal file
217
0029-fix-code-check.patch
Normal file
@ -0,0 +1,217 @@
|
||||
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
|
||||
|
||||
120
0030-fix-accept-init-sock-faile.patch
Normal file
120
0030-fix-accept-init-sock-faile.patch
Normal file
@ -0,0 +1,120 @@
|
||||
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
|
||||
|
||||
153
0031-fix-reuse-ip-listen-event-don-t-notice.patch
Normal file
153
0031-fix-reuse-ip-listen-event-don-t-notice.patch
Normal file
@ -0,0 +1,153 @@
|
||||
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
|
||||
|
||||
24
0032-modify-readme-to-add-constraint.patch
Normal file
24
0032-modify-readme-to-add-constraint.patch
Normal file
@ -0,0 +1,24 @@
|
||||
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
|
||||
|
||||
75
0033-fix-accept-check-remain-conn.patch
Normal file
75
0033-fix-accept-check-remain-conn.patch
Normal file
@ -0,0 +1,75 @@
|
||||
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
|
||||
|
||||
59
0034-fix-wakeup-list-dead-loop.patch
Normal file
59
0034-fix-wakeup-list-dead-loop.patch
Normal file
@ -0,0 +1,59 @@
|
||||
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
|
||||
|
||||
@ -252,6 +252,7 @@ Usage: gazellectl [-h | help]
|
||||
- 虚拟机网卡不支持多队列。
|
||||
- 不使用ltran模式,kni网口只支持本地通讯使用,且需要启动前配置NetworkManager不管理kni网卡
|
||||
- 虚拟kni网口的ip及mac地址,需要与lstack配置文件保持一致
|
||||
- gazelle运行过程中,不允许删除运行文件,如果删除,需要重启gazelle
|
||||
|
||||
## Security risk note
|
||||
gazelle有如下安全风险,用户需要评估使用场景风险
|
||||
|
||||
37
gazelle.spec
37
gazelle.spec
@ -2,7 +2,7 @@
|
||||
|
||||
Name: gazelle
|
||||
Version: 1.0.1
|
||||
Release: 2
|
||||
Release: 3
|
||||
Summary: gazelle is a high performance user-mode stack
|
||||
License: Mulan PSL v2
|
||||
URL: https://gitee.com/openeuler/gazelle
|
||||
@ -17,6 +17,38 @@ Requires: numactl libpcap libconfig libboundscheck
|
||||
|
||||
Patch9001: 0001-fix-compile-error-unuse-result.patch
|
||||
Patch9002: 0002-reduce-copy-in-send.patch
|
||||
Patch9003: 0003-execute-gazelle_init_sock-before-read-event.patch
|
||||
Patch9004: 0004-recvmsg-sendmsg-should-use-recvmsg_from_stack-sendms.patch
|
||||
Patch9005: 0005-fix-LD_PRELOAD.patch
|
||||
Patch9006: 0006-reduce-replenish-send_idle_ring-rpc-call.patch
|
||||
Patch9007: 0007-parse_host_addr-should-be-executed-before-parse_dpdk.patch
|
||||
Patch9008: 0008-fix-gazellectl-l-option-error.patch
|
||||
Patch9009: 0009-bind-cpu-fail-just-walrm.patch
|
||||
Patch9010: 0010-mfix-close-not-release-sock.patch
|
||||
Patch9011: 0011-fix-evetns-err.patch
|
||||
Patch9012: 0012-fix-dfx-info-show.patch
|
||||
Patch9013: 0013-balance-acept.patch
|
||||
Patch9014: 0014-fix-miss-evetn.patch
|
||||
Patch9015: 0015-fix-too-much-evetns.patch
|
||||
Patch9016: 0016-fix-dead-loop.patch
|
||||
Patch9017: 0017-remove-unuse-event.patch
|
||||
Patch9018: 0018-fix-gazellectl-show.patch
|
||||
Patch9019: 0019-fix-repeate-msg.patch
|
||||
Patch9020: 0020-fix-wakeup-typos.patch
|
||||
Patch9021: 0021-fix-pasre-numacpulist.patch
|
||||
Patch9022: 0022-fix-get-data-error.patch
|
||||
Patch9023: 0023-delete-numa-bind-param.patch
|
||||
Patch9024: 0024-refactor-event.patch
|
||||
Patch9025: 0025-fix-event-miss.patch
|
||||
Patch9026: 0026-get-fin-notice-app.patch
|
||||
Patch9027: 0027-fix-parse-config.patch
|
||||
Patch9028: 0028-fix-lstack-show-latency.patch
|
||||
Patch9029: 0029-fix-code-check.patch
|
||||
Patch9030: 0030-fix-accept-init-sock-faile.patch
|
||||
Patch9031: 0031-fix-reuse-ip-listen-event-don-t-notice.patch
|
||||
Patch9032: 0032-modify-readme-to-add-constraint.patch
|
||||
Patch9033: 0033-fix-accept-check-remain-conn.patch
|
||||
Patch9034: 0034-fix-wakeup-list-dead-loop.patch
|
||||
|
||||
%description
|
||||
%{name} is a high performance user-mode stack.
|
||||
@ -57,6 +89,9 @@ install -Dpm 0640 %{_builddir}/%{name}-%{version}/src/ltran/ltran.conf %{b
|
||||
%config(noreplace) %{conf_path}/ltran.conf
|
||||
|
||||
%changelog
|
||||
* Wed Mar 16 2022 jiangheng <jiangheng12@huawei.com> - 1.0.1-3
|
||||
- fix gazelle test issue
|
||||
|
||||
* Mon Mar 7 2022 wu-changsheng <wuchangsheng2@huawei.com> - 1.0.1-2
|
||||
- reduce copy in send
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user