Skip to content

Commit 3f0742a

Browse files
author
Liran Oz
committed
issue: 1050049 Move poll_os logic to the internal thread
Fix Alex's comments Signed-off-by: Liran Oz <lirano@mellanox.com>
1 parent 562e085 commit 3f0742a

File tree

8 files changed

+67
-180
lines changed

8 files changed

+67
-180
lines changed

src/vma/Makefile.am

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,6 @@ libvma_la_SOURCES := \
199199
event/event_handler_ibverbs.h \
200200
event/event_handler_manager.h \
201201
event/event_handler_rdma_cm.h \
202-
event/event_handler_poll_os.h \
203202
event/netlink_event.h \
204203
event/route_net_dev_event.h \
205204
event/timer_handler.h \

src/vma/event/event_handler_manager.cpp

Lines changed: 5 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@
3737
#include <rdma/rdma_cma.h>
3838
#include <vma/dev/net_device_table_mgr.h>
3939
#include "vma/dev/ring_allocation_logic.h"
40+
#include "vma/sock/fd_collection.h"
4041
#include "vma/sock/sock-redirect.h" // calling orig_os_api.epoll()
4142
#include "vma/util/verbs_extra.h"
4243

4344
#include "timer_handler.h"
4445
#include "event_handler_ibverbs.h"
4546
#include "event_handler_rdma_cm.h"
46-
#include "event_handler_poll_os.h"
4747

4848
#include "vma/util/instrumentation.h"
4949

@@ -178,28 +178,6 @@ void event_handler_manager::unregister_ibverbs_event(int fd, event_handler_ibver
178178
post_new_reg_action(reg_action);
179179
}
180180

