diff --git a/include/proto/connection.h b/include/proto/connection.h index 7e4cb03bf..b1d8638e9 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -123,9 +123,6 @@ static inline void conn_ctrl_init(struct connection *conn) int fd = conn->handle.fd; fd_insert(fd, conn, conn_fd_handler, tid_bit); - /* mark the fd as ready so as not to needlessly poll at the beginning */ - fd_may_recv(fd); - fd_may_send(fd); conn->flags |= CO_FL_CTRL_READY; } } diff --git a/include/proto/fd.h b/include/proto/fd.h index 4b932357f..747b34f78 100644 --- a/include/proto/fd.h +++ b/include/proto/fd.h @@ -241,6 +241,14 @@ static inline void fd_may_recv(const int fd) return; } +/* Report that FD may receive and send without polling. Used at FD + * initialization. + */ +static inline void fd_may_both(const int fd) +{ + HA_ATOMIC_OR(&fdtab[fd].state, FD_EV_READY_RW); +} + /* Disable readiness when active. This is useful to interrupt reading when it * is suspected that the end of data might have been reached (eg: short read). * This can only be done using level-triggered pollers, so if any edge-triggered @@ -339,6 +347,8 @@ static inline void fd_insert(int fd, void *owner, void (*iocb)(int fd), unsigned */ if (locked) HA_SPIN_UNLOCK(FD_LOCK, &fdtab[fd].lock); + /* the two directions are ready until proven otherwise */ + fd_may_both(fd); _HA_ATOMIC_ADD(&ha_used_fds, 1); }