skmsg: Move sk_redir from TCP_SKB_CB to skb
Currently TCP_SKB_CB() is hard-coded in skmsg code, it certainly does not work for any other non-TCP protocols. We can move them to skb ext, but it introduces a memory allocation on fast path. Fortunately, we only need to a word-size to store all the information, because the flags actually only contains 1 bit so can be just packed into the lowest bit of the "pointer", which is stored as unsigned long. Inside struct sk_buff, '_skb_refdst' can be reused because skb dst is no longer needed after ->sk_data_ready() so we can just drop it. 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-5-xiyou.wangcong@gmail.com
This commit is contained in:
committed by
Alexei Starovoitov
parent
16137b09a6
commit
e3526bb92a
@@ -883,30 +883,11 @@ struct tcp_skb_cb {
|
||||
struct inet6_skb_parm h6;
|
||||
#endif
|
||||
} header; /* For incoming skbs */
|
||||
struct {
|
||||
__u32 flags;
|
||||
struct sock *sk_redir;
|
||||
} bpf;
|
||||
};
|
||||
};
|
||||
|
||||
#define TCP_SKB_CB(__skb) ((struct tcp_skb_cb *)&((__skb)->cb[0]))
|
||||
|
||||
static inline bool tcp_skb_bpf_ingress(const struct sk_buff *skb)
|
||||
{
|
||||
return TCP_SKB_CB(skb)->bpf.flags & BPF_F_INGRESS;
|
||||
}
|
||||
|
||||
static inline struct sock *tcp_skb_bpf_redirect_fetch(struct sk_buff *skb)
|
||||
{
|
||||
return TCP_SKB_CB(skb)->bpf.sk_redir;
|
||||
}
|
||||
|
||||
static inline void tcp_skb_bpf_redirect_clear(struct sk_buff *skb)
|
||||
{
|
||||
TCP_SKB_CB(skb)->bpf.sk_redir = NULL;
|
||||
}
|
||||
|
||||
extern const struct inet_connection_sock_af_ops ipv4_specific;
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
|
||||
Reference in New Issue
Block a user