1
0
Fork 0
mirror of https://passt.top/passt synced 2025-06-09 00:55:35 +02:00

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>
This commit is contained in:
David Gibson 2022-11-17 16:58:47 +11:00 committed by Stefano Brivio
parent ee8f8e9564
commit 0eef48c4be
4 changed files with 13 additions and 33 deletions

20
tcp.c
View file

@ -1527,21 +1527,23 @@ void tcp_defer_handler(struct ctx *c)
{
int max_conns = c->tcp.conn_count / 100 * TCP_CONN_PRESSURE;
int max_files = c->nofile / 100 * TCP_FILE_PRESSURE;
struct tcp_tap_conn *conn;
union tcp_conn *conn;
tcp_l2_flags_buf_flush(c);
tcp_l2_data_buf_flush(c);
tcp_splice_defer_handler(c);
if (c->tcp.conn_count < MIN(max_files, max_conns))
if ((c->tcp.conn_count < MIN(max_files, max_conns)) &&
(c->tcp.splice_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->events == CLOSED)
tcp_conn_destroy(c, conn);
for (conn = tc + c->tcp.conn_count - 1; conn >= tc; conn--) {
if (conn->c.spliced) {
if (conn->splice.flags & CLOSING)
tcp_splice_destroy(c, &conn->splice);
} else {
if (conn->tap.events == CLOSED)
tcp_conn_destroy(c, &conn->tap);
}
}
}