From: Willy Tarreau Date: Wed, 1 Jul 2020 14:39:33 +0000 (+0200) Subject: MEDIUM: mux-fcgi: use task_kill() during fcgi_takeover() instead of task_wakeup() X-Git-Tag: v2.2-dev12~26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=88d18f81aed369da4ca2f1334a2c06d2c6f66f35;p=thirdparty%2Fhaproxy.git MEDIUM: mux-fcgi: use task_kill() during fcgi_takeover() instead of task_wakeup() task_wakeup() passes the task through the global run queue under the global RQ lock, which is expensive when dealing with large amounts of fcgi_takeover() calls. Let's use the new task_kill() instead to kill the task. --- diff --git a/src/mux_fcgi.c b/src/mux_fcgi.c index b09ad566c2..bd27a63f00 100644 --- a/src/mux_fcgi.c +++ b/src/mux_fcgi.c @@ -4082,6 +4082,7 @@ static void fcgi_show_fd(struct buffer *msg, struct connection *conn) static int fcgi_takeover(struct connection *conn) { struct fcgi_conn *fcgi = conn->ctx; + struct task *task; if (fd_takeover(conn->handle.fd, conn) != 0) return -1; @@ -4093,10 +4094,13 @@ static int fcgi_takeover(struct connection *conn) */ fcgi->wait_event.tasklet->context = NULL; tasklet_wakeup(fcgi->wait_event.tasklet); - if (fcgi->task) { - fcgi->task->context = NULL; - /* Wake the task, to let it free itself */ - task_wakeup(fcgi->task, TASK_WOKEN_OTHER); + + task = fcgi->task; + if (task) { + task->context = NULL; + fcgi->task = NULL; + __ha_barrier_store(); + task_kill(task); fcgi->task = task_new(tid_bit); if (!fcgi->task) {