mirror of
https://passt.top/passt
synced 2025-06-16 04:15:34 +02:00
tcp: Remove splice from tcp_epoll_ref
Currently the epoll reference for tcp sockets includes a bit indicating whether the socket maps to a spliced connection. However, the reference also has the index of the connection structure which also indicates whether it is spliced. We can therefore avoid the splice bit in the epoll_ref by unifying the first part of the non-spliced and spliced handlers where we look up the connection state. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
d909fda1e8
commit
233b95e90f
4 changed files with 46 additions and 46 deletions
60
tcp.c
60
tcp.c
|
@ -2851,7 +2851,6 @@ static void tcp_conn_from_sock(struct ctx *c, union epoll_ref ref,
|
|||
int s;
|
||||
|
||||
assert(ref.r.p.tcp.tcp.listen);
|
||||
assert(!ref.r.p.tcp.tcp.splice);
|
||||
|
||||
if (c->tcp.conn_count >= TCP_MAX_CONNS)
|
||||
return;
|
||||
|
@ -2940,35 +2939,14 @@ static void tcp_timer_handler(struct ctx *c, union epoll_ref ref)
|
|||
}
|
||||
|
||||
/**
|
||||
* tcp_sock_handler() - Handle new data from socket, or timerfd event
|
||||
* tcp_tap_sock_handler() - Handle new data from non-spliced socket
|
||||
* @c: Execution context
|
||||
* @ref: epoll reference
|
||||
* @conn: Connection state
|
||||
* @events: epoll events bitmap
|
||||
* @now: Current timestamp
|
||||
*/
|
||||
void tcp_sock_handler(struct ctx *c, union epoll_ref ref, uint32_t events,
|
||||
const struct timespec *now)
|
||||
static void tcp_tap_sock_handler(struct ctx *c, struct tcp_tap_conn *conn,
|
||||
uint32_t events)
|
||||
{
|
||||
struct tcp_tap_conn *conn;
|
||||
|
||||
if (ref.r.p.tcp.tcp.timer) {
|
||||
tcp_timer_handler(c, ref);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ref.r.p.tcp.tcp.listen) {
|
||||
tcp_conn_from_sock(c, ref, now);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ref.r.p.tcp.tcp.splice) {
|
||||
tcp_sock_handler_splice(c, ref, events);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(conn = conn_at_idx(ref.r.p.tcp.tcp.index)))
|
||||
return;
|
||||
|
||||
if (conn->events == CLOSED)
|
||||
return;
|
||||
|
||||
|
@ -3015,6 +2993,36 @@ void tcp_sock_handler(struct ctx *c, union epoll_ref ref, uint32_t events,
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* tcp_sock_handler() - Handle new data from socket, or timerfd event
|
||||
* @c: Execution context
|
||||
* @ref: epoll reference
|
||||
* @events: epoll events bitmap
|
||||
* @now: Current timestamp
|
||||
*/
|
||||
void tcp_sock_handler(struct ctx *c, union epoll_ref ref, uint32_t events,
|
||||
const struct timespec *now)
|
||||
{
|
||||
union tcp_conn *conn;
|
||||
|
||||
if (ref.r.p.tcp.tcp.timer) {
|
||||
tcp_timer_handler(c, ref);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ref.r.p.tcp.tcp.listen) {
|
||||
tcp_conn_from_sock(c, ref, now);
|
||||
return;
|
||||
}
|
||||
|
||||
conn = tc + ref.r.p.tcp.tcp.index;
|
||||
|
||||
if (conn->c.spliced)
|
||||
tcp_splice_sock_handler(c, &conn->splice, ref.r.s, events);
|
||||
else
|
||||
tcp_tap_sock_handler(c, &conn->tap, events);
|
||||
}
|
||||
|
||||
/**
|
||||
* tcp_sock_init4() - Initialise listening sockets for a given IPv4 port
|
||||
* @c: Execution context
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue