Browse Source

net: filter: dont block softirqs in sk_run_filter()

Packet filter (BPF) doesnt need to disable softirqs, being fully
re-entrant and lock-less.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Eric Dumazet 14 years ago
parent
commit
80f8f1027b
3 changed files with 7 additions and 7 deletions
  1. 1 1
      include/net/sock.h
  2. 3 3
      net/core/filter.c
  3. 3 3
      net/packet/af_packet.c

+ 1 - 1
include/net/sock.h

@@ -1189,7 +1189,7 @@ extern void sk_filter_release_rcu(struct rcu_head *rcu);
 static inline void sk_filter_release(struct sk_filter *fp)
 static inline void sk_filter_release(struct sk_filter *fp)
 {
 {
 	if (atomic_dec_and_test(&fp->refcnt))
 	if (atomic_dec_and_test(&fp->refcnt))
-		call_rcu_bh(&fp->rcu, sk_filter_release_rcu);
+		call_rcu(&fp->rcu, sk_filter_release_rcu);
 }
 }
 
 
 static inline void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp)
 static inline void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp)

+ 3 - 3
net/core/filter.c

@@ -142,14 +142,14 @@ int sk_filter(struct sock *sk, struct sk_buff *skb)
 	if (err)
 	if (err)
 		return err;
 		return err;
 
 
-	rcu_read_lock_bh();
-	filter = rcu_dereference_bh(sk->sk_filter);
+	rcu_read_lock();
+	filter = rcu_dereference(sk->sk_filter);
 	if (filter) {
 	if (filter) {
 		unsigned int pkt_len = sk_run_filter(skb, filter->insns);
 		unsigned int pkt_len = sk_run_filter(skb, filter->insns);
 
 
 		err = pkt_len ? pskb_trim(skb, pkt_len) : -EPERM;
 		err = pkt_len ? pskb_trim(skb, pkt_len) : -EPERM;
 	}
 	}
-	rcu_read_unlock_bh();
+	rcu_read_unlock();
 
 
 	return err;
 	return err;
 }
 }

+ 3 - 3
net/packet/af_packet.c

@@ -523,11 +523,11 @@ static inline unsigned int run_filter(const struct sk_buff *skb,
 {
 {
 	struct sk_filter *filter;
 	struct sk_filter *filter;
 
 
-	rcu_read_lock_bh();
-	filter = rcu_dereference_bh(sk->sk_filter);
+	rcu_read_lock();
+	filter = rcu_dereference(sk->sk_filter);
 	if (filter != NULL)
 	if (filter != NULL)
 		res = sk_run_filter(skb, filter->insns);
 		res = sk_run_filter(skb, filter->insns);
-	rcu_read_unlock_bh();
+	rcu_read_unlock();
 
 
 	return res;
 	return res;
 }
 }