mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	net: snmp: kill various STATS_USER() helpers
In the old days (before linux-3.0), SNMP counters were duplicated,
one for user context, and one for BH context.
After commit 8f0ea0fe3a ("snmp: reduce percpu needs by 50%")
we have a single copy, and what really matters is preemption being
enabled or disabled, since we use this_cpu_inc() or __this_cpu_inc()
respectively.
We therefore kill SNMP_INC_STATS_USER(), SNMP_ADD_STATS_USER(),
NET_INC_STATS_USER(), NET_ADD_STATS_USER(), SCTP_INC_STATS_USER(),
SNMP_INC_STATS64_USER(), SNMP_ADD_STATS64_USER(), TCP_ADD_STATS_USER(),
UDP_INC_STATS_USER(), UDP6_INC_STATS_USER(), and XFRM_INC_STATS_USER()
Following patches will rename __BH helpers to make clear their
usage is not tied to BH being disabled.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									2995aea5b6
								
							
						
					
					
						commit
						6aef70a851
					
				
					 10 changed files with 59 additions and 78 deletions
				
			
		| 
						 | 
				
			
			@ -194,10 +194,8 @@ void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb,
 | 
			
		|||
#define IP_UPD_PO_STATS_BH(net, field, val) SNMP_UPD_PO_STATS64_BH((net)->mib.ip_statistics, field, val)
 | 
			
		||||
#define NET_INC_STATS(net, field)	SNMP_INC_STATS((net)->mib.net_statistics, field)
 | 
			
		||||
#define NET_INC_STATS_BH(net, field)	SNMP_INC_STATS_BH((net)->mib.net_statistics, field)
 | 
			
		||||
#define NET_INC_STATS_USER(net, field) 	SNMP_INC_STATS_USER((net)->mib.net_statistics, field)
 | 
			
		||||
#define NET_ADD_STATS(net, field, adnd)	SNMP_ADD_STATS((net)->mib.net_statistics, field, adnd)
 | 
			
		||||
#define NET_ADD_STATS_BH(net, field, adnd) SNMP_ADD_STATS_BH((net)->mib.net_statistics, field, adnd)
 | 
			
		||||
#define NET_ADD_STATS_USER(net, field, adnd) SNMP_ADD_STATS_USER((net)->mib.net_statistics, field, adnd)
 | 
			
		||||
 | 
			
		||||
u64 snmp_get_cpu_field(void __percpu *mib, int cpu, int offct);
 | 
			
		||||
unsigned long snmp_fold_field(void __percpu *mib, int offt);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -207,7 +207,6 @@ extern int sysctl_sctp_wmem[3];
 | 
			
		|||
/* SCTP SNMP MIB stats handlers */
 | 
			
		||||
#define SCTP_INC_STATS(net, field)      SNMP_INC_STATS((net)->sctp.sctp_statistics, field)
 | 
			
		||||
#define SCTP_INC_STATS_BH(net, field)   SNMP_INC_STATS_BH((net)->sctp.sctp_statistics, field)
 | 
			
		||||
#define SCTP_INC_STATS_USER(net, field) SNMP_INC_STATS_USER((net)->sctp.sctp_statistics, field)
 | 
			
		||||
#define SCTP_DEC_STATS(net, field)      SNMP_DEC_STATS((net)->sctp.sctp_statistics, field)
 | 
			
		||||
 | 
			
		||||
