tcp: Move in_epoll flag out of common connection structure

The in_epoll boolean is one of only two fields (currently) in the common
structure shared between tap and spliced connections.  It seems like it
belongs there, because both tap and spliced connections use it, and it has
roughly the same meaning.

Roughly, however, isn't exactly: which fds this flag says are in the epoll
varies between the two connection types, and are in type specific fields.
So, it's only possible to meaningfully use this value locally in type
specific code anyway.

This common field is going to get in the way of more widespread
generalisation of connection / flow tracking, so move it to separate fields
in the tap and splice specific structures.

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 2023-08-22 15:29:58 +10:00 committed by Stefano Brivio
parent 955dd3251c
commit b60fa33eea
3 changed files with 9 additions and 7 deletions

6
tcp.c
View file

@ -634,13 +634,13 @@ static void conn_flag_do(const struct ctx *c, struct tcp_tap_conn *conn,
*/ */
static int tcp_epoll_ctl(const struct ctx *c, struct tcp_tap_conn *conn) static int tcp_epoll_ctl(const struct ctx *c, struct tcp_tap_conn *conn)
{ {
int m = conn->c.in_epoll ? EPOLL_CTL_MOD : EPOLL_CTL_ADD; int m = conn->in_epoll ? EPOLL_CTL_MOD : EPOLL_CTL_ADD;
union epoll_ref ref = { .type = EPOLL_TYPE_TCP, .fd = conn->sock, union epoll_ref ref = { .type = EPOLL_TYPE_TCP, .fd = conn->sock,
.tcp.index = CONN_IDX(conn) }; .tcp.index = CONN_IDX(conn) };
struct epoll_event ev = { .data.u64 = ref.u64 }; struct epoll_event ev = { .data.u64 = ref.u64 };
if (conn->events == CLOSED) { if (conn->events == CLOSED) {
if (conn->c.in_epoll) if (conn->in_epoll)
epoll_ctl(c->epollfd, EPOLL_CTL_DEL, conn->sock, &ev); epoll_ctl(c->epollfd, EPOLL_CTL_DEL, conn->sock, &ev);
if (conn->timer != -1) if (conn->timer != -1)
epoll_ctl(c->epollfd, EPOLL_CTL_DEL, conn->timer, &ev); epoll_ctl(c->epollfd, EPOLL_CTL_DEL, conn->timer, &ev);
@ -652,7 +652,7 @@ static int tcp_epoll_ctl(const struct ctx *c, struct tcp_tap_conn *conn)
if (epoll_ctl(c->epollfd, m, conn->sock, &ev)) if (epoll_ctl(c->epollfd, m, conn->sock, &ev))
return -errno; return -errno;
conn->c.in_epoll = true; conn->in_epoll = true;
if (conn->timer != -1) { if (conn->timer != -1) {
union epoll_ref ref_t = { .type = EPOLL_TYPE_TCP_TIMER, union epoll_ref ref_t = { .type = EPOLL_TYPE_TCP_TIMER,

View file

@ -12,11 +12,9 @@
/** /**
* struct tcp_conn_common - Common fields for spliced and non-spliced * struct tcp_conn_common - Common fields for spliced and non-spliced
* @spliced: Is this a spliced connection? * @spliced: Is this a spliced connection?
* @in_epoll: Is the connection in the epoll set?
*/ */
struct tcp_conn_common { struct tcp_conn_common {
bool spliced :1; bool spliced :1;
bool in_epoll :1;
}; };
extern const char *tcp_common_flag_str[]; extern const char *tcp_common_flag_str[];
@ -24,6 +22,7 @@ extern const char *tcp_common_flag_str[];
/** /**
* struct tcp_tap_conn - Descriptor for a TCP connection (not spliced) * struct tcp_tap_conn - Descriptor for a TCP connection (not spliced)
* @c: Fields common with tcp_splice_conn * @c: Fields common with tcp_splice_conn
* @in_epoll: Is the connection in the epoll set?
* @next_index: Connection index of next item in hash chain, -1 for none * @next_index: Connection index of next item in hash chain, -1 for none
* @tap_mss: MSS advertised by tap/guest, rounded to 2 ^ TCP_MSS_BITS * @tap_mss: MSS advertised by tap/guest, rounded to 2 ^ TCP_MSS_BITS
* @sock: Socket descriptor number * @sock: Socket descriptor number
@ -50,6 +49,7 @@ struct tcp_tap_conn {
/* Must be first element to match tcp_splice_conn */ /* Must be first element to match tcp_splice_conn */
struct tcp_conn_common c; struct tcp_conn_common c;
bool in_epoll :1;
int next_index :TCP_CONN_INDEX_BITS + 2; int next_index :TCP_CONN_INDEX_BITS + 2;
#define TCP_RETRANS_BITS 3 #define TCP_RETRANS_BITS 3
@ -122,6 +122,7 @@ struct tcp_tap_conn {
/** /**
* struct tcp_splice_conn - Descriptor for a spliced TCP connection * struct tcp_splice_conn - Descriptor for a spliced TCP connection
* @c: Fields common with tcp_tap_conn * @c: Fields common with tcp_tap_conn
* @in_epoll: Is the connection in the epoll set?
* @a: File descriptor number of socket for accepted connection * @a: File descriptor number of socket for accepted connection
* @pipe_a_b: Pipe ends for splice() from @a to @b * @pipe_a_b: Pipe ends for splice() from @a to @b
* @b: File descriptor number of peer connected socket * @b: File descriptor number of peer connected socket
@ -137,6 +138,7 @@ struct tcp_splice_conn {
/* Must be first element to match tcp_tap_conn */ /* Must be first element to match tcp_tap_conn */
struct tcp_conn_common c; struct tcp_conn_common c;
bool in_epoll :1;
int a; int a;
int pipe_a_b[2]; int pipe_a_b[2];
int b; int b;

View file

@ -172,7 +172,7 @@ static void conn_flag_do(const struct ctx *c, struct tcp_splice_conn *conn,
static int tcp_splice_epoll_ctl(const struct ctx *c, static int tcp_splice_epoll_ctl(const struct ctx *c,
struct tcp_splice_conn *conn) struct tcp_splice_conn *conn)
{ {
int m = conn->c.in_epoll ? EPOLL_CTL_MOD : EPOLL_CTL_ADD; int m = conn->in_epoll ? EPOLL_CTL_MOD : EPOLL_CTL_ADD;
union epoll_ref ref_a = { .type = EPOLL_TYPE_TCP, .fd = conn->a, union epoll_ref ref_a = { .type = EPOLL_TYPE_TCP, .fd = conn->a,
.tcp.index = CONN_IDX(conn) }; .tcp.index = CONN_IDX(conn) };
union epoll_ref ref_b = { .type = EPOLL_TYPE_TCP, .fd = conn->b, union epoll_ref ref_b = { .type = EPOLL_TYPE_TCP, .fd = conn->b,
@ -192,7 +192,7 @@ static int tcp_splice_epoll_ctl(const struct ctx *c,
epoll_ctl(c->epollfd, m, conn->b, &ev_b)) epoll_ctl(c->epollfd, m, conn->b, &ev_b))
goto delete; goto delete;
conn->c.in_epoll = true; conn->in_epoll = true;
return 0; return 0;