1
0
mirror of https://passt.top/passt synced 2024-06-27 21:42:42 +00:00

flow, tcp: Add flow-centric dispatch for deferred flow handling

tcp_defer_handler(), amongst other things, scans the flow table and does
some processing for each TCP connection.  When we add other protocols to
the flow table, they're likely to want some similar scanning.  It makes
more sense for cache friendliness to perform a single scan of the flow
table and dispatch to the protocol specific handlers, rather than having
each protocol separately scan the table.

To that end, add a new flow_defer_handler() handling all flow-linked
deferred operations.

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 2024-01-16 11:50:35 +11:00 committed by Stefano Brivio
parent c97bb527d6
commit b43e4483ed
5 changed files with 28 additions and 17 deletions

23
flow.c
View File

@ -84,3 +84,26 @@ void flow_log_(const struct flow_common *f, int pri, const char *fmt, ...)
logmsg(pri, "Flow %u (%s): %s", flow_idx(f), FLOW_TYPE(f), msg);
}
/**
* flow_defer_handler() - Handler for per-flow deferred tasks
* @c: Execution context
*/
void flow_defer_handler(struct ctx *c)
{
union flow *flow;
for (flow = flowtab + c->flow_count - 1; flow >= flowtab; flow--) {
switch (flow->f.type) {
case FLOW_TCP:
tcp_flow_defer(c, flow);
break;
case FLOW_TCP_SPLICE:
tcp_splice_flow_defer(c, flow);
break;
default:
/* Assume other flow types don't need any handling */
;
}
}
}

1
flow.h
View File

@ -67,6 +67,7 @@ static inline bool flow_sidx_eq(flow_sidx_t a, flow_sidx_t b)
union flow;
void flow_table_compact(struct ctx *c, union flow *hole);
void flow_defer_handler(struct ctx *c);
void flow_log_(const struct flow_common *f, int pri, const char *fmt, ...)
__attribute__((format(printf, 3, 4)));

View File

@ -103,6 +103,7 @@ static void post_handler(struct ctx *c, const struct timespec *now)
/* NOLINTNEXTLINE(bugprone-branch-clone): intervals can be the same */
CALL_PROTO_HANDLER(c, now, icmp, ICMP);
flow_defer_handler(c);
#undef CALL_PROTO_HANDLER
}

19
tcp.c
View File

@ -1307,7 +1307,7 @@ static struct tcp_tap_conn *tcp_hash_lookup(const struct ctx *c,
* @c: Execution context
* @flow: Flow table entry for this connection
*/
static void tcp_flow_defer(struct ctx *c, union flow *flow)
void tcp_flow_defer(struct ctx *c, union flow *flow)
{
const struct tcp_tap_conn *conn = &flow->tcp;
@ -1365,26 +1365,11 @@ static void tcp_l2_data_buf_flush(const struct ctx *c)
* tcp_defer_handler() - Handler for TCP deferred tasks
* @c: Execution context
*/
/* cppcheck-suppress [constParameterPointer, unmatchedSuppression] */
void tcp_defer_handler(struct ctx *c)
{
union flow *flow;
tcp_l2_flags_buf_flush(c);
tcp_l2_data_buf_flush(c);
for (flow = flowtab + c->flow_count - 1; flow >= flowtab; flow--) {
switch (flow->f.type) {
case FLOW_TCP:
tcp_flow_defer(c, flow);
break;
case FLOW_TCP_SPLICE:
tcp_splice_flow_defer(c, flow);
break;
default:
die("Unexpected %s in tcp_defer_handler()",
FLOW_TYPE(&flow->f));
}
}
}
/**

View File

@ -158,6 +158,7 @@ extern int init_sock_pool6 [TCP_SOCK_POOL_SIZE];
void tcp_tap_conn_update(const struct ctx *c, struct tcp_tap_conn *old,
struct tcp_tap_conn *new);
void tcp_splice_conn_update(const struct ctx *c, struct tcp_splice_conn *new);
void tcp_flow_defer(struct ctx *c, union flow *flow);
void tcp_splice_flow_defer(struct ctx *c, union flow *flow);
void tcp_splice_timer(const struct ctx *c, union flow *flow);
int tcp_conn_pool_sock(int pool[]);