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:
parent
955dd3251c
commit
b60fa33eea
3 changed files with 9 additions and 7 deletions
6
tcp.c
6
tcp.c
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue