1 Star 0 Fork 32

zhangju1/gazelle

forked from src-openEuler/gazelle 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0012-kernelevent-kernel-event-thread-report-kernel-events.patch 3.29 KB
一键复制 编辑 原始数据 按行查看 历史
From 4267e381b25e42f19b2dd160fbf08efb5d8bd0fb Mon Sep 17 00:00:00 2001
From: jiangheng <jiangheng14@huawei.com>
Date: Mon, 4 Sep 2023 11:16:12 +0800
Subject: [PATCH] kernelevent: kernel event thread report kernel events to app
thread directly without passing through lstack thread
---
src/lstack/core/lstack_protocol_stack.c | 53 +++++++++++++------------
1 file changed, 27 insertions(+), 26 deletions(-)
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
index 3a6e792..ca0b046 100644
--- a/src/lstack/core/lstack_protocol_stack.c
+++ b/src/lstack/core/lstack_protocol_stack.c
@@ -38,7 +38,7 @@
#include "lstack_stack_stat.h"
#include "lstack_protocol_stack.h"
-#define KERNEL_EVENT_100us 100
+#define KERNEL_EVENT_10us 10
static PER_THREAD struct protocol_stack *g_stack_p = NULL;
static struct protocol_stack_group g_stack_group = {0};
@@ -258,6 +258,29 @@ static int32_t create_thread(void *arg, char *thread_name, stack_thread_func fun
return 0;
}
+static void wakeup_kernel_event(struct protocol_stack *stack)
+{
+ if (stack->kernel_event_num <= 0) {
+ return;
+ }
+
+ for (int32_t i = 0; i < stack->kernel_event_num; i++) {
+ struct wakeup_poll *wakeup = stack->kernel_events[i].data.ptr;
+ if (wakeup->type == WAKEUP_CLOSE) {
+ continue;
+ }
+
+ __atomic_store_n(&wakeup->have_kernel_event, true, __ATOMIC_RELEASE);
+ if (__atomic_load_n(&wakeup->in_wait, __ATOMIC_ACQUIRE)) {
+ __atomic_store_n(&wakeup->in_wait, false, __ATOMIC_RELEASE);
+ rte_mb();
+ pthread_mutex_unlock(&wakeup->wait);
+ }
+ }
+
+ return;
+}
+
static void* gazelle_kernelevent_thread(void *arg)
{
struct thread_params *t_params = (struct thread_params*) arg;
@@ -272,8 +295,9 @@ static void* gazelle_kernelevent_thread(void *arg)
for (;;) {
stack->kernel_event_num = posix_api->epoll_wait_fn(stack->epollfd, stack->kernel_events, KERNEL_EPOLL_MAX, -1);
- while (stack->kernel_event_num > 0) {
- usleep(KERNEL_EVENT_100us);
+ if (stack->kernel_event_num > 0) {
+ wakeup_kernel_event(stack);
+ usleep(KERNEL_EVENT_10us);
}
}
@@ -416,28 +440,6 @@ END1:
return NULL;
}
-static void wakeup_kernel_event(struct protocol_stack *stack)
-{
- if (stack->kernel_event_num == 0) {
- return;
- }
-
- for (int32_t i = 0; i < stack->kernel_event_num; i++) {
- struct wakeup_poll *wakeup = stack->kernel_events[i].data.ptr;
- if (wakeup->type == WAKEUP_CLOSE) {
- continue;
- }
-
- __atomic_store_n(&wakeup->have_kernel_event, true, __ATOMIC_RELEASE);
- if (list_is_null(&wakeup->wakeup_list[stack->stack_idx])) {
- list_add_node(&stack->wakeup_list, &wakeup->wakeup_list[stack->stack_idx]);
- }
- }
-
- stack->kernel_event_num = 0;
-}
-
-
static void* gazelle_stack_thread(void *arg)
{
struct thread_params *t_params = (struct thread_params*) arg;
@@ -485,7 +487,6 @@ static void* gazelle_stack_thread(void *arg)
read_recv_list(stack, read_connect_number);
if ((wakeup_tick & 0xf) == 0) {
- wakeup_kernel_event(stack);
wakeup_stack_epoll(stack);
}
--
2.27.0
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/zhangju1/gazelle.git
git@gitee.com:zhangju1/gazelle.git
zhangju1
gazelle
gazelle
master

搜索帮助