[Openvpn-devel,v1] mtcp: make set_global_rw_flags TCP only again
Commit Message
From: Gianmarco De Gregori <gianmarco@mandelbit.com>
UDP sockets are shared among instances and are already set in
multi_io_wait(), so calling socket_set() on them per instance is
redundant.
On a server with two UDP and one TCP listener this saves about one
epoll_ctl() per received packet (syscalls per received packet
5.75 -> 4.61, UDP only 6.82 -> 5.28) and, at saturation, delivers
about 10% more traffic with UDP only.
Move the function back to mtcp.c as multi_tcp_set_global_rw_flags()
and skip datagram instances.
Change-Id: I603585c6bb4e407d0df62f4233ff2c135aa00db0
Signed-off-by: Gianmarco De Gregori <gianmarco@mandelbit.com>
Acked-by: Razvan Cojocaru <razvanc@mailbox.org>
Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/2041
---
This change was reviewed on Gerrit and approved by at least one
developer. I request to merge it to master.
Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/2041
This mail reflects revision 1 of this Change.
Acked-by according to Gerrit (reflected above):
Razvan Cojocaru <razvanc@mailbox.org>
@@ -115,6 +115,18 @@
multi_io->n_esr = 0;
}
+void
+multi_tcp_set_global_rw_flags(struct multi_context *m, struct multi_instance *mi)
+{
+ if (mi && !proto_is_dgram(mi->context.c2.link_sockets[0]->info.proto))
+ {
+ mi->socket_set_called = true;
+ socket_set(mi->context.c2.link_sockets[0], m->multi_io->es,
+ mbuf_defined(mi->tcp_link_out_deferred) ? EVENT_WRITE : EVENT_READ, &mi->ev_arg,
+ &mi->tcp_rwflags);
+ }
+}
+
bool
multi_tcp_process_outgoing_link_ready(struct multi_context *m, struct multi_instance *mi,
const unsigned int mpp_flags)
@@ -39,6 +39,8 @@
void multi_tcp_instance_specific_free(struct multi_instance *mi);
+void multi_tcp_set_global_rw_flags(struct multi_context *m, struct multi_instance *mi);
+
bool multi_tcp_process_outgoing_link(struct multi_context *m, bool defer,
const unsigned int mpp_flags);
@@ -122,28 +122,6 @@
}
void
-multi_io_set_global_rw_flags(struct multi_context *m, struct multi_instance *mi)
-{
- if (!mi)
- {
- return;
- }
-
- mi->socket_set_called = true;
- if (proto_is_dgram(mi->context.c2.link_sockets[0]->info.proto))
- {
- socket_set(mi->context.c2.link_sockets[0], m->multi_io->es, EVENT_READ,
- &mi->context.c2.link_sockets[0]->ev_arg, NULL);
- }
- else
- {
- socket_set(mi->context.c2.link_sockets[0], m->multi_io->es,
- mbuf_defined(mi->tcp_link_out_deferred) ? EVENT_WRITE : EVENT_READ, &mi->ev_arg,
- &mi->tcp_rwflags);
- }
-}
-
-void
multi_io_free(struct multi_io *multi_io)
{
if (multi_io)
@@ -378,7 +356,7 @@
case TA_INITIAL:
ASSERT(mi);
- multi_io_set_global_rw_flags(m, mi);
+ multi_tcp_set_global_rw_flags(m, mi);
multi_process_post(m, mi, mpp_flags);
break;
@@ -428,7 +406,7 @@
}
else
{
- multi_io_set_global_rw_flags(m, mi);
+ multi_tcp_set_global_rw_flags(m, mi);
}
break;
@@ -68,8 +68,6 @@
void multi_io_process_io(struct multi_context *m);
-void multi_io_set_global_rw_flags(struct multi_context *m, struct multi_instance *mi);
-
void multi_io_action(struct multi_context *m, struct multi_instance *mi, int action, bool poll);
void multi_io_delete_event(struct multi_io *multi_io, event_t event);