MINOR: connection: realign empty buffers in muxes, not transport layers

For a long time we've been realigning empty buffers in the transport
layers, where the I/Os were performed based on callbacks. Doing so is
optimal for higher data throughput but makes it trickier to optimize
unaligned data, where mux_h1/h2 have to claim some data are present
in the buffer to force unaligned accesses to skip the frame's header
or the chunk header.

We don't need to do this anymore since the I/O calls are now always
performed from top to bottom, so it's only the mux's responsibility
to realign an empty buffer if it wants to.

In practice it doesn't change anything, it's just a convention, and
it will allow the code to be simplified in a next patch.
This commit is contained in:
Willy Tarreau 2018-12-14 10:51:23 +01:00
parent a73da1ed25
commit e0f24ee149
5 changed files with 3 additions and 4 deletions

View File

@ -1667,6 +1667,7 @@ static int h1_recv(struct h1c *h1c)
int aligned = 0;
h1c->flags &= ~H1C_F_IN_FULL;
b_realign_if_empty(&h1c->ibuf);
if (!b_data(&h1c->ibuf)) {
/* try to pre-align the buffer like the rxbufs will be
* to optimize memory copies.

View File

@ -2446,6 +2446,7 @@ static int h2_recv(struct h2c *h2c)
do {
int aligned = 0;
b_realign_if_empty(buf);
if (!b_data(buf) && (h2c->proxy->options2 & PR_O2_USE_HTX)) {
/* HTX in use : try to pre-align the buffer like the
* rxbufs will be to optimize memory copies. We'll make

View File

@ -249,6 +249,7 @@ static size_t mux_pt_rcv_buf(struct conn_stream *cs, struct buffer *buf, size_t
cs->flags |= CS_FL_RCV_MORE;
return 0;
}
b_realign_if_empty(buf);
ret = cs->conn->xprt->rcv_buf(cs->conn, buf, count, flags);
if (conn_xprt_read0_pending(cs->conn)) {
if (ret == 0)

View File

@ -276,8 +276,6 @@ static size_t raw_sock_to_buf(struct connection *conn, struct buffer *buf, size_
}
}
b_realign_if_empty(buf);
/* read the largest possible block. For this, we perform only one call
* to recv() unless the buffer wraps and we exactly fill the first hunk,
* in which case we accept to do it once again. A new attempt is made on

View File

@ -5438,8 +5438,6 @@ static size_t ssl_sock_to_buf(struct connection *conn, struct buffer *buf, size_
/* a handshake was requested */
return 0;
b_realign_if_empty(buf);
/* read the largest possible block. For this, we perform only one call
* to recv() unless the buffer wraps and we exactly fill the first hunk,
* in which case we accept to do it once again. A new attempt is made on