/* sctp mib definitions */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -126,9 +126,6 @@ struct linux_xfrm_mib {
 | 
			
		|||
#define SNMP_INC_STATS_BH(mib, field)	\
 | 
			
		||||
			__this_cpu_inc(mib->mibs[field])
 | 
			
		||||
 | 
			
		||||
#define SNMP_INC_STATS_USER(mib, field)	\
 | 
			
		||||
			this_cpu_inc(mib->mibs[field])
 | 
			
		||||
 | 
			
		||||
#define SNMP_INC_STATS_ATOMIC_LONG(mib, field)	\
 | 
			
		||||
			atomic_long_inc(&mib->mibs[field])
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -141,9 +138,6 @@ struct linux_xfrm_mib {
 | 
			
		|||
#define SNMP_ADD_STATS_BH(mib, field, addend)	\
 | 
			
		||||
			__this_cpu_add(mib->mibs[field], addend)
 | 
			
		||||
 | 
			
		||||
#define SNMP_ADD_STATS_USER(mib, field, addend)	\
 | 
			
		||||
			this_cpu_add(mib->mibs[field], addend)
 | 
			
		||||
 | 
			
		||||
#define SNMP_ADD_STATS(mib, field, addend)	\
 | 
			
		||||
			this_cpu_add(mib->mibs[field], addend)
 | 
			
		||||
#define SNMP_UPD_PO_STATS(mib, basefield, addend)	\
 | 
			
		||||
| 
						 | 
				
			
			@ -170,18 +164,14 @@ struct linux_xfrm_mib {
 | 
			
		|||
		u64_stats_update_end(&ptr->syncp);			\
 | 
			
		||||
	} while (0)
 | 
			
		||||
 | 
			
		||||
#define SNMP_ADD_STATS64_USER(mib, field, addend) 			\
 | 
			
		||||
#define SNMP_ADD_STATS64(mib, field, addend) 			\
 | 
			
		||||
	do {								\
 | 
			
		||||
		local_bh_disable();					\
 | 
			
		||||
		preempt_disable();					\
 | 
			
		||||
		SNMP_ADD_STATS64_BH(mib, field, addend);		\
 | 
			
		||||
		local_bh_enable();					\
 | 
			
		||||
		preempt_enable();					\
 | 
			
		||||
	} while (0)
 | 
			
		||||
 | 
			
		||||
#define SNMP_ADD_STATS64(mib, field, addend)				\
 | 
			
		||||
		SNMP_ADD_STATS64_USER(mib, field, addend)
 | 
			
		||||
 | 
			
		||||
#define SNMP_INC_STATS64_BH(mib, field) SNMP_ADD_STATS64_BH(mib, field, 1)
 | 
			
		||||
#define SNMP_INC_STATS64_USER(mib, field) SNMP_ADD_STATS64_USER(mib, field, 1)
 | 
			
		||||
#define SNMP_INC_STATS64(mib, field) SNMP_ADD_STATS64(mib, field, 1)
 | 
			
		||||
#define SNMP_UPD_PO_STATS64_BH(mib, basefield, addend)			\
 | 
			
		||||
	do {								\
 | 
			
		||||
| 
						 | 
				
			
			@ -194,17 +184,15 @@ struct linux_xfrm_mib {
 | 
			
		|||
	} while (0)
 | 
			
		||||
#define SNMP_UPD_PO_STATS64(mib, basefield, addend)			\
 | 
			
		||||
	do {								\
 | 
			
		||||
		local_bh_disable();					\
 | 
			
		||||
		preempt_disable();					\
 | 
			
		||||
		SNMP_UPD_PO_STATS64_BH(mib, basefield, addend);		\
 | 
			
		||||
		local_bh_enable();					\
 | 
			
		||||
		preempt_enable();					\
 | 
			
		||||
	} while (0)
 | 
			
		||||
#else
 | 
			
		||||
#define SNMP_INC_STATS64_BH(mib, field)		SNMP_INC_STATS_BH(mib, field)
 | 
			
		||||
#define SNMP_INC_STATS64_USER(mib, field)	SNMP_INC_STATS_USER(mib, field)
 | 
			
		||||
#define SNMP_INC_STATS64(mib, field)		SNMP_INC_STATS(mib, field)
 | 
			
		||||
#define SNMP_DEC_STATS64(mib, field)		SNMP_DEC_STATS(mib, field)
 | 
			
		||||
#define SNMP_ADD_STATS64_BH(mib, field, addend) SNMP_ADD_STATS_BH(mib, field, addend)
 | 
			
		||||
#define SNMP_ADD_STATS64_USER(mib, field, addend) SNMP_ADD_STATS_USER(mib, field, addend)
 | 
			
		||||
#define SNMP_ADD_STATS64(mib, field, addend)	SNMP_ADD_STATS(mib, field, addend)
 | 
			
		||||
#define SNMP_UPD_PO_STATS64(mib, basefield, addend) SNMP_UPD_PO_STATS(mib, basefield, addend)
 | 
			
		||||
#define SNMP_UPD_PO_STATS64_BH(mib, basefield, addend) SNMP_UPD_PO_STATS_BH(mib, basefield, addend)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -334,7 +334,6 @@ extern struct proto tcp_prot;
 | 
			
		|||
#define TCP_INC_STATS(net, field)	SNMP_INC_STATS((net)->mib.tcp_statistics, field)
 | 
			
		||||
#define TCP_INC_STATS_BH(net, field)	SNMP_INC_STATS_BH((net)->mib.tcp_statistics, field)
 | 
			
		||||
#define TCP_DEC_STATS(net, field)	SNMP_DEC_STATS((net)->mib.tcp_statistics, field)
 | 
			
		||||
#define TCP_ADD_STATS_USER(net, field, val) SNMP_ADD_STATS_USER((net)->mib.tcp_statistics, field, val)
 | 
			
		||||
#define TCP_ADD_STATS(net, field, val)	SNMP_ADD_STATS((net)->mib.tcp_statistics, field, val)
 | 
			
		||||
 | 
			
		||||
void tcp_tasklet_init(void);
 | 
			
		||||
| 
						 | 
				
			
			@ -1298,10 +1297,10 @@ bool tcp_oow_rate_limited(struct net *net, const struct sk_buff *skb,
 | 
			
		|||
static inline void tcp_mib_init(struct net *net)
 | 
			
		||||
{
 | 
			
		||||
	/* See RFC 2012 */
 | 
			
		||||
	TCP_ADD_STATS_USER(net, TCP_MIB_RTOALGORITHM, 1);
 | 
			
		||||
	TCP_ADD_STATS_USER(net, TCP_MIB_RTOMIN, TCP_RTO_MIN*1000/HZ);
 | 
			
		||||
	TCP_ADD_STATS_USER(net, TCP_MIB_RTOMAX, TCP_RTO_MAX*1000/HZ);
 | 
			
		||||
	TCP_ADD_STATS_USER(net, TCP_MIB_MAXCONN, -1);
 | 
			
		||||
	TCP_ADD_STATS(net, TCP_MIB_RTOALGORITHM, 1);
 | 
			
		||||
	TCP_ADD_STATS(net, TCP_MIB_RTOMIN, TCP_RTO_MIN*1000/HZ);
 | 
			
		||||
	TCP_ADD_STATS(net, TCP_MIB_RTOMAX, TCP_RTO_MAX*1000/HZ);
 | 
			
		||||
	TCP_ADD_STATS(net, TCP_MIB_MAXCONN, -1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* from STCP */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -289,20 +289,20 @@ struct sock *udp6_lib_lookup_skb(struct sk_buff *skb,
 | 
			
		|||
/*
 | 
			
		||||
 * 	SNMP statistics for UDP and UDP-Lite
 | 
			
		||||
 */
 | 
			
		||||
#define UDP_INC_STATS_USER(net, field, is_udplite)	      do { \
 | 
			
		||||
	if (is_udplite) SNMP_INC_STATS_USER((net)->mib.udplite_statistics, field);       \
 | 
			
		||||
	else		SNMP_INC_STATS_USER((net)->mib.udp_statistics, field);  }  while(0)
 | 
			
		||||
#define UDP_INC_STATS(net, field, is_udplite)		      do { \
 | 
			
		||||
	if (is_udplite) SNMP_INC_STATS((net)->mib.udplite_statistics, field);       \
 | 
			
		||||
	else		SNMP_INC_STATS((net)->mib.udp_statistics, field);  }  while(0)
 | 
			
		||||
#define UDP_INC_STATS_BH(net, field, is_udplite) 	      do { \
 | 
			
		||||
	if (is_udplite) SNMP_INC_STATS_BH((net)->mib.udplite_statistics, field);         \
 | 
			
		||||
	else		SNMP_INC_STATS_BH((net)->mib.udp_statistics, field);    }  while(0)
 | 
			
		||||
 | 
			
		||||
#define UDP6_INC_STATS_BH(net, field, is_udplite) 	    do { \
 | 
			
		||||
#define UDP6_INC_STATS_BH(net, field, is_udplite)	    do { \
 | 
			
		||||
	if (is_udplite) SNMP_INC_STATS_BH((net)->mib.udplite_stats_in6, field);\
 | 
			
		||||
	else		SNMP_INC_STATS_BH((net)->mib.udp_stats_in6, field);  \
 | 
			
		||||
} while(0)
 | 
			
		||||
#define UDP6_INC_STATS_USER(net, field, __lite)		    do { \
 | 
			
		||||
	if (__lite) SNMP_INC_STATS_USER((net)->mib.udplite_stats_in6, field);  \
 | 
			
		||||
	else	    SNMP_INC_STATS_USER((net)->mib.udp_stats_in6, field);      \
 | 
			
		||||
#define UDP6_INC_STATS(net, field, __lite)		    do { \
 | 
			
		||||
	if (__lite) SNMP_INC_STATS((net)->mib.udplite_stats_in6, field);  \
 | 
			
		||||
	else	    SNMP_INC_STATS((net)->mib.udp_stats_in6, field);      \
 | 
			
		||||
} while(0)
 | 
			
		||||
 | 
			
		||||
#if IS_ENABLED(CONFIG_IPV6)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,11 +46,9 @@
 | 
			
		|||
#ifdef CONFIG_XFRM_STATISTICS
 | 
			
		||||
#define XFRM_INC_STATS(net, field)	SNMP_INC_STATS((net)->mib.xfrm_statistics, field)
 | 
			
		||||
#define XFRM_INC_STATS_BH(net, field)	SNMP_INC_STATS_BH((net)->mib.xfrm_statistics, field)
 | 
			
		||||
#define XFRM_INC_STATS_USER(net, field)	SNMP_INC_STATS_USER((net)-mib.xfrm_statistics, field)
 | 
			
		||||
#else
 | 
			
		||||
#define XFRM_INC_STATS(net, field)	((void)(net))
 | 
			
		||||
#define XFRM_INC_STATS_BH(net, field)	((void)(net))
 | 
			
		||||
#define XFRM_INC_STATS_USER(net, field)	((void)(net))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1443,7 +1443,7 @@ static void tcp_prequeue_process(struct sock *sk)
 | 
			
		|||
	struct sk_buff *skb;
 | 
			
		||||
	struct tcp_sock *tp = tcp_sk(sk);
 | 
			
		||||
 | 
			
		||||
	NET_INC_STATS_USER(sock_net(sk), LINUX_MIB_TCPPREQUEUED);
 | 
			
		||||
	NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPPREQUEUED);
 | 
			
		||||
 | 
			
		||||
	/* RX process wants to run with disabled BHs, though it is not
 | 
			
		||||
	 * necessary */
 | 
			
		||||
| 
						 | 
				
			
			@ -1777,7 +1777,7 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
 | 
			
		|||
 | 
			
		||||
			chunk = len - tp->ucopy.len;
 | 
			
		||||
			if (chunk != 0) {
 | 
			
		||||
				NET_ADD_STATS_USER(sock_net(sk), LINUX_MIB_TCPDIRECTCOPYFROMBACKLOG, chunk);
 | 
			
		||||
				NET_ADD_STATS(sock_net(sk), LINUX_MIB_TCPDIRECTCOPYFROMBACKLOG, chunk);
 | 
			
		||||
				len -= chunk;
 | 
			
		||||
				copied += chunk;
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -1789,7 +1789,7 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
 | 
			
		|||
 | 
			
		||||
				chunk = len - tp->ucopy.len;
 | 
			
		||||
				if (chunk != 0) {
 | 
			
		||||
					NET_ADD_STATS_USER(sock_net(sk), LINUX_MIB_TCPDIRECTCOPYFROMPREQUEUE, chunk);
 | 
			
		||||
					NET_ADD_STATS(sock_net(sk), LINUX_MIB_TCPDIRECTCOPYFROMPREQUEUE, chunk);
 | 
			
		||||
					len -= chunk;
 | 
			
		||||
					copied += chunk;
 | 
			
		||||
				}
 | 
			
		||||
| 
						 | 
				
			
			@ -1875,7 +1875,7 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
 | 
			
		|||
			tcp_prequeue_process(sk);
 | 
			
		||||
 | 
			
		||||
			if (copied > 0 && (chunk = len - tp->ucopy.len) != 0) {
 | 
			
		||||
				NET_ADD_STATS_USER(sock_net(sk), LINUX_MIB_TCPDIRECTCOPYFROMPREQUEUE, chunk);
 | 
			
		||||
				NET_ADD_STATS(sock_net(sk), LINUX_MIB_TCPDIRECTCOPYFROMPREQUEUE, chunk);
 | 
			
		||||
				len -= chunk;
 | 
			
		||||
				copied += chunk;
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -2065,13 +2065,13 @@ void tcp_close(struct sock *sk, long timeout)
 | 
			
		|||
		sk->sk_prot->disconnect(sk, 0);
 | 
			
		||||
	} else if (data_was_unread) {
 | 
			
		||||
		/* Unread data was tossed, zap the connection. */
 | 
			
		||||
		NET_INC_STATS_USER(sock_net(sk), LINUX_MIB_TCPABORTONCLOSE);
 | 
			
		||||
		NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONCLOSE);
 | 
			
		||||
		tcp_set_state(sk, TCP_CLOSE);
 | 
			
		||||
		tcp_send_active_reset(sk, sk->sk_allocation);
 | 
			
		||||
	} else if (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime) {
 | 
			
		||||
		/* Check zero linger _after_ checking for unread data. */
 | 
			
		||||
		sk->sk_prot->disconnect(sk, 0);
 | 
			
		||||
		NET_INC_STATS_USER(sock_net(sk), LINUX_MIB_TCPABORTONDATA);
 | 
			
		||||
		NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONDATA);
 | 
			
		||||
	} else if (tcp_close_state(sk)) {
 | 
			
		||||
		/* We FIN if the application ate all the data before
 | 
			
		||||
		 * zapping the connection.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -882,13 +882,13 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4)
 | 
			
		|||
	err = ip_send_skb(sock_net(sk), skb);
 | 
			
		||||
	if (err) {
 | 
			
		||||
		if (err == -ENOBUFS && !inet->recverr) {
 | 
			
		||||
			UDP_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
					   UDP_MIB_SNDBUFERRORS, is_udplite);
 | 
			
		||||
			UDP_INC_STATS(sock_net(sk),
 | 
			
		||||
				      UDP_MIB_SNDBUFERRORS, is_udplite);
 | 
			
		||||
			err = 0;
 | 
			
		||||
		}
 | 
			
		||||
	} else
 | 
			
		||||
		UDP_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
				   UDP_MIB_OUTDATAGRAMS, is_udplite);
 | 
			
		||||
		UDP_INC_STATS(sock_net(sk),
 | 
			
		||||
			      UDP_MIB_OUTDATAGRAMS, is_udplite);
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1157,8 +1157,8 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
 | 
			
		|||
	 * seems like overkill.
 | 
			
		||||
	 */
 | 
			
		||||
	if (err == -ENOBUFS || test_bit(SOCK_NOSPACE, &sk->sk_socket->flags)) {
 | 
			
		||||
		UDP_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
				UDP_MIB_SNDBUFERRORS, is_udplite);
 | 
			
		||||
		UDP_INC_STATS(sock_net(sk),
 | 
			
		||||
			      UDP_MIB_SNDBUFERRORS, is_udplite);
 | 
			
		||||
	}
 | 
			
		||||
	return err;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1352,16 +1352,16 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock,
 | 
			
		|||
		trace_kfree_skb(skb, udp_recvmsg);
 | 
			
		||||
		if (!peeked) {
 | 
			
		||||
			atomic_inc(&sk->sk_drops);
 | 
			
		||||
			UDP_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
					   UDP_MIB_INERRORS, is_udplite);
 | 
			
		||||
			UDP_INC_STATS(sock_net(sk),
 | 
			
		||||
				      UDP_MIB_INERRORS, is_udplite);
 | 
			
		||||
		}
 | 
			
		||||
		skb_free_datagram_locked(sk, skb);
 | 
			
		||||
		return err;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!peeked)
 | 
			
		||||
		UDP_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
				UDP_MIB_INDATAGRAMS, is_udplite);
 | 
			
		||||
		UDP_INC_STATS(sock_net(sk),
 | 
			
		||||
			      UDP_MIB_INDATAGRAMS, is_udplite);
 | 
			
		||||
 | 
			
		||||
	sock_recv_ts_and_drops(msg, sk, skb);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1386,8 +1386,8 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock,
 | 
			
		|||
