diff --git a/include/haproxy/fd-t.h b/include/haproxy/fd-t.h index d15a97715..1f5584006 100644 --- a/include/haproxy/fd-t.h +++ b/include/haproxy/fd-t.h @@ -64,6 +64,7 @@ enum { /* info/config bits */ #define FD_LINGER_RISK_BIT 16 /* must kill lingering before closing */ +#define FD_CLONED_BIT 17 /* cloned socket, requires EPOLL_CTL_DEL on close */ /* and flag values */ @@ -99,6 +100,7 @@ enum { /* information/configuration flags */ #define FD_LINGER_RISK (1U << FD_LINGER_RISK_BIT) +#define FD_CLONED (1U << FD_CLONED_BIT) /* This is the value used to mark a file descriptor as dead. This value is * negative, this is important so that tests on fd < 0 properly match. It @@ -147,7 +149,6 @@ struct fdtab { void (*iocb)(int fd); /* I/O handler */ void *owner; /* the connection or listener associated with this fd, NULL if closed */ unsigned int state; /* FD state for read and write directions (FD_EV_*) + FD_POLL_* */ - unsigned char cloned:1; /* 1 if a cloned socket, requires EPOLL_CTL_DEL on close */ unsigned char initialized:1; /* 1 if init phase was done on this fd (e.g. set non-blocking) */ unsigned char et_possible:1; /* 1 if edge-triggered is possible on this FD */ unsigned char exported:1; /* 1 if the FD is exported and must not be closed */ diff --git a/include/haproxy/fd.h b/include/haproxy/fd.h index df9df1607..11dce3d9d 100644 --- a/include/haproxy/fd.h +++ b/include/haproxy/fd.h @@ -433,7 +433,6 @@ static inline void fd_insert(int fd, void *owner, void (*iocb)(int fd), unsigned fdtab[fd].owner = owner; fdtab[fd].iocb = iocb; fdtab[fd].state = 0; - fdtab[fd].cloned = 0; fdtab[fd].et_possible = 0; fdtab[fd].exported = 0; #ifdef DEBUG_FD diff --git a/src/cli.c b/src/cli.c index 7c1b0291e..08c35da0f 100644 --- a/src/cli.c +++ b/src/cli.c @@ -1203,7 +1203,7 @@ static int cli_io_handler_show_fd(struct appctx *appctx) (fdt.state & FD_POLL_PRI) ? 'P' : 'p', (fdt.state & FD_POLL_IN) ? 'I' : 'i', (fdt.state & FD_LINGER_RISK) ? 'L' : 'l', - fdt.cloned ? 'C' : 'c', + (fdt.state & FD_CLONED) ? 'C' : 'c', fdt.thread_mask, fdt.update_mask, fdt.owner, fdt.iocb); diff --git a/src/ev_epoll.c b/src/ev_epoll.c index f43875cff..22ad454c8 100644 --- a/src/ev_epoll.c +++ b/src/ev_epoll.c @@ -41,7 +41,7 @@ static int epoll_fd[MAX_THREADS]; // per-thread epoll_fd */ static void __fd_clo(int fd) { - if (unlikely(fdtab[fd].cloned)) { + if (unlikely(fdtab[fd].state & FD_CLONED)) { unsigned long m = polled_mask[fd].poll_recv | polled_mask[fd].poll_send; struct epoll_event ev; int i; diff --git a/src/fd.c b/src/fd.c index e29814b62..64e4e9cc0 100644 --- a/src/fd.c +++ b/src/fd.c @@ -819,7 +819,7 @@ int fork_poller() int fd; for (fd = 0; fd < global.maxsock; fd++) { if (fdtab[fd].owner) { - fdtab[fd].cloned = 1; + HA_ATOMIC_OR(&fdtab[fd].state, FD_CLONED); } }