diff options
Diffstat (limited to 'net/core/sock.c')
-rw-r--r-- | net/core/sock.c | 34 |
1 files changed, 15 insertions, 19 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index 51fcfbc041a7..b77e155cbe6c 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -187,13 +187,13 @@ static struct lock_class_key af_callback_keys[AF_MAX]; | |||
187 | #define SK_RMEM_MAX (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS) | 187 | #define SK_RMEM_MAX (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS) |
188 | 188 | ||
189 | /* Run time adjustable parameters. */ | 189 | /* Run time adjustable parameters. */ |
190 | __u32 sysctl_wmem_max = SK_WMEM_MAX; | 190 | __u32 sysctl_wmem_max __read_mostly = SK_WMEM_MAX; |
191 | __u32 sysctl_rmem_max = SK_RMEM_MAX; | 191 | __u32 sysctl_rmem_max __read_mostly = SK_RMEM_MAX; |
192 | __u32 sysctl_wmem_default = SK_WMEM_MAX; | 192 | __u32 sysctl_wmem_default __read_mostly = SK_WMEM_MAX; |
193 | __u32 sysctl_rmem_default = SK_RMEM_MAX; | 193 | __u32 sysctl_rmem_default __read_mostly = SK_RMEM_MAX; |
194 | 194 | ||
195 | /* Maximal space eaten by iovec or ancilliary data plus some space */ | 195 | /* Maximal space eaten by iovec or ancilliary data plus some space */ |
196 | int sysctl_optmem_max = sizeof(unsigned long)*(2*UIO_MAXIOV + 512); | 196 | int sysctl_optmem_max __read_mostly = sizeof(unsigned long)*(2*UIO_MAXIOV+512); |
197 | 197 | ||
198 | static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen) | 198 | static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen) |
199 | { | 199 | { |
@@ -247,11 +247,7 @@ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | |||
247 | goto out; | 247 | goto out; |
248 | } | 248 | } |
249 | 249 | ||
250 | /* It would be deadlock, if sock_queue_rcv_skb is used | 250 | err = sk_filter(sk, skb); |
251 | with socket lock! We assume that users of this | ||
252 | function are lock free. | ||
253 | */ | ||
254 | err = sk_filter(sk, skb, 1); | ||
255 | if (err) | 251 | if (err) |
256 | goto out; | 252 | goto out; |
257 | 253 | ||
@@ -278,7 +274,7 @@ int sk_receive_skb(struct sock *sk, struct sk_buff *skb) | |||
278 | { | 274 | { |
279 | int rc = NET_RX_SUCCESS; | 275 | int rc = NET_RX_SUCCESS; |
280 | 276 | ||
281 | if (sk_filter(sk, skb, 0)) | 277 | if (sk_filter(sk, skb)) |
282 | goto discard_and_relse; | 278 | goto discard_and_relse; |
283 | 279 | ||
284 | skb->dev = NULL; | 280 | skb->dev = NULL; |
@@ -606,15 +602,15 @@ set_rcvbuf: | |||
606 | break; | 602 | break; |
607 | 603 | ||
608 | case SO_DETACH_FILTER: | 604 | case SO_DETACH_FILTER: |
609 | spin_lock_bh(&sk->sk_lock.slock); | 605 | rcu_read_lock_bh(); |
610 | filter = sk->sk_filter; | 606 | filter = rcu_dereference(sk->sk_filter); |
611 | if (filter) { | 607 | if (filter) { |
612 | sk->sk_filter = NULL; | 608 | rcu_assign_pointer(sk->sk_filter, NULL); |
613 | spin_unlock_bh(&sk->sk_lock.slock); | ||
614 | sk_filter_release(sk, filter); | 609 | sk_filter_release(sk, filter); |
610 | rcu_read_unlock_bh(); | ||
615 | break; | 611 | break; |
616 | } | 612 | } |
617 | spin_unlock_bh(&sk->sk_lock.slock); | 613 | rcu_read_unlock_bh(); |
618 | ret = -ENONET; | 614 | ret = -ENONET; |
619 | break; | 615 | break; |
620 | 616 | ||
@@ -884,10 +880,10 @@ void sk_free(struct sock *sk) | |||
884 | if (sk->sk_destruct) | 880 | if (sk->sk_destruct) |
885 | sk->sk_destruct(sk); | 881 | sk->sk_destruct(sk); |
886 | 882 | ||
887 | filter = sk->sk_filter; | 883 | filter = rcu_dereference(sk->sk_filter); |
888 | if (filter) { | 884 | if (filter) { |
889 | sk_filter_release(sk, filter); | 885 | sk_filter_release(sk, filter); |
890 | sk->sk_filter = NULL; | 886 | rcu_assign_pointer(sk->sk_filter, NULL); |
891 | } | 887 | } |
892 | 888 | ||
893 | sock_disable_timestamp(sk); | 889 | sock_disable_timestamp(sk); |
@@ -911,7 +907,7 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority) | |||
911 | if (newsk != NULL) { | 907 | if (newsk != NULL) { |
912 | struct sk_filter *filter; | 908 | struct sk_filter *filter; |
913 | 909 | ||
914 | memcpy(newsk, sk, sk->sk_prot->obj_size); | 910 | sock_copy(newsk, sk); |
915 | 911 | ||
916 | /* SANITY */ | 912 | /* SANITY */ |
917 | sk_node_init(&newsk->sk_node); | 913 | sk_node_init(&newsk->sk_node); |