CLEANUP: tree-wide: reorder a few structures to plug some holes around locks
A few structures were slightly rearranged in order to plug some holes
left around the locks. Sizes ranging from 8 to 32 bytes could be saved
depending on the structures. No performance difference was noticed (none
was expected there), though memory usage might be slightly reduced in
some rare cases.
diff --git a/include/haproxy/connection-t.h b/include/haproxy/connection-t.h
index d096f53..a400880 100644
--- a/include/haproxy/connection-t.h
+++ b/include/haproxy/connection-t.h
@@ -617,8 +617,8 @@
*/
struct idle_conns {
struct mt_list toremove_conns;
- __decl_thread(HA_SPINLOCK_T takeover_lock);
struct task *cleanup_task;
+ __decl_thread(HA_SPINLOCK_T takeover_lock);
} THREAD_ALIGNED(64);
#endif /* _HAPROXY_CONNECTION_T_H */
diff --git a/include/haproxy/dns-t.h b/include/haproxy/dns-t.h
index c77b97e..191edf6 100644
--- a/include/haproxy/dns-t.h
+++ b/include/haproxy/dns-t.h
@@ -164,12 +164,7 @@
* current resolution are stored in a FIFO list.
*/
struct dns_resolvers {
- char *id; /* resolvers unique identifier */
- struct {
- const char *file; /* file where the section appears */
- int line; /* line where the section appears */
- } conf; /* config information */
- struct list nameservers; /* dns server list */
+ __decl_thread(HA_SPINLOCK_T lock);
unsigned int accepted_payload_size; /* maximum payload size we accept for responses */
int nb_nameservers; /* total number of active nameservers in a resolvers section */
int resolve_retries; /* number of retries before giving up */
@@ -193,8 +188,13 @@
struct eb_root query_ids; /* tree to quickly lookup/retrieve query ids currently in use
* used by each nameserver, but stored in resolvers since there must
* be a unique relation between an eb_root and an eb_node (resolution) */
- __decl_thread(HA_SPINLOCK_T lock);
struct list list; /* resolvers list */
+ struct list nameservers; /* dns server list */
+ char *id; /* resolvers unique identifier */
+ struct {
+ const char *file; /* file where the section appears */
+ int line; /* line where the section appears */
+ } conf; /* config information */
};
/* Structure describing a name server used during name resolution.
diff --git a/include/haproxy/listener-t.h b/include/haproxy/listener-t.h
index 89bf7bc..77a3eb0 100644
--- a/include/haproxy/listener-t.h
+++ b/include/haproxy/listener-t.h
@@ -157,7 +157,6 @@
struct ssl_bind_conf *default_ssl_conf; /* custom SSL conf of default_ctx */
int strict_sni; /* refuse negotiation if sni doesn't match a certificate */
int ssl_options; /* ssl options */
- __decl_thread(HA_RWLOCK_T sni_lock); /* lock the SNI trees during add/del operations */
struct eb_root sni_ctx; /* sni_ctx tree of all known certs full-names sorted by name */
struct eb_root sni_w_ctx; /* sni_ctx tree of all known certs wildcards sorted by name */
struct tls_keys_ref *keys_ref; /* TLS ticket keys reference */
@@ -180,6 +179,7 @@
char *arg; /* argument passed to "bind" for better error reporting */
char *file; /* file where the section appears */
int line; /* line where the section appears */
+ __decl_thread(HA_RWLOCK_T sni_lock); /* lock the SNI trees during add/del operations */
struct rx_settings settings; /* all the settings needed for the listening socket */
};
@@ -193,6 +193,8 @@
short int nice; /* nice value to assign to the instantiated tasks */
int luid; /* listener universally unique ID, used for SNMP */
int options; /* socket options : LI_O_* */
+ __decl_thread(HA_SPINLOCK_T lock);
+
struct fe_counters *counters; /* statistics counters */
int nbconn; /* current number of connections on this listener */
int maxconn; /* maximum connections allowed on this listener */
@@ -208,8 +210,6 @@
int tcp_ut; /* for TCP, user timeout */
char *name; /* listener's name */
- __decl_thread(HA_SPINLOCK_T lock);
-
/* cache line boundary */
unsigned int thr_conn[MAX_THREADS]; /* number of connections per thread */
diff --git a/include/haproxy/pattern-t.h b/include/haproxy/pattern-t.h
index c9a14a8..b164250 100644
--- a/include/haproxy/pattern-t.h
+++ b/include/haproxy/pattern-t.h
@@ -100,12 +100,12 @@
*/
struct pat_ref {
struct list list; /* Used to chain refs. */
- unsigned int flags; /* flags PAT_REF_*. */
char *reference; /* The reference name. */
- int unique_id; /* Each pattern reference have unique id. */
char *display; /* String displayed to identify the pattern origin. */
struct list head; /* The head of the list of struct pat_ref_elt. */
struct list pat; /* The head of the list of struct pattern_expr. */
+ unsigned int flags; /* flags PAT_REF_*. */
+ int unique_id; /* Each pattern reference have unique id. */
__decl_thread(HA_SPINLOCK_T lock); /* Lock used to protect pat ref elements */
};
diff --git a/include/haproxy/peers-t.h b/include/haproxy/peers-t.h
index 5d035c3..ee9d905 100644
--- a/include/haproxy/peers-t.h
+++ b/include/haproxy/peers-t.h
@@ -50,6 +50,7 @@
struct peer {
int local; /* proxy state */
+ __decl_thread(HA_SPINLOCK_T lock); /* lock used to handle this peer section */
char *id;
struct {
const char *file; /* file where the section appears */
@@ -78,7 +79,6 @@
struct shared_table *tables;
struct server *srv;
struct dcache *dcache; /* dictionary cache */
- __decl_thread(HA_SPINLOCK_T lock); /* lock used to handle this peer section */
struct peer *next; /* next peer in the list */
};
diff --git a/include/haproxy/proxy-t.h b/include/haproxy/proxy-t.h
index 09eb9bc..1e59373 100644
--- a/include/haproxy/proxy-t.h
+++ b/include/haproxy/proxy-t.h
@@ -252,7 +252,6 @@
int options; /* PR_O_REDISP, PR_O_TRANSP, ... */
int options2; /* PR_O2_* */
- int max_out_conns; /* Max number of idling connections we keep for a session */
unsigned int ck_opts; /* PR_CK_* (cookie options) */
unsigned int fe_req_ana, be_req_ana; /* bitmap of common request protocol analysers for the frontend and backend */
unsigned int fe_rsp_ana, be_rsp_ana; /* bitmap of common response protocol analysers for the frontend and backend */
@@ -293,11 +292,12 @@
unsigned int cookie_maxidle; /* max idle time for this cookie */
unsigned int cookie_maxlife; /* max life time for this cookie */
char *rdp_cookie_name; /* name of the RDP cookie to look for */
- int rdp_cookie_len; /* strlen(rdp_cookie_name), computed only once */
char *capture_name; /* beginning of the name of the cookie to capture */
+ int rdp_cookie_len; /* strlen(rdp_cookie_name), computed only once */
int capture_namelen; /* length of the cookie name to match */
- int capture_len; /* length of the string to be captured */
struct uri_auth *uri_auth; /* if non-NULL, the (list of) per-URI authentications */
+ int capture_len; /* length of the string to be captured */
+ int max_out_conns; /* Max number of idling connections we keep for a session */
int max_ka_queue; /* 1+maximum requests in queue accepted for reusing a K-A conn (0=none) */
int clitcpka_cnt; /* The maximum number of keepalive probes TCP should send before dropping the connection. (client side) */
int clitcpka_idle; /* The time (in seconds) the connection needs to remain idle before TCP starts sending keepalive probes. (client side) */
@@ -321,6 +321,8 @@
int clientfin; /* timeout to apply to client half-closed connections */
int serverfin; /* timeout to apply to server half-closed connections */
} timeout;
+ __decl_thread(HA_SPINLOCK_T lock); /* may be taken under the server's lock */
+
char *id, *desc; /* proxy id (name) and description */
struct eb_root pendconns; /* pending connections with no server assigned yet */
int nbpend; /* number of pending connections with no server assigned yet */
@@ -348,7 +350,6 @@
int redispatch_after; /* number of retries before redispatch */
unsigned down_trans; /* up-down transitions */
unsigned down_time; /* total time the proxy was down */
- unsigned int log_count; /* number of logs produced by the frontend */
time_t last_change; /* last time, when the state was changed */
int (*accept)(struct stream *s); /* application layer's accept() */
struct conn_src conn_src; /* connection source settings */
@@ -377,10 +378,11 @@
struct task *task; /* the associated task, mandatory to manage rate limiting, stopping and resource shortage, NULL if disabled */
struct tcpcheck_rules tcpcheck_rules; /* tcp-check send / expect rules */
- int grace; /* grace time after stop request */
char *check_command; /* Command to use for external agent checks */
char *check_path; /* PATH environment to use for external agent checks */
struct http_reply *replies[HTTP_ERR_SIZE]; /* HTTP replies for known errors */
+ unsigned int log_count; /* number of logs produced by the frontend */
+ int grace; /* grace time after stop request */
int uuid; /* universally unique proxy ID, used for SNMP */
unsigned int backlog; /* force the frontend's listen backlog */
unsigned long bind_proc; /* bitmask of processes using this proxy */
@@ -444,7 +446,6 @@
* name is used
*/
struct list filter_configs; /* list of the filters that are declared on this proxy */
- __decl_thread(HA_SPINLOCK_T lock); /* may be taken under the server's lock */
EXTRA_COUNTERS(extra_counters_fe);
EXTRA_COUNTERS(extra_counters_be);
diff --git a/include/haproxy/server-t.h b/include/haproxy/server-t.h
index 6ef7e43..9e31bee 100644
--- a/include/haproxy/server-t.h
+++ b/include/haproxy/server-t.h
@@ -235,9 +235,10 @@
unsigned int curr_used_conns; /* Current number of used connections */
unsigned int max_used_conns; /* Max number of used connections (the counter is reset at each connection purges */
unsigned int est_need_conns; /* Estimate on the number of needed connections (max of curr and previous max_used) */
- unsigned int *curr_idle_thr; /* Current number of orphan idling connections per thread */
unsigned int next_takeover; /* thread ID to try to steal connections from next time */
+ unsigned int *curr_idle_thr; /* Current number of orphan idling connections per thread */
int max_reuse; /* Max number of requests on a same connection */
+ __decl_thread(HA_SPINLOCK_T lock); /* may enclose the proxy's lock, must not be taken under */
struct eb32_node idle_node; /* When to next do cleanup in the idle connections */
struct task *warmup; /* the task dedicated to the warmup when slowstart is set */
@@ -329,7 +330,6 @@
} ssl_ctx;
#endif
struct dns_srvrq *srvrq; /* Pointer representing the DNS SRV requeest, if any */
- __decl_thread(HA_SPINLOCK_T lock); /* may enclose the proxy's lock, must not be taken under */
struct {
const char *file; /* file where the section appears */
struct eb32_node id; /* place in the tree of used IDs */
diff --git a/include/haproxy/sink-t.h b/include/haproxy/sink-t.h
index f39a1cf..399d87a 100644
--- a/include/haproxy/sink-t.h
+++ b/include/haproxy/sink-t.h
@@ -40,8 +40,8 @@
struct server *srv; // used server
struct appctx *appctx; // appctx of current session
size_t ofs; // ring buffer reader offset
- __decl_thread(HA_SPINLOCK_T lock); // lock to protect current struct
struct sink_forward_target *next;
+ __decl_thread(HA_SPINLOCK_T lock); // lock to protect current struct
};
/* describes the configuration and current state of an event sink */
@@ -57,10 +57,10 @@
struct task *forward_task; // task to handle forward targets conns
struct sig_handler *forward_sighandler; /* signal handler */
struct {
- __decl_thread(HA_RWLOCK_T lock); // shared/excl for dropped
struct ring *ring; // used by ring buffer and STRM sender
unsigned int dropped; // dropped events since last one.
int fd; // fd num for FD type sink
+ __decl_thread(HA_RWLOCK_T lock); // shared/excl for dropped
} ctx;
};
diff --git a/include/haproxy/stick_table-t.h b/include/haproxy/stick_table-t.h
index 9dd4950..59aadea 100644
--- a/include/haproxy/stick_table-t.h
+++ b/include/haproxy/stick_table-t.h
@@ -170,16 +170,11 @@
struct stktable *next; /* The stick-table may be linked when belonging to
* the same configuration section.
*/
- struct {
- const char *file; /* The file where the stick-table is declared. */
- int line; /* The line in this <file> the stick-table is declared. */
- } conf;
struct ebpt_node name; /* Stick-table are lookup by name here. */
struct eb_root keys; /* head of sticky session tree */
struct eb_root exps; /* head of sticky session expiration tree */
struct eb_root updates; /* head of sticky updates sequence tree */
struct pool_head *pool; /* pool used to allocate sticky sessions */
- __decl_thread(HA_SPINLOCK_T lock); /* spin lock related to the table */
struct task *exp_task; /* expiration task */
struct task *sync_task; /* sync task */
unsigned int update;
@@ -208,6 +203,11 @@
} data_arg[STKTABLE_DATA_TYPES]; /* optional argument of each data type */
struct proxy *proxy; /* The proxy this stick-table is attached to, if any.*/
struct proxy *proxies_list; /* The list of proxies which reference this stick-table. */
+ struct {
+ const char *file; /* The file where the stick-table is declared. */
+ int line; /* The line in this <file> the stick-table is declared. */
+ } conf;
+ __decl_thread(HA_SPINLOCK_T lock); /* spin lock related to the table */
};
extern struct stktable_data_type stktable_data_types[STKTABLE_DATA_TYPES];