]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
OPTIM: mux-h1: subscribe rather than waking up at a few other places
authorWilly Tarreau <w@1wt.eu>
Wed, 4 Mar 2020 16:50:02 +0000 (17:50 +0100)
committerWilly Tarreau <w@1wt.eu>
Wed, 4 Mar 2020 18:29:12 +0000 (19:29 +0100)
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

src/mux_h1.c

index e7247aaedadb4eef26198a5714284976682a53ad..a07654b4d660079c67f2c5c81966e47757bf055d 100644 (file)
@@ -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;