csum_copy_err:
 | 
			
		||||
	slow = lock_sock_fast(sk);
 | 
			
		||||
	if (!skb_kill_datagram(sk, skb, flags)) {
 | 
			
		||||
		UDP_INC_STATS_USER(sock_net(sk), UDP_MIB_CSUMERRORS, is_udplite);
 | 
			
		||||
		UDP_INC_STATS_USER(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
 | 
			
		||||
		UDP_INC_STATS(sock_net(sk), UDP_MIB_CSUMERRORS, is_udplite);
 | 
			
		||||
		UDP_INC_STATS(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
 | 
			
		||||
	}
 | 
			
		||||
	unlock_sock_fast(sk, slow);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -423,24 +423,22 @@ int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
 | 
			
		|||
		if (!peeked) {
 | 
			
		||||
			atomic_inc(&sk->sk_drops);
 | 
			
		||||
			if (is_udp4)
 | 
			
		||||
				UDP_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
						   UDP_MIB_INERRORS,
 | 
			
		||||
						   is_udplite);
 | 
			
		||||
				UDP_INC_STATS(sock_net(sk), UDP_MIB_INERRORS,
 | 
			
		||||
					      is_udplite);
 | 
			
		||||
			else
 | 
			
		||||
				UDP6_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
						    UDP_MIB_INERRORS,
 | 
			
		||||
						    is_udplite);
 | 
			
		||||
				UDP6_INC_STATS(sock_net(sk), UDP_MIB_INERRORS,
 | 
			
		||||
					       is_udplite);
 | 
			
		||||
		}
 | 
			
		||||
		skb_free_datagram_locked(sk, skb);
 | 
			
		||||
		return err;
 | 
			
		||||
	}
 | 
			
		||||
	if (!peeked) {
 | 
			
		||||
		if (is_udp4)
 | 
			
		||||
			UDP_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
					UDP_MIB_INDATAGRAMS, is_udplite);
 | 
			
		||||
			UDP_INC_STATS(sock_net(sk), UDP_MIB_INDATAGRAMS,
 | 
			
		||||
				      is_udplite);
 | 
			
		||||
		else
 | 
			
		||||
			UDP6_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
					UDP_MIB_INDATAGRAMS, is_udplite);
 | 
			
		||||
			UDP6_INC_STATS(sock_net(sk), UDP_MIB_INDATAGRAMS,
 | 
			
		||||
				       is_udplite);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sock_recv_ts_and_drops(msg, sk, skb);
 | 
			
		||||
