mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-01-05 19:52:14 +00:00
MEDIUM: mux-h2: use task_kill() during h2_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 h2_takeover() calls. Let's use the new task_kill() instead to kill the task.
This commit is contained in:
parent
09e0d9ecbc
commit
617e80ff76
12
src/mux_h2.c
12
src/mux_h2.c
@ -6050,6 +6050,7 @@ static void h2_show_fd(struct buffer *msg, struct connection *conn)
|
|||||||
static int h2_takeover(struct connection *conn)
|
static int h2_takeover(struct connection *conn)
|
||||||
{
|
{
|
||||||
struct h2c *h2c = conn->ctx;
|
struct h2c *h2c = conn->ctx;
|
||||||
|
struct task *task;
|
||||||
|
|
||||||
if (fd_takeover(conn->handle.fd, conn) != 0)
|
if (fd_takeover(conn->handle.fd, conn) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
@ -6061,10 +6062,13 @@ static int h2_takeover(struct connection *conn)
|
|||||||
*/
|
*/
|
||||||
h2c->wait_event.tasklet->context = NULL;
|
h2c->wait_event.tasklet->context = NULL;
|
||||||
tasklet_wakeup(h2c->wait_event.tasklet);
|
tasklet_wakeup(h2c->wait_event.tasklet);
|
||||||
if (h2c->task) {
|
|
||||||
h2c->task->context = NULL;
|
task = h2c->task;
|
||||||
/* Wake the task, to let it free itself */
|
if (task) {
|
||||||
task_wakeup(h2c->task, TASK_WOKEN_OTHER);
|
task->context = NULL;
|
||||||
|
h2c->task = NULL;
|
||||||
|
__ha_barrier_store();
|
||||||
|
task_kill(task);
|
||||||
|
|
||||||
h2c->task = task_new(tid_bit);
|
h2c->task = task_new(tid_bit);
|
||||||
if (!h2c->task) {
|
if (!h2c->task) {
|
||||||
|
Loading…
Reference in New Issue
Block a user