git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'upstream-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/linvil...
[pandora-kernel.git]
/
net
/
core
/
sock.c
diff --git
a/net/core/sock.c
b/net/core/sock.c
index
51fcfbc
..
d472db4
100644
(file)
--- a/
net/core/sock.c
+++ b/
net/core/sock.c
@@
-187,13
+187,13
@@
static struct lock_class_key af_callback_keys[AF_MAX];
#define SK_RMEM_MAX (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS)
/* Run time adjustable parameters. */
#define SK_RMEM_MAX (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS)
/* Run time adjustable parameters. */
-__u32 sysctl_wmem_max = SK_WMEM_MAX;
-__u32 sysctl_rmem_max = SK_RMEM_MAX;
-__u32 sysctl_wmem_default = SK_WMEM_MAX;
-__u32 sysctl_rmem_default = SK_RMEM_MAX;
+__u32 sysctl_wmem_max
__read_mostly
= SK_WMEM_MAX;
+__u32 sysctl_rmem_max
__read_mostly
= SK_RMEM_MAX;
+__u32 sysctl_wmem_default
__read_mostly
= SK_WMEM_MAX;
+__u32 sysctl_rmem_default
__read_mostly
= SK_RMEM_MAX;
/* Maximal space eaten by iovec or ancilliary data plus some space */
/* Maximal space eaten by iovec or ancilliary data plus some space */
-int sysctl_optmem_max
= sizeof(unsigned long)*(2*UIO_MAXIOV +
512);
+int sysctl_optmem_max
__read_mostly = sizeof(unsigned long)*(2*UIO_MAXIOV+
512);
static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen)
{
static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen)
{
@@
-247,11
+247,7
@@
int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
goto out;
}
goto out;
}
- /* It would be deadlock, if sock_queue_rcv_skb is used
- with socket lock! We assume that users of this
- function are lock free.
- */
- err = sk_filter(sk, skb, 1);
+ err = sk_filter(sk, skb);
if (err)
goto out;
if (err)
goto out;
@@
-278,7
+274,7
@@
int sk_receive_skb(struct sock *sk, struct sk_buff *skb)
{
int rc = NET_RX_SUCCESS;
{
int rc = NET_RX_SUCCESS;
- if (sk_filter(sk, skb
, 0
))
+ if (sk_filter(sk, skb))
goto discard_and_relse;
skb->dev = NULL;
goto discard_and_relse;
skb->dev = NULL;
@@
-606,15
+602,15
@@
set_rcvbuf:
break;
case SO_DETACH_FILTER:
break;
case SO_DETACH_FILTER:
-
spin_lock_bh(&sk->sk_lock.slock
);
- filter =
sk->sk_filter
;
+
rcu_read_lock_bh(
);
+ filter =
rcu_dereference(sk->sk_filter)
;
if (filter) {
if (filter) {
- sk->sk_filter = NULL;
- spin_unlock_bh(&sk->sk_lock.slock);
+ rcu_assign_pointer(sk->sk_filter, NULL);
sk_filter_release(sk, filter);
sk_filter_release(sk, filter);
+ rcu_read_unlock_bh();
break;
}
break;
}
-
spin_unlock_bh(&sk->sk_lock.slock
);
+
rcu_read_unlock_bh(
);
ret = -ENONET;
break;
ret = -ENONET;
break;
@@
-827,7
+823,7
@@
static void inline sock_lock_init(struct sock *sk)
af_family_slock_key_strings[sk->sk_family]);
lockdep_init_map(&sk->sk_lock.dep_map,
af_family_key_strings[sk->sk_family],
af_family_slock_key_strings[sk->sk_family]);
lockdep_init_map(&sk->sk_lock.dep_map,
af_family_key_strings[sk->sk_family],
- af_family_keys + sk->sk_family);
+ af_family_keys + sk->sk_family
, 0
);
}
/**
}
/**
@@
-884,10
+880,10
@@
void sk_free(struct sock *sk)
if (sk->sk_destruct)
sk->sk_destruct(sk);
if (sk->sk_destruct)
sk->sk_destruct(sk);
- filter =
sk->sk_filter
;
+ filter =
rcu_dereference(sk->sk_filter)
;
if (filter) {
sk_filter_release(sk, filter);
if (filter) {
sk_filter_release(sk, filter);
-
sk->sk_filter = NULL
;
+
rcu_assign_pointer(sk->sk_filter, NULL)
;
}
sock_disable_timestamp(sk);
}
sock_disable_timestamp(sk);
@@
-911,7
+907,7
@@
struct sock *sk_clone(const struct sock *sk, const gfp_t priority)
if (newsk != NULL) {
struct sk_filter *filter;
if (newsk != NULL) {
struct sk_filter *filter;
-
memcpy(newsk, sk, sk->sk_prot->obj_size
);
+
sock_copy(newsk, sk
);
/* SANITY */
sk_node_init(&newsk->sk_node);
/* SANITY */
sk_node_init(&newsk->sk_node);