181-
void event_handler_manager::register_poll_os_event(int fd, event_handler_poll_os* poll_os_fd)
182-
{
183-
reg_action_t reg_action;
184-
memset(&reg_action, 0, sizeof(reg_action));
185-
reg_action.type = REGISTER_POLL_OS;
186-
reg_action.info.poll_os.fd = fd;
187-
reg_action.info.poll_os.poll_os_fd = poll_os_fd;
188-
update_epfd(fd, EPOLL_CTL_ADD, EPOLLIN | EPOLLPRI | EPOLLONESHOT);
189-
post_new_reg_action(reg_action);
190-
}
191-
192-
void event_handler_manager::unregister_poll_os_event(int fd, event_handler_poll_os* poll_os_fd)
193-
{
194-
reg_action_t reg_action;
195-
memset(&reg_action, 0, sizeof(reg_action));
196-
reg_action.type = UNREGISTER_POLL_OS;
197-
reg_action.info.poll_os.fd = fd;
198-
reg_action.info.poll_os.poll_os_fd = poll_os_fd;
199-
update_epfd(fd, EPOLL_CTL_DEL, EPOLLIN | EPOLLPRI | EPOLLONESHOT);
200-
post_new_reg_action(reg_action);
201-
}
202-
203181
void event_handler_manager::register_rdma_cm_event(int fd, void* id, void* cma_channel, event_handler_rdma_cm* handler)
204182
{
205183
reg_action_t reg_action;
@@ -445,8 +423,6 @@ const char* event_handler_manager::reg_action_str(event_action_type_e reg_action
445423
case UNREGISTER_RDMA_CM: return "UNREGISTER_RDMA_CM";
446424
case REGISTER_COMMAND: return "REGISTER_COMMAND";
447425
case UNREGISTER_COMMAND: return "UNREGISTER_COMMAND";
448-
case REGISTER_POLL_OS: return "REGISTER_POLL_OS";
449-
case UNREGISTER_POLL_OS: return "UNREGISTER_POLL_OS";
450426
BULLSEYE_EXCLUDE_BLOCK_START
451427
default: return "UNKNOWN";
452428
BULLSEYE_EXCLUDE_BLOCK_END
@@ -656,42 +632,6 @@ void event_handler_manager::priv_register_rdma_cm_events(rdma_cm_reg_info_t& inf
656632
}
657633
}
658634

659-
void event_handler_manager::priv_register_poll_os(command_poll_os_info_t& info)
660-
{
661-
evh_logfunc_entry("fd=%d", info.fd);
662-
663-
event_handler_map_t::iterator iter_fd = m_event_handler_map.find(info.fd);
664-
if (iter_fd == m_event_handler_map.end()) {
665-
evh_logdbg("Adding poll_os fd event (fd %d)", info.fd);
666-
event_data_t map_value;
667-
668-
map_value.type = EV_POLL_FD;
669-
map_value.poll_os_cmd.fd = info.fd;
670-
map_value.poll_os_cmd.poll_os_fd = info.poll_os_fd;
671-
672-
/* coverity[uninit_use_in_call] */
673-
/* cppcheck-suppress uninitStructMember */
674-
m_event_handler_map[info.fd] = map_value;
675-
}
676-
}
677-
678-
void event_handler_manager::priv_unregister_poll_os(command_poll_os_info_t& info)
679-
{
680-
evh_logfunc_entry("fd=%d", info.fd);
681-
682-
event_handler_map_t::iterator iter_fd = m_event_handler_map.find(info.fd);
683-
if (iter_fd != m_event_handler_map.end()) {
684-
if (iter_fd->second.type != EV_POLL_FD){
685-
evh_logerr("fd=%d: is already handling events of different type", info.fd);
686-
return;
687-
}
688-
iter_fd->second.poll_os_cmd.poll_os_fd->event_handler_poll_os_unregister_cb();
689-
m_event_handler_map.erase(iter_fd);
690-
} else {
691-
evh_logdbg("POLL_OS event wasn't found (fd %d)", info.fd);
692-
}
693-
}
694-
695635
void event_handler_manager::priv_unregister_rdma_cm_events(rdma_cm_reg_info_t& info)
696636
{
697637
evh_logfunc_entry("fd=%d, id=%p", info.fd, info.id);
@@ -795,12 +735,6 @@ void event_handler_manager::handle_registration_action(reg_action_t& reg_action)
795735
case UNREGISTER_COMMAND:
796736
priv_unregister_command_events(reg_action.info.cmd);
797737
break;
798-
case REGISTER_POLL_OS:
799-
priv_register_poll_os(reg_action.info.poll_os);
800-
break;
801-
case UNREGISTER_POLL_OS:
802-
priv_unregister_poll_os(reg_action.info.poll_os);
803-
break;
804738
case UNREGISTER_TIMERS_AND_DELETE:
805739
priv_unregister_all_handler_timers(reg_action.info.timer);
806740
delete reg_action.info.timer.handler;
@@ -1021,7 +955,10 @@ void* event_handler_manager::thread_loop()
1021955

1022956
event_handler_map_t::iterator i = m_event_handler_map.find(fd);
1023957
if (i == m_event_handler_map.end()) {
1024-
evh_logdbg("No event handler (fd=%d)", fd);
958+
// No event handler - this is probably a poll_os event!
959+
if (!g_p_fd_collection->set_immediate_os_sample(fd)) {
960+
evh_logdbg("No event handler (fd=%d)", fd);
961+
}
1025962
continue;
1026963
}
1027964

@@ -1042,9 +979,6 @@ void* event_handler_manager::thread_loop()
1042979
case EV_COMMAND:
1043980
i->second.command_ev.cmd->execute();
1044981
break;
1045-
case EV_POLL_FD:
1046-
i->second.poll_os_cmd.poll_os_fd->event_handler_poll_os_ready_cb();
1047-
break;
1048982
BULLSEYE_EXCLUDE_BLOCK_START
1049983
default:
1050984
evh_logerr("Unknow event on fd=%d", fd);

src/vma/event/event_handler_manager.h

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
class timer_handler;
4848
class event_handler_ibverbs;
4949
class event_handler_rdma_cm;
50-
class event_handler_poll_os;
5150

5251
typedef std::map<void* /*event_handler_id*/, event_handler_rdma_cm* /*p_event_handler*/> event_handler_rdma_cm_map_t;
5352

@@ -61,9 +60,7 @@ typedef enum {
6160
REGISTER_RDMA_CM,
6261
UNREGISTER_RDMA_CM,
6362
REGISTER_COMMAND,
64-
UNREGISTER_COMMAND,
65-
REGISTER_POLL_OS,
66-
UNREGISTER_POLL_OS
63+
UNREGISTER_COMMAND
6764
} event_action_type_e;
6865

6966

@@ -118,20 +115,13 @@ struct command_reg_info_t {
118115
command* cmd;
119116
};
120117

121-
struct command_poll_os_info_t {
122-
int fd;
123-
event_handler_poll_os* poll_os_fd;
124-
};
125-
typedef command_poll_os_info_t poll_os_ev_t;
126-
127118
struct reg_action_t {
128119
event_action_type_e type;
129120
union {
130121
timer_reg_info_t timer;
131122
ibverbs_reg_info_t ibverbs;
132123
rdma_cm_reg_info_t rdma_cm;
133124
command_reg_info_t cmd;
134-
command_poll_os_info_t poll_os;
135125
} info;
136126
};
137127

@@ -141,7 +131,6 @@ enum ev_type {
141131
EV_IBVERBS,
142132
EV_RDMA_CM,
143133
EV_COMMAND,
144-
EV_POLL_FD,
145134
};
146135

147136

@@ -150,7 +139,6 @@ struct event_data_t {
150139
ibverbs_ev_t ibverbs_ev;
151140
rdma_cm_ev_t rdma_cm_ev;
152141
command_ev_t command_ev;
153-
poll_os_ev_t poll_os_cmd;
154142
};
155143

156144
typedef std::map<int /*fd*/, event_data_t> event_handler_map_t;
@@ -180,9 +168,6 @@ class event_handler_manager : public wakeup_pipe
180168
void register_rdma_cm_event(int fd, void* id, void* cma_channel, event_handler_rdma_cm* handler);
181169
void unregister_rdma_cm_event(int fd, void* id);
182170

183-
void register_poll_os_event(int fd, event_handler_poll_os* poll_os_fd);
184-
void unregister_poll_os_event(int fd, event_handler_poll_os* poll_os_fd);
185-
186171
void register_command_event(int fd, command* cmd);
187172
void unregister_command_event(int fd);
188173

@@ -195,7 +180,7 @@ class event_handler_manager : public wakeup_pipe
195180
pthread_t m_event_handler_tid;
196181
bool m_b_continue_running;
197182
int m_cq_epfd;
198-
int m_epfd;
183+
int m_epfd;
199184

200185
// pipe for the event registration handling
201186
reg_action_q_t m_reg_action_q;
@@ -217,8 +202,6 @@ class event_handler_manager : public wakeup_pipe
217202
void priv_register_rdma_cm_events(rdma_cm_reg_info_t& info);
218203
void priv_unregister_rdma_cm_events(rdma_cm_reg_info_t& info);
219204
void priv_register_command_events(command_reg_info_t& info);
220-
void priv_register_poll_os(command_poll_os_info_t& info);
221-
void priv_unregister_poll_os(command_poll_os_info_t& info);
222205
void priv_unregister_command_events(command_reg_info_t& info);
223206
void priv_prepare_ibverbs_async_event_queue(event_handler_map_t::iterator& i);
224207

src/vma/event/event_handler_poll_os.h

Lines changed: 0 additions & 44 deletions
This file was deleted.

src/vma/sock/fd_collection.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,9 @@ void fd_collection::clear()
144144
}
145145

146146
//internal thread should be already dead and these sockets should have been deleted through the internal thread.
147-
while (!m_pendig_to_remove_lst.empty()) {
148-
m_pendig_to_remove_lst.get_and_pop_front()->force_close();
147+
list_iterator_t<socket_fd_api, socket_fd_api::pendig_to_remove_node_offset> itr;
148+
for (itr = m_pendig_to_remove_lst.begin(); itr != m_pendig_to_remove_lst.end(); itr++) {
149+
(*itr)->force_close();
149150
}
150151

151152
// Clean up all left overs sockinfo

src/vma/sock/fd_collection.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,11 @@ class fd_collection : private lock_mutex_recursive, public timer_handler
122122
*/
123123
int del_cq_channel_fd(int fd, bool b_cleanup = false);
124124

125+
/**
126+
* Call set_immediate_os_sample of the input fd.
127+
*/
128+
inline bool set_immediate_os_sample(int fd);
129+
125130
/**
126131
* Get sock_fd_api (sockinfo or pipeinfo) by fd.
127132
*/
@@ -214,6 +219,20 @@ inline cls* fd_collection::get(int fd, cls **map_type)
214219
return obj;
215220
}
216221

222+
inline bool fd_collection::set_immediate_os_sample(int fd)
223+
{
224+
bool ret = false;
225+
socket_fd_api* sock;
226+
227+
lock();
228+
if ((sock = get_sockfd(fd))){
229+
sock->set_immediate_os_sample();
230+
ret = true;
231+
}
232+
unlock();
233+
return ret;
234+
}
235+
217236
inline socket_fd_api* fd_collection::get_sockfd(int fd)
218237
{
219238
return get(fd, m_p_sockfd_map);

0 commit comments

Comments
 (0)