diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2022-11-17 16:58:47 +1100 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2022-11-25 01:34:54 +0100 |
commit | 0eef48c4be5ae8d9de5fed4daaa1954323e08b96 (patch) | |
tree | 6bc82f285ce1eb1959c0282346b403f1013e3d6a /tcp_splice.c | |
parent | ee8f8e9564c5bd0ca25a9492e3102655d9ce0620 (diff) | |
download | passt-0eef48c4be5ae8d9de5fed4daaa1954323e08b96.tar passt-0eef48c4be5ae8d9de5fed4daaa1954323e08b96.tar.gz passt-0eef48c4be5ae8d9de5fed4daaa1954323e08b96.tar.bz2 passt-0eef48c4be5ae8d9de5fed4daaa1954323e08b96.tar.lz passt-0eef48c4be5ae8d9de5fed4daaa1954323e08b96.tar.xz passt-0eef48c4be5ae8d9de5fed4daaa1954323e08b96.tar.zst passt-0eef48c4be5ae8d9de5fed4daaa1954323e08b96.zip |
tcp: Unify tcp_defer_handler and tcp_splice_defer_handler()
These two functions each step through non-spliced and spliced connections
respectively and clean up entries for closed connections. To avoid
scanning the connection table twice, we merge these into a single function
which scans the unified table and performs the appropriate sort of cleanup
action on each one.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'tcp_splice.c')
-rw-r--r-- | tcp_splice.c | 24 |
1 files changed, 1 insertions, 23 deletions
diff --git a/tcp_splice.c b/tcp_splice.c index c986a9c..ad2b216 100644 --- a/tcp_splice.c +++ b/tcp_splice.c @@ -111,7 +111,6 @@ static void tcp_splice_conn_epoll_events(uint16_t events, *b |= (events & B_OUT_WAIT) ? EPOLLOUT : 0; } -static void tcp_splice_destroy(struct ctx *c, struct tcp_splice_conn *conn); static int tcp_splice_epoll_ctl(const struct ctx *c, struct tcp_splice_conn *conn); @@ -257,7 +256,7 @@ void tcp_splice_conn_update(struct ctx *c, struct tcp_splice_conn *new) * @c: Execution context * @conn: Connection pointer */ -static void tcp_splice_destroy(struct ctx *c, struct tcp_splice_conn *conn) +void tcp_splice_destroy(struct ctx *c, struct tcp_splice_conn *conn) { if (conn->events & SPLICE_ESTABLISHED) { /* Flushing might need to block: don't recycle them. */ @@ -849,24 +848,3 @@ void tcp_splice_timer(struct ctx *c) tcp_splice_pipe_refill(c); } - -/** - * tcp_splice_defer_handler() - Close connections without timer on file pressure - * @c: Execution context - */ -void tcp_splice_defer_handler(struct ctx *c) -{ - int max_conns = c->tcp.conn_count / 100 * TCP_SPLICE_CONN_PRESSURE; - int max_files = c->nofile / 100 * TCP_SPLICE_FILE_PRESSURE; - struct tcp_splice_conn *conn; - - if (c->tcp.conn_count < MIN(max_files / 6, max_conns)) - return; - - for (conn = CONN(c->tcp.conn_count - 1); conn >= CONN(0); conn--) { - if (!conn->c.spliced) - continue; - if (conn->flags & CLOSING) - tcp_splice_destroy(c, conn); - } -} |