]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: mux-fcgi: use task_kill() during fcgi_takeover() instead of task_wakeup()
authorWilly Tarreau <w@1wt.eu>
Wed, 1 Jul 2020 14:39:33 +0000 (16:39 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 1 Jul 2020 14:47:12 +0000 (16:47 +0200)
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.

src/mux_fcgi.c

index b09ad566c21f492bd576c9490ae174ac2a1084a4..bd27a63f00aa39bce88ce8962234b215f4bcf58c 100644 (file)
@@ -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) {