106 lines
3.3 KiB
Diff
106 lines
3.3 KiB
Diff
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
|
|
|