skmsg: Get rid of struct sk_psock_parser
struct sk_psock_parser is embedded in sk_psock, it is unnecessary as skb verdict also uses ->saved_data_ready. We can simply fold these fields into sk_psock, and get rid of ->enabled. Signed-off-by: Cong Wang <cong.wang@bytedance.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: John Fastabend <john.fastabend@gmail.com> Acked-by: Jakub Sitnicki <jakub@cloudflare.com> Link: https://lore.kernel.org/bpf/20210223184934.6054-3-xiyou.wangcong@gmail.com
This commit is contained in:
Родитель
887596095e
Коммит
5a685cd94b
|
@ -70,14 +70,6 @@ struct sk_psock_link {
|
||||||
void *link_raw;
|
void *link_raw;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sk_psock_parser {
|
|
||||||
#if IS_ENABLED(CONFIG_BPF_STREAM_PARSER)
|
|
||||||
struct strparser strp;
|
|
||||||
#endif
|
|
||||||
bool enabled;
|
|
||||||
void (*saved_data_ready)(struct sock *sk);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct sk_psock_work_state {
|
struct sk_psock_work_state {
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
u32 len;
|
u32 len;
|
||||||
|
@ -92,7 +84,9 @@ struct sk_psock {
|
||||||
u32 eval;
|
u32 eval;
|
||||||
struct sk_msg *cork;
|
struct sk_msg *cork;
|
||||||
struct sk_psock_progs progs;
|
struct sk_psock_progs progs;
|
||||||
struct sk_psock_parser parser;
|
#if IS_ENABLED(CONFIG_BPF_STREAM_PARSER)
|
||||||
|
struct strparser strp;
|
||||||
|
#endif
|
||||||
struct sk_buff_head ingress_skb;
|
struct sk_buff_head ingress_skb;
|
||||||
struct list_head ingress_msg;
|
struct list_head ingress_msg;
|
||||||
unsigned long state;
|
unsigned long state;
|
||||||
|
@ -102,6 +96,7 @@ struct sk_psock {
|
||||||
void (*saved_unhash)(struct sock *sk);
|
void (*saved_unhash)(struct sock *sk);
|
||||||
void (*saved_close)(struct sock *sk, long timeout);
|
void (*saved_close)(struct sock *sk, long timeout);
|
||||||
void (*saved_write_space)(struct sock *sk);
|
void (*saved_write_space)(struct sock *sk);
|
||||||
|
void (*saved_data_ready)(struct sock *sk);
|
||||||
struct proto *sk_proto;
|
struct proto *sk_proto;
|
||||||
struct sk_psock_work_state work_state;
|
struct sk_psock_work_state work_state;
|
||||||
struct work_struct work;
|
struct work_struct work;
|
||||||
|
@ -418,8 +413,8 @@ static inline void sk_psock_put(struct sock *sk, struct sk_psock *psock)
|
||||||
|
|
||||||
static inline void sk_psock_data_ready(struct sock *sk, struct sk_psock *psock)
|
static inline void sk_psock_data_ready(struct sock *sk, struct sk_psock *psock)
|
||||||
{
|
{
|
||||||
if (psock->parser.enabled)
|
if (psock->saved_data_ready)
|
||||||
psock->parser.saved_data_ready(sk);
|
psock->saved_data_ready(sk);
|
||||||
else
|
else
|
||||||
sk->sk_data_ready(sk);
|
sk->sk_data_ready(sk);
|
||||||
}
|
}
|
||||||
|
@ -458,6 +453,6 @@ static inline bool sk_psock_strp_enabled(struct sk_psock *psock)
|
||||||
{
|
{
|
||||||
if (!psock)
|
if (!psock)
|
||||||
return false;
|
return false;
|
||||||
return psock->parser.enabled;
|
return !!psock->saved_data_ready;
|
||||||
}
|
}
|
||||||
#endif /* _LINUX_SKMSG_H */
|
#endif /* _LINUX_SKMSG_H */
|
||||||
|
|
|
@ -907,17 +907,9 @@ static int sk_psock_strp_read_done(struct strparser *strp, int err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sk_psock *sk_psock_from_strp(struct strparser *strp)
|
|
||||||
{
|
|
||||||
struct sk_psock_parser *parser;
|
|
||||||
|
|
||||||
parser = container_of(strp, struct sk_psock_parser, strp);
|
|
||||||
return container_of(parser, struct sk_psock, parser);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int sk_psock_strp_parse(struct strparser *strp, struct sk_buff *skb)
|
static int sk_psock_strp_parse(struct strparser *strp, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct sk_psock *psock = sk_psock_from_strp(strp);
|
struct sk_psock *psock = container_of(strp, struct sk_psock, strp);
|
||||||
struct bpf_prog *prog;
|
struct bpf_prog *prog;
|
||||||
int ret = skb->len;
|
int ret = skb->len;
|
||||||
|
|
||||||
|
@ -941,10 +933,10 @@ static void sk_psock_strp_data_ready(struct sock *sk)
|
||||||
psock = sk_psock(sk);
|
psock = sk_psock(sk);
|
||||||
if (likely(psock)) {
|
if (likely(psock)) {
|
||||||
if (tls_sw_has_ctx_rx(sk)) {
|
if (tls_sw_has_ctx_rx(sk)) {
|
||||||
psock->parser.saved_data_ready(sk);
|
psock->saved_data_ready(sk);
|
||||||
} else {
|
} else {
|
||||||
write_lock_bh(&sk->sk_callback_lock);
|
write_lock_bh(&sk->sk_callback_lock);
|
||||||
strp_data_ready(&psock->parser.strp);
|
strp_data_ready(&psock->strp);
|
||||||
write_unlock_bh(&sk->sk_callback_lock);
|
write_unlock_bh(&sk->sk_callback_lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -959,41 +951,34 @@ int sk_psock_init_strp(struct sock *sk, struct sk_psock *psock)
|
||||||
.parse_msg = sk_psock_strp_parse,
|
.parse_msg = sk_psock_strp_parse,
|
||||||
};
|
};
|
||||||
|
|
||||||
psock->parser.enabled = false;
|
return strp_init(&psock->strp, sk, &cb);
|
||||||
return strp_init(&psock->parser.strp, sk, &cb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sk_psock_start_strp(struct sock *sk, struct sk_psock *psock)
|
void sk_psock_start_strp(struct sock *sk, struct sk_psock *psock)
|
||||||
{
|
{
|
||||||
struct sk_psock_parser *parser = &psock->parser;
|
if (psock->saved_data_ready)
|
||||||
|
|
||||||
if (parser->enabled)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
parser->saved_data_ready = sk->sk_data_ready;
|
psock->saved_data_ready = sk->sk_data_ready;
|
||||||
sk->sk_data_ready = sk_psock_strp_data_ready;
|
sk->sk_data_ready = sk_psock_strp_data_ready;
|
||||||
sk->sk_write_space = sk_psock_write_space;
|
sk->sk_write_space = sk_psock_write_space;
|
||||||
parser->enabled = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sk_psock_stop_strp(struct sock *sk, struct sk_psock *psock)
|
void sk_psock_stop_strp(struct sock *sk, struct sk_psock *psock)
|
||||||
{
|
{
|
||||||
struct sk_psock_parser *parser = &psock->parser;
|
if (!psock->saved_data_ready)
|
||||||
|
|
||||||
if (!parser->enabled)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sk->sk_data_ready = parser->saved_data_ready;
|
sk->sk_data_ready = psock->saved_data_ready;
|
||||||
parser->saved_data_ready = NULL;
|
psock->saved_data_ready = NULL;
|
||||||
strp_stop(&parser->strp);
|
strp_stop(&psock->strp);
|
||||||
parser->enabled = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sk_psock_done_strp(struct sk_psock *psock)
|
static void sk_psock_done_strp(struct sk_psock *psock)
|
||||||
{
|
{
|
||||||
/* Parser has been stopped */
|
/* Parser has been stopped */
|
||||||
if (psock->progs.skb_parser)
|
if (psock->progs.skb_parser)
|
||||||
strp_done(&psock->parser.strp);
|
strp_done(&psock->strp);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static void sk_psock_done_strp(struct sk_psock *psock)
|
static void sk_psock_done_strp(struct sk_psock *psock)
|
||||||
|
@ -1054,25 +1039,19 @@ static void sk_psock_verdict_data_ready(struct sock *sk)
|
||||||
|
|
||||||
void sk_psock_start_verdict(struct sock *sk, struct sk_psock *psock)
|
void sk_psock_start_verdict(struct sock *sk, struct sk_psock *psock)
|
||||||
{
|
{
|
||||||
struct sk_psock_parser *parser = &psock->parser;
|
if (psock->saved_data_ready)
|
||||||
|
|
||||||
if (parser->enabled)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
parser->saved_data_ready = sk->sk_data_ready;
|
psock->saved_data_ready = sk->sk_data_ready;
|
||||||
sk->sk_data_ready = sk_psock_verdict_data_ready;
|
sk->sk_data_ready = sk_psock_verdict_data_ready;
|
||||||
sk->sk_write_space = sk_psock_write_space;
|
sk->sk_write_space = sk_psock_write_space;
|
||||||
parser->enabled = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sk_psock_stop_verdict(struct sock *sk, struct sk_psock *psock)
|
void sk_psock_stop_verdict(struct sock *sk, struct sk_psock *psock)
|
||||||
{
|
{
|
||||||
struct sk_psock_parser *parser = &psock->parser;
|
if (!psock->saved_data_ready)
|
||||||
|
|
||||||
if (!parser->enabled)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sk->sk_data_ready = parser->saved_data_ready;
|
sk->sk_data_ready = psock->saved_data_ready;
|
||||||
parser->saved_data_ready = NULL;
|
psock->saved_data_ready = NULL;
|
||||||
parser->enabled = false;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -148,9 +148,9 @@ static void sock_map_del_link(struct sock *sk,
|
||||||
struct bpf_map *map = link->map;
|
struct bpf_map *map = link->map;
|
||||||
struct bpf_stab *stab = container_of(map, struct bpf_stab,
|
struct bpf_stab *stab = container_of(map, struct bpf_stab,
|
||||||
map);
|
map);
|
||||||
if (psock->parser.enabled && stab->progs.skb_parser)
|
if (psock->saved_data_ready && stab->progs.skb_parser)
|
||||||
strp_stop = true;
|
strp_stop = true;
|
||||||
if (psock->parser.enabled && stab->progs.skb_verdict)
|
if (psock->saved_data_ready && stab->progs.skb_verdict)
|
||||||
verdict_stop = true;
|
verdict_stop = true;
|
||||||
list_del(&link->list);
|
list_del(&link->list);
|
||||||
sk_psock_free_link(link);
|
sk_psock_free_link(link);
|
||||||
|
@ -283,14 +283,14 @@ static int sock_map_link(struct bpf_map *map, struct sk_psock_progs *progs,
|
||||||
goto out_drop;
|
goto out_drop;
|
||||||
|
|
||||||
write_lock_bh(&sk->sk_callback_lock);
|
write_lock_bh(&sk->sk_callback_lock);
|
||||||
if (skb_parser && skb_verdict && !psock->parser.enabled) {
|
if (skb_parser && skb_verdict && !psock->saved_data_ready) {
|
||||||
ret = sk_psock_init_strp(sk, psock);
|
ret = sk_psock_init_strp(sk, psock);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_unlock_drop;
|
goto out_unlock_drop;
|
||||||
psock_set_prog(&psock->progs.skb_verdict, skb_verdict);
|
psock_set_prog(&psock->progs.skb_verdict, skb_verdict);
|
||||||
psock_set_prog(&psock->progs.skb_parser, skb_parser);
|
psock_set_prog(&psock->progs.skb_parser, skb_parser);
|
||||||
sk_psock_start_strp(sk, psock);
|
sk_psock_start_strp(sk, psock);
|
||||||
} else if (!skb_parser && skb_verdict && !psock->parser.enabled) {
|
} else if (!skb_parser && skb_verdict && !psock->saved_data_ready) {
|
||||||
psock_set_prog(&psock->progs.skb_verdict, skb_verdict);
|
psock_set_prog(&psock->progs.skb_verdict, skb_verdict);
|
||||||
sk_psock_start_verdict(sk,psock);
|
sk_psock_start_verdict(sk,psock);
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче