Projects
openEuler:C
gazelle
_service:tar_scm:0017-epoll-distinguish-add-del...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:0017-epoll-distinguish-add-del_sock_event-and-add-del_soc.patch of Package gazelle
From 506a252ff94be857ab89b1c1d4aea0ef66ed9582 Mon Sep 17 00:00:00 2001 From: jiangheng <jiangheng14@huawei.com> Date: Mon, 9 Oct 2023 10:36:50 +0800 Subject: [PATCH] epoll: distinguish add/del_sock_event and add/del_sock_event_nolock --- src/lstack/api/lstack_epoll.c | 59 +++++++++++++++++-------- src/lstack/core/lstack_lwip.c | 47 ++++---------------- src/lstack/include/posix/lstack_epoll.h | 6 +++ 3 files changed, 56 insertions(+), 56 deletions(-) diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c index 55ca4fe..7c40792 100644 --- a/src/lstack/api/lstack_epoll.c +++ b/src/lstack/api/lstack_epoll.c @@ -46,37 +46,60 @@ static void update_epoll_max_stack(struct wakeup_poll *wakeup); static void change_epollfd_kernel_thread(struct wakeup_poll *wakeup, struct protocol_stack *old_stack, struct protocol_stack *new_stack); +static inline void add_wakeup_to_stack_wakeuplist(struct wakeup_poll *wakeup, struct protocol_stack *stack) +{ + if (list_is_null(&wakeup->wakeup_list[stack->stack_idx])) { + list_add_node(&stack->wakeup_list, &wakeup->wakeup_list[stack->stack_idx]); + } +} + +void add_sock_event_nolock(struct lwip_sock *sock, uint32_t event) +{ + struct wakeup_poll *wakeup = sock->wakeup; + + if (wakeup == NULL || wakeup->type == WAKEUP_CLOSE || (event & sock->epoll_events) == 0) { + return; + } + sock->events |= (event == EPOLLERR) ? (EPOLLIN | EPOLLERR) : (event & sock->epoll_events); + if (list_is_null(&sock->event_list)) { + list_add_node(&wakeup->event_list, &sock->event_list); + } + return; +} + void add_sock_event(struct lwip_sock *sock, uint32_t event) { struct wakeup_poll *wakeup = sock->wakeup; + struct protocol_stack *stack = sock->stack; if (wakeup == NULL || wakeup->type == WAKEUP_CLOSE || (event & sock->epoll_events) == 0) { return; } if (wakeup->type == WAKEUP_EPOLL) { pthread_spin_lock(&wakeup->event_list_lock); - - /* app thread have read/write, event is outdated */ - if (event == EPOLLIN && sock->conn->state != NETCONN_LISTEN && !NETCONN_IS_DATAIN(sock)) { - pthread_spin_unlock(&wakeup->event_list_lock); - return; - } - if (event == EPOLLOUT && !NETCONN_IS_OUTIDLE(sock)) { - pthread_spin_unlock(&wakeup->event_list_lock); - return; - } - - sock->events |= (event == EPOLLERR) ? (EPOLLIN | EPOLLERR) : (event & sock->epoll_events); - if (list_is_null(&sock->event_list)) { - list_add_node(&wakeup->event_list, &sock->event_list); - } + add_sock_event_nolock(sock, event); pthread_spin_unlock(&wakeup->event_list_lock); } - struct protocol_stack *stack = sock->stack; - if (list_is_null(&wakeup->wakeup_list[stack->stack_idx])) { - list_add_node(&stack->wakeup_list, &wakeup->wakeup_list[stack->stack_idx]); + add_wakeup_to_stack_wakeuplist(wakeup, stack); + return; +} + +void del_sock_event_nolock(struct lwip_sock *sock, uint32_t event) +{ + sock->events &= ~event; + + if (sock->events == 0) { + list_del_node_null(&sock->event_list); } + return; +} + +void del_sock_event(struct lwip_sock *sock, uint32_t event) +{ + pthread_spin_lock(&sock->wakeup->event_list_lock); + del_sock_event_nolock(sock, event); + pthread_spin_unlock(&sock->wakeup->event_list_lock); } void wakeup_stack_epoll(struct protocol_stack *stack) diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c index 9ab8446..a98b1b8 100644 --- a/src/lstack/core/lstack_lwip.c +++ b/src/lstack/core/lstack_lwip.c @@ -317,22 +317,6 @@ void do_lwip_get_from_sendring_over(struct lwip_sock *sock) sock->stack->stats.write_lwip_cnt++; } -static inline void del_data_out_event(struct lwip_sock *sock) -{ - pthread_spin_lock(&sock->wakeup->event_list_lock); - - /* check again avoid cover event add in stack thread */ - if (!NETCONN_IS_OUTIDLE(sock)) { - sock->events &= ~EPOLLOUT; - - if (sock->events == 0) { - list_del_node_null(&sock->event_list); - } - } - - pthread_spin_unlock(&sock->wakeup->event_list_lock); -} - static ssize_t do_app_write(struct pbuf *pbufs[], void *buf, size_t len, uint32_t write_num) { ssize_t send_len = 0; @@ -617,8 +601,9 @@ static ssize_t do_lwip_fill_sendring(struct lwip_sock *sock, const void *buf, si wakeup->stat.app_write_cnt += write_num; } - if (wakeup && wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLOUT)) { - del_data_out_event(sock); + if (wakeup && wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLOUT) + && !NETCONN_IS_OUTIDLE(sock)) { + del_sock_event(sock, EPOLLOUT); } END: @@ -801,22 +786,6 @@ static inline void notice_stack_send(struct lwip_sock *sock, int32_t fd, int32_t } } -static inline void del_data_in_event(struct lwip_sock *sock) -{ - pthread_spin_lock(&sock->wakeup->event_list_lock); - - /* check again avoid cover event add in stack thread */ - if (!NETCONN_IS_DATAIN(sock)) { - sock->events &= ~EPOLLIN; - - if (sock->events == 0) { - list_del_node_null(&sock->event_list); - } - } - - pthread_spin_unlock(&sock->wakeup->event_list_lock); -} - /* process on same node use ring to recv data */ ssize_t gazelle_same_node_ring_recv(struct lwip_sock *sock, const void *buf, size_t len, int32_t flags) { @@ -847,8 +816,9 @@ ssize_t gazelle_same_node_ring_recv(struct lwip_sock *sock, const void *buf, siz END: /* rte_ring_count reduce lock */ - if (sock->wakeup && sock->wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLIN)) { - del_data_in_event(sock); + if (sock->wakeup && sock->wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLIN) + && (!NETCONN_IS_DATAIN(sock))) { + del_sock_event(sock, EPOLLIN); } return act_len; } @@ -1042,8 +1012,9 @@ ssize_t do_lwip_read_from_stack(int32_t fd, void *buf, size_t len, int32_t flags } /* rte_ring_count reduce lock */ - if (sock->wakeup && sock->wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLIN)) { - del_data_in_event(sock); + if (sock->wakeup && sock->wakeup->type == WAKEUP_EPOLL && (sock->events & EPOLLIN) + && (!NETCONN_IS_DATAIN(sock))) { + del_sock_event(sock, EPOLLIN); } if (pbuf && addr && addrlen) { diff --git a/src/lstack/include/posix/lstack_epoll.h b/src/lstack/include/posix/lstack_epoll.h index d6c81a7..699a951 100644 --- a/src/lstack/include/posix/lstack_epoll.h +++ b/src/lstack/include/posix/lstack_epoll.h @@ -63,8 +63,14 @@ struct wakeup_poll { struct netconn; struct lwip_sock; + void add_sock_event(struct lwip_sock *sock, uint32_t event); +void add_sock_event_nolock(struct lwip_sock *sock, uint32_t event); +void del_sock_event(struct lwip_sock *sock, uint32_t event); +void del_sock_event_nolock(struct lwip_sock *sock, uint32_t event); + void wakeup_stack_epoll(struct protocol_stack *stack); + int32_t lstack_epoll_create(int32_t size); int32_t lstack_epoll_create1(int32_t flags); int32_t lstack_epoll_ctl(int32_t epfd, int32_t op, int32_t fd, struct epoll_event *event); -- 2.27.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.