diff options
Diffstat (limited to 'include/net/sock.h')
| -rw-r--r-- | include/net/sock.h | 112 | 
1 files changed, 74 insertions, 38 deletions
| diff --git a/include/net/sock.h b/include/net/sock.h index d47e9658da28..ff9b508d9c5f 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -56,13 +56,13 @@  #include <linux/wait.h>  #include <linux/cgroup-defs.h>  #include <linux/rbtree.h> -#include <linux/filter.h>  #include <linux/rculist_nulls.h>  #include <linux/poll.h>  #include <linux/sockptr.h>  #include <linux/indirect_call_wrapper.h>  #include <linux/atomic.h>  #include <linux/refcount.h> +#include <linux/llist.h>  #include <net/dst.h>  #include <net/checksum.h>  #include <net/tcp_states.h> @@ -248,6 +248,7 @@ struct sock_common {  };  struct bpf_local_storage; +struct sk_filter;  /**    *	struct sock - network layer representation of sockets @@ -284,15 +285,14 @@ struct bpf_local_storage;    *	@sk_no_check_tx: %SO_NO_CHECK setting, set checksum in TX packets    *	@sk_no_check_rx: allow zero checksum in RX packets    *	@sk_route_caps: route capabilities (e.g. %NETIF_F_TSO) -  *	@sk_route_nocaps: forbidden route capabilities (e.g NETIF_F_GSO_MASK) -  *	@sk_route_forced_caps: static, forced route capabilities -  *		(set in tcp_init_sock()) +  *	@sk_gso_disabled: if set, NETIF_F_GSO_MASK is forbidden.    *	@sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4)    *	@sk_gso_max_size: Maximum GSO segment size to build    *	@sk_gso_max_segs: Maximum number of GSO segments    *	@sk_pacing_shift: scaling factor for TCP Small Queues    *	@sk_lingertime: %SO_LINGER l_linger setting    *	@sk_backlog: always used with the per-socket spinlock held +  *	@defer_list: head of llist storing skbs to be freed    *	@sk_callback_lock: used with the callbacks in the end of this struct    *	@sk_error_queue: rarely used    *	@sk_prot_creator: sk_prot of original sock creator (see ipv6_setsockopt, @@ -350,6 +350,7 @@ struct bpf_local_storage;    *	@sk_txtime_deadline_mode: set deadline mode for SO_TXTIME    *	@sk_txtime_report_errors: set report errors mode for SO_TXTIME    *	@sk_txtime_unused: unused txtime flags +  *	@ns_tracker: tracker for netns reference    */  struct sock {  	/* @@ -391,6 +392,11 @@ struct sock {  #define sk_flags		__sk_common.skc_flags  #define sk_rxhash		__sk_common.skc_rxhash +	/* early demux fields */ +	struct dst_entry __rcu	*sk_rx_dst; +	int			sk_rx_dst_ifindex; +	u32			sk_rx_dst_cookie; +  	socket_lock_t		sk_lock;  	atomic_t		sk_drops;  	int			sk_rcvlowat; @@ -410,6 +416,8 @@ struct sock {  		struct sk_buff	*head;  		struct sk_buff	*tail;  	} sk_backlog; +	struct llist_head defer_list; +  #define sk_rmem_alloc sk_backlog.rmem_alloc  	int			sk_forward_alloc; @@ -431,9 +439,6 @@ struct sock {  #ifdef CONFIG_XFRM  	struct xfrm_policy __rcu *sk_policy[2];  #endif -	struct dst_entry __rcu	*sk_rx_dst; -	int			sk_rx_dst_ifindex; -	u32			sk_rx_dst_cookie;  	struct dst_entry __rcu	*sk_dst_cache;  	atomic_t		sk_omem_alloc; @@ -460,8 +465,6 @@ struct sock {  	unsigned long		sk_max_pacing_rate;  	struct page_frag	sk_frag;  	netdev_features_t	sk_route_caps; -	netdev_features_t	sk_route_nocaps; -	netdev_features_t	sk_route_forced_caps;  	int			sk_gso_type;  	unsigned int		sk_gso_max_size;  	gfp_t			sk_allocation; @@ -471,7 +474,7 @@ struct sock {  	 * Because of non atomicity rules, all  	 * changes are protected by socket lock.  	 */ -	u8			sk_padding : 1, +	u8			sk_gso_disabled : 1,  				sk_kern_sock : 1,  				sk_no_check_tx : 1,  				sk_no_check_rx : 1, @@ -493,6 +496,7 @@ struct sock {  	u16			sk_busy_poll_budget;  #endif  	spinlock_t		sk_peer_lock; +	int			sk_bind_phc;  	struct pid		*sk_peer_pid;  	const struct cred	*sk_peer_cred; @@ -502,7 +506,6 @@ struct sock {  	seqlock_t		sk_stamp_seq;  #endif  	u16			sk_tsflags; -	int			sk_bind_phc;  	u8			sk_shutdown;  	u32			sk_tskey;  	atomic_t		sk_zckey; @@ -536,6 +539,7 @@ struct sock {  	struct bpf_local_storage __rcu	*sk_bpf_storage;  #endif  	struct rcu_head		sk_rcu; +	netns_tracker		ns_tracker;  };  enum sk_pacing { @@ -1022,12 +1026,18 @@ static inline __must_check int sk_add_backlog(struct sock *sk, struct sk_buff *s  int __sk_backlog_rcv(struct sock *sk, struct sk_buff *skb); +INDIRECT_CALLABLE_DECLARE(int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)); +INDIRECT_CALLABLE_DECLARE(int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)); +  static inline int sk_backlog_rcv(struct sock *sk, struct sk_buff *skb)  {  	if (sk_memalloc_socks() && skb_pfmemalloc(skb))  		return __sk_backlog_rcv(sk, skb); -	return sk->sk_backlog_rcv(sk, skb); +	return INDIRECT_CALL_INET(sk->sk_backlog_rcv, +				  tcp_v6_do_rcv, +				  tcp_v4_do_rcv, +				  sk, skb);  }  static inline void sk_incoming_cpu_update(struct sock *sk) @@ -1199,6 +1209,7 @@ struct proto {  	void			(*unhash)(struct sock *sk);  	void			(*rehash)(struct sock *sk);  	int			(*get_port)(struct sock *sk, unsigned short snum); +	void			(*put_port)(struct sock *sk);  #ifdef CONFIG_BPF_SYSCALL  	int			(*psock_update_sk_prot)(struct sock *sk,  							struct sk_psock *psock, @@ -1210,7 +1221,9 @@ struct proto {  	unsigned int		inuse_idx;  #endif +#if IS_ENABLED(CONFIG_MPTCP)  	int			(*forward_alloc_get)(const struct sock *sk); +#endif  	bool			(*stream_memory_free)(const struct sock *sk, int wake);  	bool			(*sock_is_readable)(struct sock *sk); @@ -1299,10 +1312,11 @@ INDIRECT_CALLABLE_DECLARE(bool tcp_stream_memory_free(const struct sock *sk, int  static inline int sk_forward_alloc_get(const struct sock *sk)  { -	if (!sk->sk_prot->forward_alloc_get) -		return sk->sk_forward_alloc; - -	return sk->sk_prot->forward_alloc_get(sk); +#if IS_ENABLED(CONFIG_MPTCP) +	if (sk->sk_prot->forward_alloc_get) +		return sk->sk_prot->forward_alloc_get(sk); +#endif +	return sk->sk_forward_alloc;  }  static inline bool __sk_stream_memory_free(const struct sock *sk, int wake) @@ -1419,13 +1433,32 @@ proto_memory_pressure(struct proto *prot)  #ifdef CONFIG_PROC_FS -/* Called with local bh disabled */ -void sock_prot_inuse_add(struct net *net, struct proto *prot, int inc); +#define PROTO_INUSE_NR	64	/* should be enough for the first time */ +struct prot_inuse { +	int all; +	int val[PROTO_INUSE_NR]; +}; + +static inline void sock_prot_inuse_add(const struct net *net, +				       const struct proto *prot, int val) +{ +	this_cpu_add(net->core.prot_inuse->val[prot->inuse_idx], val); +} + +static inline void sock_inuse_add(const struct net *net, int val) +{ +	this_cpu_add(net->core.prot_inuse->all, val); +} +  int sock_prot_inuse_get(struct net *net, struct proto *proto);  int sock_inuse_get(struct net *net);  #else -static inline void sock_prot_inuse_add(struct net *net, struct proto *prot, -		int inc) +static inline void sock_prot_inuse_add(const struct net *net, +				       const struct proto *prot, int val) +{ +} + +static inline void sock_inuse_add(const struct net *net, int val)  {  }  #endif @@ -1603,16 +1636,6 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)  		__sk_mem_reclaim(sk, SK_RECLAIM_CHUNK);  } -static inline void sock_release_ownership(struct sock *sk) -{ -	if (sk->sk_lock.owned) { -		sk->sk_lock.owned = 0; - -		/* The sk_lock has mutex_unlock() semantics: */ -		mutex_release(&sk->sk_lock.dep_map, _RET_IP_); -	} -} -  /*   * Macro so as to not evaluate some arguments when   * lockdep is not enabled. @@ -1739,12 +1762,23 @@ static inline bool sock_owned_by_user_nocheck(const struct sock *sk)  	return sk->sk_lock.owned;  } +static inline void sock_release_ownership(struct sock *sk) +{ +	if (sock_owned_by_user_nocheck(sk)) { +		sk->sk_lock.owned = 0; + +		/* The sk_lock has mutex_unlock() semantics: */ +		mutex_release(&sk->sk_lock.dep_map, _RET_IP_); +	} +} +  /* no reclassification while locks are held */  static inline bool sock_allow_reclassification(const struct sock *csk)  {  	struct sock *sk = (struct sock *)csk; -	return !sk->sk_lock.owned && !spin_is_locked(&sk->sk_lock.slock); +	return !sock_owned_by_user_nocheck(sk) && +		!spin_is_locked(&sk->sk_lock.slock);  }  struct sock *sk_alloc(struct net *net, int family, gfp_t priority, @@ -2118,13 +2152,10 @@ static inline void sock_confirm_neigh(struct sk_buff *skb, struct neighbour *n)  {  	if (skb_get_dst_pending_confirm(skb)) {  		struct sock *sk = skb->sk; -		unsigned long now = jiffies; -		/* avoid dirtying neighbour */ -		if (READ_ONCE(n->confirmed) != now) -			WRITE_ONCE(n->confirmed, now);  		if (sk && READ_ONCE(sk->sk_dst_pending_confirm))  			WRITE_ONCE(sk->sk_dst_pending_confirm, 0); +		neigh_confirm(n);  	}  } @@ -2137,10 +2168,10 @@ static inline bool sk_can_gso(const struct sock *sk)  void sk_setup_caps(struct sock *sk, struct dst_entry *dst); -static inline void sk_nocaps_add(struct sock *sk, netdev_features_t flags) +static inline void sk_gso_disable(struct sock *sk)  { -	sk->sk_route_nocaps |= flags; -	sk->sk_route_caps &= ~flags; +	sk->sk_gso_disabled = 1; +	sk->sk_route_caps &= ~NETIF_F_GSO_MASK;  }  static inline int skb_do_copy_data_nocache(struct sock *sk, struct sk_buff *skb, @@ -2654,6 +2685,11 @@ static inline void skb_setup_tx_timestamp(struct sk_buff *skb, __u16 tsflags)  			   &skb_shinfo(skb)->tskey);  } +static inline bool sk_is_tcp(const struct sock *sk) +{ +	return sk->sk_type == SOCK_STREAM && sk->sk_protocol == IPPROTO_TCP; +} +  /**   * sk_eat_skb - Release a skb if it is no longer needed   * @sk: socket to eat this skb from |