mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-13 23:14:46 +00:00
OPTIM: mux-h1: subscribe rather than waking up at a few other places
This is another round of conversion from a blind tasklet_wakeup() to a more careful subscribe(). It has significantly improved the number of function calls per HTTP request (/?s=1k/t=20) : before after tasklet_wakeup: 3 2 conn_subscribe: 3 2 h1_iocb: 3 2 h1_process: 3 2 h1_parse_msg_hdrs: 4 3 h1_rcv_buf: 5 3 h1_send: 5 4 h1_subscribe: 2 1 h1_wake_stream_for_send: 5 4 http_wait_for_request: 2 1 process_stream: 3 2 si_cs_io_cb: 4 2 si_cs_process: 3 1 si_cs_rcv: 5 3 si_sync_send: 2 1 si_update_both: 2 1 stream_int_chk_rcv_conn: 3 2 stream_int_notify: 3 1 stream_release_buffers: 9 4
This commit is contained in:
parent
6f95f6e111
commit
2c1f37d353
@ -695,7 +695,7 @@ static int h1_init(struct connection *conn, struct proxy *proxy, struct session
|
||||
task_queue(t);
|
||||
|
||||
/* Try to read, if nothing is available yet we'll just subscribe */
|
||||
tasklet_wakeup(h1c->wait_event.tasklet);
|
||||
h1c->conn->xprt->subscribe(h1c->conn, h1c->conn->xprt_ctx, SUB_RETRY_RECV, &h1c->wait_event);
|
||||
|
||||
/* mux->wake will be called soon to complete the operation */
|
||||
TRACE_LEAVE(H1_EV_H1C_NEW, conn, h1c->h1s);
|
||||
@ -1476,7 +1476,7 @@ static size_t h1_process_input(struct h1c *h1c, struct buffer *buf, size_t count
|
||||
if ((h1c->flags & H1C_F_IN_FULL) && buf_room_for_htx_data(&h1c->ibuf)) {
|
||||
h1c->flags &= ~H1C_F_IN_FULL;
|
||||
TRACE_STATE("h1c ibuf not full anymore", H1_EV_RX_DATA|H1_EV_H1C_BLK|H1_EV_H1C_WAKE);
|
||||
tasklet_wakeup(h1c->wait_event.tasklet);
|
||||
h1c->conn->xprt->subscribe(h1c->conn, h1c->conn->xprt_ctx, SUB_RETRY_RECV, &h1c->wait_event);
|
||||
}
|
||||
|
||||
h1s->cs->flags &= ~(CS_FL_RCV_MORE | CS_FL_WANT_ROOM);
|
||||
@ -1891,7 +1891,7 @@ static size_t h1_process_output(struct h1c *h1c, struct buffer *buf, size_t coun
|
||||
}
|
||||
else if (h1s->h1c->flags & H1C_F_IN_BUSY) {
|
||||
h1s->h1c->flags &= ~H1C_F_IN_BUSY;
|
||||
tasklet_wakeup(h1s->h1c->wait_event.tasklet);
|
||||
h1c->conn->xprt->subscribe(h1c->conn, h1c->conn->xprt_ctx, SUB_RETRY_RECV, &h1c->wait_event);
|
||||
TRACE_STATE("h1c no more busy", H1_EV_TX_DATA|H1_EV_H1C_BLK|H1_EV_H1C_WAKE, h1c->conn, h1s);
|
||||
}
|
||||
|
||||
@ -2641,7 +2641,7 @@ static size_t h1_rcv_buf(struct conn_stream *cs, struct buffer *buf, size_t coun
|
||||
TRACE_STATE("disable splicing", H1_EV_STRM_RECV, h1c->conn, h1s);
|
||||
}
|
||||
if (h1m->state != H1_MSG_DONE && !(h1c->wait_event.events & SUB_RETRY_RECV))
|
||||
tasklet_wakeup(h1c->wait_event.tasklet);
|
||||
h1c->conn->xprt->subscribe(h1c->conn, h1c->conn->xprt_ctx, SUB_RETRY_RECV, &h1c->wait_event);
|
||||
}
|
||||
TRACE_LEAVE(H1_EV_STRM_RECV, h1c->conn, h1s,, (size_t[]){ret});
|
||||
return ret;
|
||||
|
Loading…
Reference in New Issue
Block a user