| 
						 | 
				
			
			@ -487,15 +485,15 @@ int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
 | 
			
		|||
	slow = lock_sock_fast(sk);
 | 
			
		||||
	if (!skb_kill_datagram(sk, skb, flags)) {
 | 
			
		||||
		if (is_udp4) {
 | 
			
		||||
			UDP_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
					UDP_MIB_CSUMERRORS, is_udplite);
 | 
			
		||||
			UDP_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
					UDP_MIB_INERRORS, is_udplite);
 | 
			
		||||
			UDP_INC_STATS(sock_net(sk),
 | 
			
		||||
				      UDP_MIB_CSUMERRORS, is_udplite);
 | 
			
		||||
			UDP_INC_STATS(sock_net(sk),
 | 
			
		||||
				      UDP_MIB_INERRORS, is_udplite);
 | 
			
		||||
		} else {
 | 
			
		||||
			UDP6_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
					UDP_MIB_CSUMERRORS, is_udplite);
 | 
			
		||||
			UDP6_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
					UDP_MIB_INERRORS, is_udplite);
 | 
			
		||||
			UDP6_INC_STATS(sock_net(sk),
 | 
			
		||||
				       UDP_MIB_CSUMERRORS, is_udplite);
 | 
			
		||||
			UDP6_INC_STATS(sock_net(sk),
 | 
			
		||||
				       UDP_MIB_INERRORS, is_udplite);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	unlock_sock_fast(sk, slow);
 | 
			
		||||
