diff options
Diffstat (limited to 'net/core/sock.c')
| -rw-r--r-- | net/core/sock.c | 89 | 
1 files changed, 57 insertions, 32 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index a6000fbad294..8a146cfcc366 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -326,17 +326,6 @@ int __sk_backlog_rcv(struct sock *sk, struct sk_buff *skb)  }  EXPORT_SYMBOL(__sk_backlog_rcv); -#if defined(CONFIG_CGROUPS) -#if !defined(CONFIG_NET_CLS_CGROUP) -int net_cls_subsys_id = -1; -EXPORT_SYMBOL_GPL(net_cls_subsys_id); -#endif -#if !defined(CONFIG_NETPRIO_CGROUP) -int net_prio_subsys_id = -1; -EXPORT_SYMBOL_GPL(net_prio_subsys_id); -#endif -#endif -  static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen)  {  	struct timeval tv; @@ -869,8 +858,8 @@ void cred_to_ucred(struct pid *pid, const struct cred *cred,  	if (cred) {  		struct user_namespace *current_ns = current_user_ns(); -		ucred->uid = from_kuid(current_ns, cred->euid); -		ucred->gid = from_kgid(current_ns, cred->egid); +		ucred->uid = from_kuid_munged(current_ns, cred->euid); +		ucred->gid = from_kgid_munged(current_ns, cred->egid);  	}  }  EXPORT_SYMBOL_GPL(cred_to_ucred); @@ -1224,6 +1213,7 @@ static void sk_prot_free(struct proto *prot, struct sock *sk)  }  #ifdef CONFIG_CGROUPS +#if IS_ENABLED(CONFIG_NET_CLS_CGROUP)  void sock_update_classid(struct sock *sk)  {  	u32 classid; @@ -1231,11 +1221,13 @@ void sock_update_classid(struct sock *sk)  	rcu_read_lock();  /* doing current task, which cannot vanish. */  	classid = task_cls_classid(current);  	rcu_read_unlock(); -	if (classid && classid != sk->sk_classid) +	if (classid != sk->sk_classid)  		sk->sk_classid = classid;  }  EXPORT_SYMBOL(sock_update_classid); +#endif +#if IS_ENABLED(CONFIG_NETPRIO_CGROUP)  void sock_update_netprioidx(struct sock *sk, struct task_struct *task)  {  	if (in_interrupt()) @@ -1245,6 +1237,7 @@ void sock_update_netprioidx(struct sock *sk, struct task_struct *task)  }  EXPORT_SYMBOL_GPL(sock_update_netprioidx);  #endif +#endif  /**   *	sk_alloc - All socket objects are allocated here @@ -1465,19 +1458,6 @@ void sk_setup_caps(struct sock *sk, struct dst_entry *dst)  }  EXPORT_SYMBOL_GPL(sk_setup_caps); -void __init sk_init(void) -{ -	if (totalram_pages <= 4096) { -		sysctl_wmem_max = 32767; -		sysctl_rmem_max = 32767; -		sysctl_wmem_default = 32767; -		sysctl_rmem_default = 32767; -	} else if (totalram_pages >= 131072) { -		sysctl_wmem_max = 131071; -		sysctl_rmem_max = 131071; -	} -} -  /*   *	Simple resource managers for sockets.   */ @@ -1535,12 +1515,12 @@ void sock_edemux(struct sk_buff *skb)  }  EXPORT_SYMBOL(sock_edemux); -int sock_i_uid(struct sock *sk) +kuid_t sock_i_uid(struct sock *sk)  { -	int uid; +	kuid_t uid;  	read_lock_bh(&sk->sk_callback_lock); -	uid = sk->sk_socket ? SOCK_INODE(sk->sk_socket)->i_uid : 0; +	uid = sk->sk_socket ? SOCK_INODE(sk->sk_socket)->i_uid : GLOBAL_ROOT_UID;  	read_unlock_bh(&sk->sk_callback_lock);  	return uid;  } @@ -1745,6 +1725,45 @@ struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size,  }  EXPORT_SYMBOL(sock_alloc_send_skb); +/* On 32bit arches, an skb frag is limited to 2^15 */ +#define SKB_FRAG_PAGE_ORDER	get_order(32768) + +bool sk_page_frag_refill(struct sock *sk, struct page_frag *pfrag) +{ +	int order; + +	if (pfrag->page) { +		if (atomic_read(&pfrag->page->_count) == 1) { +			pfrag->offset = 0; +			return true; +		} +		if (pfrag->offset < pfrag->size) +			return true; +		put_page(pfrag->page); +	} + +	/* We restrict high order allocations to users that can afford to wait */ +	order = (sk->sk_allocation & __GFP_WAIT) ? SKB_FRAG_PAGE_ORDER : 0; + +	do { +		gfp_t gfp = sk->sk_allocation; + +		if (order) +			gfp |= __GFP_COMP | __GFP_NOWARN; +		pfrag->page = alloc_pages(gfp, order); +		if (likely(pfrag->page)) { +			pfrag->offset = 0; +			pfrag->size = PAGE_SIZE << order; +			return true; +		} +	} while (--order >= 0); + +	sk_enter_memory_pressure(sk); +	sk_stream_moderate_sndbuf(sk); +	return false; +} +EXPORT_SYMBOL(sk_page_frag_refill); +  static void __lock_sock(struct sock *sk)  	__releases(&sk->sk_lock.slock)  	__acquires(&sk->sk_lock.slock) @@ -2174,8 +2193,8 @@ void sock_init_data(struct socket *sock, struct sock *sk)  	sk->sk_error_report	=	sock_def_error_report;  	sk->sk_destruct		=	sock_def_destruct; -	sk->sk_sndmsg_page	=	NULL; -	sk->sk_sndmsg_off	=	0; +	sk->sk_frag.page	=	NULL; +	sk->sk_frag.offset	=	0;  	sk->sk_peek_off		=	-1;  	sk->sk_peer_pid 	=	NULL; @@ -2418,6 +2437,12 @@ void sk_common_release(struct sock *sk)  	xfrm_sk_free_policy(sk);  	sk_refcnt_debug_release(sk); + +	if (sk->sk_frag.page) { +		put_page(sk->sk_frag.page); +		sk->sk_frag.page = NULL; +	} +  	sock_put(sk);  }  EXPORT_SYMBOL(sk_common_release);  | 
