diff --git a/include/haproxy/receiver-t.h b/include/haproxy/receiver-t.h index f7412dfeb..7c04d4871 100644 --- a/include/haproxy/receiver-t.h +++ b/include/haproxy/receiver-t.h @@ -33,6 +33,7 @@ #define RX_F_BOUND 0x00000001 /* receiver already bound */ #define RX_F_INHERITED 0x00000002 /* inherited FD from the parent process (fd@) */ #define RX_F_MWORKER 0x00000004 /* keep the FD open in the master but close it in the children */ +#define RX_F_LOCAL_ACCEPT 0x00000008 /* do not use a tasklet for accept, connections will be accepted on the current thread */ /* Bit values for rx_settings->options */ #define RX_O_FOREIGN 0x00000001 /* receives on foreign addresses */ diff --git a/src/listener.c b/src/listener.c index c4be8dd0a..cb30dd234 100644 --- a/src/listener.c +++ b/src/listener.c @@ -953,6 +953,9 @@ void listener_accept(struct listener *l) #if defined(USE_THREAD) + if (l->rx.flags & RX_F_LOCAL_ACCEPT) + goto local_accept; + mask = thread_mask(l->rx.bind_thread) & all_threads_mask; if (atleast2(mask) && (global.tune.options & GTUNE_LISTENER_MQ) && !stopping) { struct accept_queue_ring *ring; @@ -1066,6 +1069,7 @@ void listener_accept(struct listener *l) } #endif // USE_THREAD + local_accept: _HA_ATOMIC_INC(&l->thr_conn[tid]); ret = l->accept(cli_conn); if (unlikely(ret <= 0)) {