From: Willy Tarreau Date: Wed, 17 Feb 2021 15:15:23 +0000 (+0100) Subject: OPTIM: lb-first: do not take the server lock on take_conn/drop_conn X-Git-Tag: v2.3.7~49 X-Git-Url: http://git.haproxy.org/?a=commitdiff_plain;h=7a413401483468c07d32b67b388d37eb6768e289;p=haproxy-2.3.git OPTIM: lb-first: do not take the server lock on take_conn/drop_conn The operations are only an insert and a delete into the LB tree, which doesn't require the server's lock at all as the lbprm lock is already held. Let's drop it. (cherry picked from commit 6b96e0e9d204bb7e30222964d641cc28a0e4d0c0) Signed-off-by: Willy Tarreau --- diff --git a/src/lb_fas.c b/src/lb_fas.c index 3debfec..9f6dc24 100644 --- a/src/lb_fas.c +++ b/src/lb_fas.c @@ -36,7 +36,7 @@ static inline void fas_remove_from_tree(struct server *s) /* simply removes a server from a tree. * - * The server's lock and the lbprm's lock must be held. + * The lbprm's lock must be held. */ static inline void fas_dequeue_srv(struct server *s) { @@ -49,7 +49,7 @@ static inline void fas_dequeue_srv(struct server *s) * reached. It is important to understand that the server weight is not used * here. * - * The server's lock and the lbprm's lock must be held. + * The lbprm's lock must be held. */ static inline void fas_queue_srv(struct server *s) { @@ -66,18 +66,12 @@ static inline void fas_queue_srv(struct server *s) */ static void fas_srv_reposition(struct server *s, int locked) { - if (!locked) - HA_SPIN_LOCK(SERVER_LOCK, &s->lock); - HA_RWLOCK_WRLOCK(LBPRM_LOCK, &s->proxy->lbprm.lock); if (s->lb_tree) { fas_dequeue_srv(s); fas_queue_srv(s); } HA_RWLOCK_WRUNLOCK(LBPRM_LOCK, &s->proxy->lbprm.lock); - - if (!locked) - HA_SPIN_UNLOCK(SERVER_LOCK, &s->lock); } /* This function updates the server trees according to server 's new