aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2022-11-17 16:58:47 +1100
committerStefano Brivio <sbrivio@redhat.com>2022-11-25 01:34:54 +0100
commit0eef48c4be5ae8d9de5fed4daaa1954323e08b96 (patch)
tree6bc82f285ce1eb1959c0282346b403f1013e3d6a
parentee8f8e9564c5bd0ca25a9492e3102655d9ce0620 (diff)
downloadpasst-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>
-rw-r--r--tcp.c20
-rw-r--r--tcp_conn.h1
-rw-r--r--tcp_splice.c24
-rw-r--r--tcp_splice.h1
4 files changed, 13 insertions, 33 deletions
diff --git a/tcp.c b/tcp.c
index 61700d6..a9cc811 100644
--- a/tcp.c
+++ b/tcp.c
@@ -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);
+ }
}
}
diff --git a/tcp_conn.h b/tcp_conn.h
index 4295f7d..634e259 100644
--- a/tcp_conn.h
+++ b/tcp_conn.h
@@ -200,5 +200,6 @@ extern union tcp_conn tc[];
void tcp_splice_conn_update(struct ctx *c, struct tcp_splice_conn *new);
void tcp_table_compact(struct ctx *c, union tcp_conn *hole);
+void tcp_splice_destroy(struct ctx *c, struct tcp_splice_conn *conn);
#endif /* TCP_CONN_H */
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);
- }
-}
diff --git a/tcp_splice.h b/tcp_splice.h
index e8c70e9..82e057c 100644
--- a/tcp_splice.h
+++ b/tcp_splice.h
@@ -10,6 +10,5 @@ void tcp_sock_handler_splice(struct ctx *c, union epoll_ref ref,
uint32_t events);
void tcp_splice_init(struct ctx *c);
void tcp_splice_timer(struct ctx *c);
-void tcp_splice_defer_handler(struct ctx *c);
#endif /* TCP_SPLICE_H */