diff options
Diffstat (limited to 'net/core/sock.c')
| -rw-r--r-- | net/core/sock.c | 20 | 
1 files changed, 12 insertions, 8 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index 7d99e13148e..fb608011146 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -1225,7 +1225,7 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority)  		sock_reset_flag(newsk, SOCK_DONE);  		skb_queue_head_init(&newsk->sk_error_queue); -		filter = newsk->sk_filter; +		filter = rcu_dereference_protected(newsk->sk_filter, 1);  		if (filter != NULL)  			sk_filter_charge(newsk, filter); @@ -1560,6 +1560,8 @@ struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size,  EXPORT_SYMBOL(sock_alloc_send_skb);  static void __lock_sock(struct sock *sk) +	__releases(&sk->sk_lock.slock) +	__acquires(&sk->sk_lock.slock)  {  	DEFINE_WAIT(wait); @@ -1576,6 +1578,8 @@ static void __lock_sock(struct sock *sk)  }  static void __release_sock(struct sock *sk) +	__releases(&sk->sk_lock.slock) +	__acquires(&sk->sk_lock.slock)  {  	struct sk_buff *skb = sk->sk_backlog.head; @@ -1649,10 +1653,10 @@ int __sk_mem_schedule(struct sock *sk, int size, int kind)  {  	struct proto *prot = sk->sk_prot;  	int amt = sk_mem_pages(size); -	int allocated; +	long allocated;  	sk->sk_forward_alloc += amt * SK_MEM_QUANTUM; -	allocated = atomic_add_return(amt, prot->memory_allocated); +	allocated = atomic_long_add_return(amt, prot->memory_allocated);  	/* Under limit. */  	if (allocated <= prot->sysctl_mem[0]) { @@ -1710,7 +1714,7 @@ suppress_allocation:  	/* Alas. Undo changes. */  	sk->sk_forward_alloc -= amt * SK_MEM_QUANTUM; -	atomic_sub(amt, prot->memory_allocated); +	atomic_long_sub(amt, prot->memory_allocated);  	return 0;  }  EXPORT_SYMBOL(__sk_mem_schedule); @@ -1723,12 +1727,12 @@ void __sk_mem_reclaim(struct sock *sk)  {  	struct proto *prot = sk->sk_prot; -	atomic_sub(sk->sk_forward_alloc >> SK_MEM_QUANTUM_SHIFT, +	atomic_long_sub(sk->sk_forward_alloc >> SK_MEM_QUANTUM_SHIFT,  		   prot->memory_allocated);  	sk->sk_forward_alloc &= SK_MEM_QUANTUM - 1;  	if (prot->memory_pressure && *prot->memory_pressure && -	    (atomic_read(prot->memory_allocated) < prot->sysctl_mem[0])) +	    (atomic_long_read(prot->memory_allocated) < prot->sysctl_mem[0]))  		*prot->memory_pressure = 0;  }  EXPORT_SYMBOL(__sk_mem_reclaim); @@ -2448,12 +2452,12 @@ static char proto_method_implemented(const void *method)  static void proto_seq_printf(struct seq_file *seq, struct proto *proto)  { -	seq_printf(seq, "%-9s %4u %6d  %6d   %-3s %6u   %-3s  %-10s " +	seq_printf(seq, "%-9s %4u %6d  %6ld   %-3s %6u   %-3s  %-10s "  			"%2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c\n",  		   proto->name,  		   proto->obj_size,  		   sock_prot_inuse_get(seq_file_net(seq), proto), -		   proto->memory_allocated != NULL ? atomic_read(proto->memory_allocated) : -1, +		   proto->memory_allocated != NULL ? atomic_long_read(proto->memory_allocated) : -1L,  		   proto->memory_pressure != NULL ? *proto->memory_pressure ? "yes" : "no" : "NI",  		   proto->max_header,  		   proto->slab == NULL ? "no" : "yes",  | 
