From 3906e22f6f0482f756eb8360b233e4d0da78b45b Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 5 Dec 2018 07:56:25 +0100 Subject: [PATCH] MINOR: htx: add buf_room_for_htx_data() to help optimize buffer transfers The small HTX overhead is enough to make the system perform multiple reads and unaligned memory copies. Here we provide a function whose purpose is to reduce the apparent room in a buffer by the size of the overhead for DATA blocks, which is the struct htx plus 2 blocks (one for DATA, one for the end of message so that small blocks can fit at once). The muxes using HTX will be encouraged to use this one instead of b_room() to compute the available buffer room and avoid filling their demux buf with more data than can fit at once into the HTX buffer. --- include/proto/htx.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/include/proto/htx.h b/include/proto/htx.h index b6f1042f4..fdd305646 100644 --- a/include/proto/htx.h +++ b/include/proto/htx.h @@ -524,6 +524,23 @@ static inline void htx_reset(struct htx *htx) htx->sl_off = -1; } +/* returns the available room for raw data in buffer once HTX overhead is + * taken into account (one HTX header and two blocks). The purpose is to figure + * the optimal fill length to avoid copies. + */ +static inline size_t buf_room_for_htx_data(const struct buffer *buf) +{ + size_t room; + + room = b_room(buf); + if (room <= sizeof(struct htx) + 2 * sizeof(struct htx_blk)) + room = 0; + else + room -= sizeof(struct htx) + 2 * sizeof(struct htx_blk); + + return room; +} + /* Returns an HTX message using the buffer . */ static inline struct htx *htx_from_buf(struct buffer *buf) {