haproxy/src
Willy Tarreau 78f548f49e MEDIUM: mux-h1: attempt to zero-copy Rx DATA transfers
When transferring large objects, most calls are made between a full
buffer and an empty buffer. In this case there is a large opportunity
for performing zero-copy calls, with a few exceptions : the input data
must fit into the output buffer, and the data need to be properly
aligned and formated to let the HTX header fit before and the HTX
block(s) fit after.

This patch does two things :

1) it makes sure that we prepare an empty input buffer before an recv()
   call so that it appears as holding an HTX block at the front, which is
   removed afterwards. This way the data received using recv() are placed
   exactly at the target position in the input buffer for a later cast to
   HTX.

2) when receiving data in h1_process_data(), if it appears that the input
   buffer can be cast to an HTX buffer and the target buffer is empty,
   then the buffers are swapped, an HTX block is prepended in front of the
   data area, and the HTX block is appended to reference this data block.

In practice, this ensures that in most cases when transferring large files,
calls to h1_rcv_buf() are made using zero copy and a little bit of buffer
preparation (~40 bytes to be written).

Doing this adds an extra 13% performance boost on top of previous patch,
resulting in a total of 50% speed up on large transfers.
2018-12-05 11:10:24 +01:00
..
51d.c CLEANUP: Fix typo in the 51d subsystem 2018-12-02 18:41:54 +01:00
acl.c MEDIUM: init: convert all trivial registration calls to initcalls 2018-11-26 19:50:32 +01:00
action.c MINOR: action: Add function to check rules using an action ACT_ACTION_TRK_* 2017-10-31 11:36:12 +01:00
activity.c MEDIUM: init: convert all trivial registration calls to initcalls 2018-11-26 19:50:32 +01:00
applet.c MINOR: stream-int: replace si_{want,stop}_put() with si_rx_endp_{more,done}() 2018-11-18 21:41:47 +01:00
arg.c MEDIUM: chunks: make the chunk struct's fields match the buffer struct 2018-07-19 16:23:43 +02:00
auth.c MINOR: initcall: apply initcall to all register_build_opts() calls 2018-11-26 19:50:32 +01:00
backend.c MEDIUM: servers: Add a way to keep idle connections alive. 2018-12-02 18:16:53 +01:00
base64.c CLEANUP: Fix a typo in the base64 subsystem 2018-12-02 18:42:08 +01:00
buffer.c MEDIUM: memory: use pool_destroy_all() to destroy all pools on deinit() 2018-11-26 19:50:32 +01:00
cache.c MEDIUM: init: use initcall for all fixed size pool creations 2018-11-26 19:50:32 +01:00
cfgparse-global.c MINOR: polling: add an option to support busy polling 2018-11-22 19:47:30 +01:00
cfgparse-listen.c REORG: config: extract the proxy parser into cfgparse-listen.c 2018-11-19 06:47:09 +01:00
cfgparse.c MINOR: config: make sure to associate the proper mux to bind and servers 2018-12-02 13:29:35 +01:00
channel.c BUG/MEDIUM: buffers: Make sure we don't wrap in ci_insert_line2/b_rep_blk. 2018-10-08 16:11:54 +02:00
checks.c MEDIUM: init: use initcall for all fixed size pool creations 2018-11-26 19:50:32 +01:00
chunk.c MEDIUM: memory: use pool_destroy_all() to destroy all pools on deinit() 2018-11-26 19:50:32 +01:00
cli.c BUILD: threads: fix minor build warnings when threads are disabled 2018-12-02 19:28:41 +01:00
compression.c MEDIUM: init: use initcall for all fixed size pool creations 2018-11-26 19:50:32 +01:00
connection.c MEDIUM: init: use initcall for all fixed size pool creations 2018-11-26 19:50:32 +01:00
da.c MINOR: initcall: use initcalls for most post_{check,deinit} and per_thread* 2018-11-26 19:50:32 +01:00
dns.c MEDIUM: memory: use pool_destroy_all() to destroy all pools on deinit() 2018-11-26 19:50:32 +01:00
ev_epoll.c MINOR: polling: add an option to support busy polling 2018-11-22 19:47:30 +01:00
ev_kqueue.c MINOR: polling: add an option to support busy polling 2018-11-22 19:47:30 +01:00
ev_poll.c MINOR: poller: move the call of tv_update_date() back to the pollers 2018-11-22 18:57:37 +01:00
ev_select.c MINOR: poller: move the call of tv_update_date() back to the pollers 2018-11-22 18:57:37 +01:00
fd.c MINOR: initcall: use initcalls for most post_{check,deinit} and per_thread* 2018-11-26 19:50:32 +01:00
filters.c MAJOR: filters: Adapt filters API to be compatible with the HTX represenation 2018-12-01 17:37:27 +01:00
flt_http_comp.c BUG/MINOR: flt_trace/compression: Use the right flag to add the HTX support 2018-12-04 16:43:30 +01:00
flt_spoe.c MEDIUM: memory: use pool_destroy_all() to destroy all pools on deinit() 2018-11-26 19:50:32 +01:00
flt_trace.c BUG/MINOR: flt_trace/compression: Use the right flag to add the HTX support 2018-12-04 16:43:30 +01:00
freq_ctr.c BUG/MAJOR: threads/freq_ctr: use a memory barrier to detect changes 2017-10-31 18:01:18 +01:00
frontend.c MEDIUM: init: convert all trivial registration calls to initcalls 2018-11-26 19:50:32 +01:00
h1.c MINOR: h1: Add the flag H1_MF_NO_PHDR to not add pseudo-headers during parsing 2018-10-12 16:15:18 +02:00
h2.c MINOR: h2: add new functions to produce an HTX message from an H2 response 2018-12-02 13:30:17 +01:00
haproxy.c BUG/MEDIUM: mworker: stop proxies which have no listener in the master 2018-12-04 05:54:33 +01:00
hash.c MINOR: hash: add new function hash_crc32c 2018-03-21 05:04:01 +01:00
hathreads.c MINOR: initcall: apply initcall to all register_build_opts() calls 2018-11-26 19:50:32 +01:00
hdr_idx.c CLEANUP: pools: rename all pool functions and pointers to remove this "2" 2017-11-24 17:49:53 +01:00
hlua_fcn.c CLEANUP: fix typos in the hlua_fcn subsystem 2018-11-18 22:23:15 +01:00
hlua.c MEDIUM: init: use initcall for all fixed size pool creations 2018-11-26 19:50:32 +01:00
hpack-dec.c BUG/CRITICAL: hpack: fix improper sign check on the header index value 2018-09-20 11:45:56 +02:00
hpack-enc.c MINOR: hpack: add ":path" to the list of common header fields 2018-12-02 13:30:17 +01:00
hpack-huff.c BUG/MINOR: hpack: must reject huffman literals padded with more than 7 bits 2017-12-03 21:08:39 +01:00
hpack-tbl.c BUG/CRITICAL: hpack: fix improper sign check on the header index value 2018-09-20 11:45:56 +02:00
http_acl.c MEDIUM: init: convert all trivial registration calls to initcalls 2018-11-26 19:50:32 +01:00
http_act.c MEDIUM: init: convert all trivial registration calls to initcalls 2018-11-26 19:50:32 +01:00
http_conv.c MEDIUM: init: convert all trivial registration calls to initcalls 2018-11-26 19:50:32 +01:00
http_fetch.c MINOR: htx: Rename functions htx_*_to_str() to be H1 specific 2018-12-04 05:51:37 +01:00
http_htx.c MEDIUM: proto_htx: Convert all HTTP error messages into HTX 2018-12-01 17:37:27 +01:00
http_rules.c MINOR: http: Make new "early-hint" http-request action really be parsed. 2018-11-12 21:08:55 +01:00
http.c MEDIUM: proto_htx: Convert all HTTP error messages into HTX 2018-12-01 17:37:27 +01:00
htx.c BUG/MINOR: htx: Force HTTP/1.1 on H1 formatting when version is 1.1 or above 2018-12-04 05:51:39 +01:00
i386-linux-vsys.c MEDIUM: listener: add support for linux's accept4() syscall 2012-10-08 20:11:03 +02:00
lb_chash.c BUG/MEDIUM: lb/threads: always properly lock LB algorithms on maintenance operations 2018-08-21 19:44:53 +02:00
lb_fas.c BUG/MEDIUM: lb/threads: always properly lock LB algorithms on maintenance operations 2018-08-21 19:44:53 +02:00
lb_fwlc.c BUG/MEDIUM: lb/threads: always properly lock LB algorithms on maintenance operations 2018-08-21 19:44:53 +02:00
lb_fwrr.c CLEANUP: Fix typo in the fwrr subsystem 2018-12-02 18:40:53 +01:00
lb_map.c BUG/MINOR: lb-map: fix unprotected update to server's score 2018-12-02 19:22:55 +01:00
listener.c MINOR: config: make sure to associate the proper mux to bind and servers 2018-12-02 13:29:35 +01:00
log.c MEDIUM: initcall: use initcalls for a few initialization functions 2018-11-26 19:50:32 +01:00
lru.c MINOR: lru: new function to delete <nb> least recently used keys 2016-01-11 07:31:35 +01:00
mailers.c MEDIUM: Add parsing of mailers section 2015-02-03 00:24:16 +01:00
map.c CLEANUP: Fix typos in the map management functions 2018-12-02 18:40:38 +01:00
memory.c MEDIUM: memory: make the pool cache an array and not a thread_local 2018-11-26 19:50:32 +01:00
mux_h1.c MEDIUM: mux-h1: attempt to zero-copy Rx DATA transfers 2018-12-05 11:10:24 +01:00
mux_h2.c MINOR: mux-h2: stop on non-DATA and non-EOM HTX blocks 2018-12-04 18:32:39 +01:00
mux_pt.c BUG/MEDIUM: mux_pt: Always set CS_FL_RCV_MORE. 2018-12-04 19:23:56 +01:00
namespace.c MINOR: initcall: apply initcall to all register_build_opts() calls 2018-11-26 19:50:32 +01:00
pattern.c MEDIUM: init: use self-initializing spinlocks and rwlocks 2018-11-26 19:50:32 +01:00
payload.c MEDIUM: init: convert all trivial registration calls to initcalls 2018-11-26 19:50:32 +01:00
peers.c CLEANUP: Fix typos in the peers subsystem 2018-11-18 22:26:42 +01:00
pipe.c MEDIUM: init: use initcall for all fixed size pool creations 2018-11-26 19:50:32 +01:00
proto_http.c BUILD: threads: fix minor build warnings when threads are disabled 2018-12-02 19:28:41 +01:00
proto_htx.c BUG/MINOR: proto_htx: Truncate the request when an error is detected 2018-12-04 16:43:30 +01:00
proto_sockpair.c CLEANUP: Fix typos in the socket pair protocol subsystem 2018-12-02 18:40:33 +01:00
proto_tcp.c CLEANUP: Fix typos in the proto_tcp subsystem 2018-12-02 18:39:05 +01:00
proto_udp.c CLEANUP: fix inconsistency between fd->iocb, proto->accept and accept() 2016-04-14 11:18:22 +02:00
proto_uxst.c BUG/MEDIUM: mworker: avoid leak of client socket 2018-11-27 19:34:00 +01:00
protocol.c MEDIUM: protocol: use a custom AF_MAX to help protocol parser 2018-09-12 07:12:27 +02:00
proxy.c MEDIUM: init: convert all trivial registration calls to initcalls 2018-11-26 19:50:32 +01:00
queue.c CLEANUP: Fix a typo in the queue subsystem 2018-12-02 18:40:11 +01:00
raw_sock.c MINOR: connections: Introduce an unsubscribe method. 2018-10-11 15:34:21 +02:00
regex.c MINOR: initcall: apply initcall to all register_build_opts() calls 2018-11-26 19:50:32 +01:00
sample.c MEDIUM: init: convert all trivial registration calls to initcalls 2018-11-26 19:50:32 +01:00
server.c MEDIUM: servers: Add a way to keep idle connections alive. 2018-12-02 18:16:53 +01:00
session.c CLEANUP: Fix a typo in the session subsystem 2018-12-02 18:39:57 +01:00
sha1.c IMPORT: sha1: import SHA1 functions 2017-10-25 04:45:48 +02:00
shctx.c CLEANUP: Fix typos in the shctx subsystem 2018-12-02 18:40:29 +01:00
signal.c CLEANUP: Fix a typo in the signal subsystem 2018-12-02 18:39:52 +01:00
ssl_sock.c BUG/MINOR: fix ssl_fc_alpn and actually add ssl_bc_alpn 2018-12-04 05:53:45 +01:00
standard.c MINOR: Fix typo in error message in the standard subsystem 2018-11-18 22:26:42 +01:00
stats.c MEDIUM: htx: Don't rely on h1_sl anymore except during H1 header parsing 2018-12-01 17:37:27 +01:00
stick_table.c MEDIUM: init: convert all trivial registration calls to initcalls 2018-11-26 19:50:32 +01:00
stream_interface.c BUG/MEDIUM: stream_interface: Make REALLY sure we read all the data. 2018-12-04 16:43:30 +01:00
stream.c BUILD: threads: fix minor build warnings when threads are disabled 2018-12-02 19:28:41 +01:00
task.c MEDIUM: initcall: use initcalls for a few initialization functions 2018-11-26 19:50:32 +01:00
tcp_rules.c MEDIUM: init: convert all trivial registration calls to initcalls 2018-11-26 19:50:32 +01:00
time.c REORG: time/activity: move activity measurements to activity.{c,h} 2018-11-22 11:48:41 +01:00
trace.c CONTRIB: trace: try to display the function's return value on exit 2017-10-24 19:54:25 +02:00
uri_auth.c CLEANUP: log: Rename Alert/Warning in ha_alert/ha_warning 2017-11-24 17:19:12 +01:00
vars.c MEDIUM: init: use initcall for all fixed size pool creations 2018-11-26 19:50:32 +01:00
wurfl.c MINOR: initcall: use initcalls for most post_{check,deinit} and per_thread* 2018-11-26 19:50:32 +01:00
xxhash.c CLEANUP: fix 2 typos in the xxhash subsystem 2018-11-18 22:23:15 +01:00