bpf, sched: Remove unneeded rcu_read_lock() around BPF program invocation
authorToke Høiland-Jørgensen <toke@redhat.com>
Thu, 24 Jun 2021 16:05:56 +0000 (18:05 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 24 Jun 2021 17:43:11 +0000 (19:43 +0200)
The rcu_read_lock() call in cls_bpf and act_bpf are redundant: on the TX
side, there's already a call to rcu_read_lock_bh() in __dev_queue_xmit(),
and on RX there's a covering rcu_read_lock() in
netif_receive_skb{,_list}_internal().

With the previous patches we also amended the lockdep checks in the map
code to not require any particular RCU flavour, so we can just get rid of
the rcu_read_lock()s.

Suggested-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20210624160609.292325-7-toke@redhat.com
net/sched/act_bpf.c
net/sched/cls_bpf.c

index e48e980c3b937c9ac5587ef48811273feb1db2c4..e409a000571728f2d9a3e2158a63a922db376908 100644 (file)
@@ -43,7 +43,6 @@ static int tcf_bpf_act(struct sk_buff *skb, const struct tc_action *act,
        tcf_lastuse_update(&prog->tcf_tm);
        bstats_cpu_update(this_cpu_ptr(prog->common.cpu_bstats), skb);
 
-       rcu_read_lock();
        filter = rcu_dereference(prog->filter);
        if (at_ingress) {
                __skb_push(skb, skb->mac_len);
@@ -56,7 +55,6 @@ static int tcf_bpf_act(struct sk_buff *skb, const struct tc_action *act,
        }
        if (skb_sk_is_prefetched(skb) && filter_res != TC_ACT_OK)
                skb_orphan(skb);
-       rcu_read_unlock();
 
        /* A BPF program may overwrite the default action opcode.
         * Similarly as in cls_bpf, if filter_res == -1 we use the
index 6e3e63db0e0168d8543602632b3bdeecaa908c35..fa739efa59f46c65977be81a73ae5065e024c014 100644 (file)
@@ -85,8 +85,6 @@ static int cls_bpf_classify(struct sk_buff *skb, const struct tcf_proto *tp,
        struct cls_bpf_prog *prog;
        int ret = -1;
 
-       /* Needed here for accessing maps. */
-       rcu_read_lock();
        list_for_each_entry_rcu(prog, &head->plist, link) {
                int filter_res;
 
@@ -131,7 +129,6 @@ static int cls_bpf_classify(struct sk_buff *skb, const struct tcf_proto *tp,
 
                break;
        }
-       rcu_read_unlock();
 
        return ret;
 }