Mitchell Blank Jr <mitch@xxxxxxxxxx> :
[...]
> --- linux-2.6.0-test5-VIRGIN/net/packet/af_packet.c 2003-09-08
> 12:39:53.000000000 -0700
> +++ linux-2.6.0-test5mnb1/net/packet/af_packet.c 2003-09-12
> 13:28:53.857179768 -0700
> @@ -433,9 +433,9 @@
> struct sk_filter *filter;
>
> bh_lock_sock(sk);
> - if ((filter = sk->sk_filter) != NULL)
> - res = sk_run_filter(skb, sk->sk_filter->insns,
> - sk->sk_filter->len);
> + filter = sk->sk_filter;
> + if (likely(filter != NULL)) /* re-check under lock */
> + res = sk_run_filter(skb, filter->insns, filter->len);
1 - pointers tests against NULL are naturally supposed "unlikely" by gcc.
2 - I am not completely convinced that the "/* re-check under lock */"
comment is really useful either: the lock statement is on the line before.
Make it more spartan:
--- linux-2.6.0-test5-VIRGIN/net/packet/af_packet.c 2003-09-08
12:39:53.000000000 -0700
+++ linux-2.6.0-test5mnb1/net/packet/af_packet.c 2003-09-12
13:28:53.857179768 -0700
@@ -433,9 +433,9 @@
struct sk_filter *filter;
bh_lock_sock(sk);
- if ((filter = sk->sk_filter) != NULL)
- res = sk_run_filter(skb, sk->sk_filter->insns,
- sk->sk_filter->len);
+ filter = sk->sk_filter;
+ if (filter)
+ res = sk_run_filter(skb, filter->insns, filter->len);
bh_unlock_sock(sk);
if (res == 0)
@@ -537,9 +537,9 @@
struct sk_filter *filter;
bh_lock_sock(sk);
- if ((filter = sk->sk_filter) != NULL)
- res = sk_run_filter(skb, sk->sk_filter->insns,
- sk->sk_filter->len);
+ filter = sk->sk_filter;
+ if (filter)
+ res = sk_run_filter(skb, filter->insns, filter->len);
bh_unlock_sock(sk);
if (res == 0)
|