]> git.baikalelectronics.ru Git - kernel.git/commitdiff
skmsg: Get rid of struct sk_psock_parser
authorCong Wang <cong.wang@bytedance.com>
Tue, 23 Feb 2021 18:49:27 +0000 (10:49 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 26 Feb 2021 20:28:03 +0000 (12:28 -0800)
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
include/linux/skmsg.h
net/core/skmsg.c
net/core/sock_map.c

index db7a08be4725a47a15f29b9f9dc69061f2b2686d..22e26f82de33856f868d7723a9c90a13f56e11a4 100644 (file)
@@ -70,14 +70,6 @@ struct sk_psock_link {
        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_buff                  *skb;
        u32                             len;
@@ -92,7 +84,9 @@ struct sk_psock {
        u32                             eval;
        struct sk_msg                   *cork;
        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 list_head                ingress_msg;
        unsigned long                   state;
@@ -102,6 +96,7 @@ struct sk_psock {
        void (*saved_unhash)(struct sock *sk);
        void (*saved_close)(struct sock *sk, long timeout);
        void (*saved_write_space)(struct sock *sk);
+       void (*saved_data_ready)(struct sock *sk);
        struct proto                    *sk_proto;
        struct sk_psock_work_state      work_state;
        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)
 {
-       if (psock->parser.enabled)
-               psock->parser.saved_data_ready(sk);
+       if (psock->saved_data_ready)
+               psock->saved_data_ready(sk);
        else
                sk->sk_data_ready(sk);
 }
@@ -458,6 +453,6 @@ static inline bool sk_psock_strp_enabled(struct sk_psock *psock)
 {
        if (!psock)
                return false;
-       return psock->parser.enabled;
+       return !!psock->saved_data_ready;
 }
 #endif /* _LINUX_SKMSG_H */
index e017744111e1eb2182001e3205cf37b01f4e565f..d00c9a4b47e7b8c5b88459ff2e62eb11d18a7925 100644 (file)
@@ -907,17 +907,9 @@ static int sk_psock_strp_read_done(struct strparser *strp, int 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)
 {
-       struct sk_psock *psock = sk_psock_from_strp(strp);
+       struct sk_psock *psock = container_of(strp, struct sk_psock, strp);
        struct bpf_prog *prog;
        int ret = skb->len;
 
@@ -941,10 +933,10 @@ static void sk_psock_strp_data_ready(struct sock *sk)
        psock = sk_psock(sk);
        if (likely(psock)) {
                if (tls_sw_has_ctx_rx(sk)) {
-                       psock->parser.saved_data_ready(sk);
+                       psock->saved_data_ready(sk);
                } else {
                        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);
                }
        }
@@ -959,41 +951,34 @@ int sk_psock_init_strp(struct sock *sk, struct sk_psock *psock)
                .parse_msg      = sk_psock_strp_parse,
        };
 
-       psock->parser.enabled = false;
-       return strp_init(&psock->parser.strp, sk, &cb);
+       return strp_init(&psock->strp, sk, &cb);
 }
 
 void sk_psock_start_strp(struct sock *sk, struct sk_psock *psock)
 {
-       struct sk_psock_parser *parser = &psock->parser;
-
-       if (parser->enabled)
+       if (psock->saved_data_ready)
                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_write_space = sk_psock_write_space;
-       parser->enabled = true;
 }
 
 void sk_psock_stop_strp(struct sock *sk, struct sk_psock *psock)
 {
-       struct sk_psock_parser *parser = &psock->parser;
-
-       if (!parser->enabled)
+       if (!psock->saved_data_ready)
                return;
 
-       sk->sk_data_ready = parser->saved_data_ready;
-       parser->saved_data_ready = NULL;
-       strp_stop(&parser->strp);
-       parser->enabled = false;
+       sk->sk_data_ready = psock->saved_data_ready;
+       psock->saved_data_ready = NULL;
+       strp_stop(&psock->strp);
 }
 
 static void sk_psock_done_strp(struct sk_psock *psock)
 {
        /* Parser has been stopped */
        if (psock->progs.skb_parser)
-               strp_done(&psock->parser.strp);
+               strp_done(&psock->strp);
 }
 #else
 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)
 {
-       struct sk_psock_parser *parser = &psock->parser;
-
-       if (parser->enabled)
+       if (psock->saved_data_ready)
                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_write_space = sk_psock_write_space;
-       parser->enabled = true;
 }
 
 void sk_psock_stop_verdict(struct sock *sk, struct sk_psock *psock)
 {
-       struct sk_psock_parser *parser = &psock->parser;
-
-       if (!parser->enabled)
+       if (!psock->saved_data_ready)
                return;
 
-       sk->sk_data_ready = parser->saved_data_ready;
-       parser->saved_data_ready = NULL;
-       parser->enabled = false;
+       sk->sk_data_ready = psock->saved_data_ready;
+       psock->saved_data_ready = NULL;
 }
index ee3334dd3a384dcff62b4bea508148ce52e9bc9c..1a28a5c2c61ee39381c83c95e4096dc667b158bb 100644 (file)
@@ -148,9 +148,9 @@ static void sock_map_del_link(struct sock *sk,
                        struct bpf_map *map = link->map;
                        struct bpf_stab *stab = container_of(map, struct bpf_stab,
                                                             map);
-                       if (psock->parser.enabled && stab->progs.skb_parser)
+                       if (psock->saved_data_ready && stab->progs.skb_parser)
                                strp_stop = true;
-                       if (psock->parser.enabled && stab->progs.skb_verdict)
+                       if (psock->saved_data_ready && stab->progs.skb_verdict)
                                verdict_stop = true;
                        list_del(&link->list);
                        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;
 
        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);
                if (ret)
                        goto out_unlock_drop;
                psock_set_prog(&psock->progs.skb_verdict, skb_verdict);
                psock_set_prog(&psock->progs.skb_parser, skb_parser);
                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);
                sk_psock_start_verdict(sk,psock);
        }