| 
						 | 
				
			
			@ -1015,13 +1013,14 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6)
 | 
			
		|||
	err = ip6_send_skb(skb);
 | 
			
		||||
	if (err) {
 | 
			
		||||
		if (err == -ENOBUFS && !inet6_sk(sk)->recverr) {
 | 
			
		||||
			UDP6_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
					    UDP_MIB_SNDBUFERRORS, is_udplite);
 | 
			
		||||
			UDP6_INC_STATS(sock_net(sk),
 | 
			
		||||
				       UDP_MIB_SNDBUFERRORS, is_udplite);
 | 
			
		||||
			err = 0;
 | 
			
		||||
		}
 | 
			
		||||
	} else
 | 
			
		||||
		UDP6_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
				    UDP_MIB_OUTDATAGRAMS, is_udplite);
 | 
			
		||||
	} else {
 | 
			
		||||
		UDP6_INC_STATS(sock_net(sk),
 | 
			
		||||
			       UDP_MIB_OUTDATAGRAMS, is_udplite);
 | 
			
		||||
	}
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1342,8 +1341,8 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
 | 
			
		|||
	 * seems like overkill.
 | 
			
		||||
	 */
 | 
			
		||||
	if (err == -ENOBUFS || test_bit(SOCK_NOSPACE, &sk->sk_socket->flags)) {
 | 
			
		||||
		UDP6_INC_STATS_USER(sock_net(sk),
 | 
			
		||||
				UDP_MIB_SNDBUFERRORS, is_udplite);
 | 
			
		||||
		UDP6_INC_STATS(sock_net(sk),
 | 
			
		||||
			       UDP_MIB_SNDBUFERRORS, is_udplite);
 | 
			
		||||
	}
 | 
			
		||||
	return err;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -239,7 +239,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc,
 | 
			
		|||
	offset = 0;
 | 
			
		||||
 | 
			
		||||
	if ((whole > 1) || (whole && over))
 | 
			
		||||
		SCTP_INC_STATS_USER(sock_net(asoc->base.sk), SCTP_MIB_FRAGUSRMSGS);
 | 
			
		||||
		SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_FRAGUSRMSGS);
 | 
			
		||||
 | 
			
		||||
	/* Create chunks for all the full sized DATA chunks. */
 | 
			
		||||
	for (i = 0, len = first_len; i < whole; i++) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue