diff options
Diffstat (limited to 'net/l2tp/l2tp_netlink.c')
| -rw-r--r-- | net/l2tp/l2tp_netlink.c | 72 | 
1 files changed, 28 insertions, 44 deletions
diff --git a/net/l2tp/l2tp_netlink.c b/net/l2tp/l2tp_netlink.c index c1bab22db85..0825ff26e11 100644 --- a/net/l2tp/l2tp_netlink.c +++ b/net/l2tp/l2tp_netlink.c @@ -246,8 +246,6 @@ static int l2tp_nl_tunnel_send(struct sk_buff *skb, u32 portid, u32 seq, int fla  #if IS_ENABLED(CONFIG_IPV6)  	struct ipv6_pinfo *np = NULL;  #endif -	struct l2tp_stats stats; -	unsigned int start;  	hdr = genlmsg_put(skb, portid, seq, &l2tp_nl_family, flags,  			  L2TP_CMD_TUNNEL_GET); @@ -265,28 +263,22 @@ static int l2tp_nl_tunnel_send(struct sk_buff *skb, u32 portid, u32 seq, int fla  	if (nest == NULL)  		goto nla_put_failure; -	do { -		start = u64_stats_fetch_begin(&tunnel->stats.syncp); -		stats.tx_packets = tunnel->stats.tx_packets; -		stats.tx_bytes = tunnel->stats.tx_bytes; -		stats.tx_errors = tunnel->stats.tx_errors; -		stats.rx_packets = tunnel->stats.rx_packets; -		stats.rx_bytes = tunnel->stats.rx_bytes; -		stats.rx_errors = tunnel->stats.rx_errors; -		stats.rx_seq_discards = tunnel->stats.rx_seq_discards; -		stats.rx_oos_packets = tunnel->stats.rx_oos_packets; -	} while (u64_stats_fetch_retry(&tunnel->stats.syncp, start)); - -	if (nla_put_u64(skb, L2TP_ATTR_TX_PACKETS, stats.tx_packets) || -	    nla_put_u64(skb, L2TP_ATTR_TX_BYTES, stats.tx_bytes) || -	    nla_put_u64(skb, L2TP_ATTR_TX_ERRORS, stats.tx_errors) || -	    nla_put_u64(skb, L2TP_ATTR_RX_PACKETS, stats.rx_packets) || -	    nla_put_u64(skb, L2TP_ATTR_RX_BYTES, stats.rx_bytes) || +	if (nla_put_u64(skb, L2TP_ATTR_TX_PACKETS, +		    atomic_long_read(&tunnel->stats.tx_packets)) || +	    nla_put_u64(skb, L2TP_ATTR_TX_BYTES, +		    atomic_long_read(&tunnel->stats.tx_bytes)) || +	    nla_put_u64(skb, L2TP_ATTR_TX_ERRORS, +		    atomic_long_read(&tunnel->stats.tx_errors)) || +	    nla_put_u64(skb, L2TP_ATTR_RX_PACKETS, +		    atomic_long_read(&tunnel->stats.rx_packets)) || +	    nla_put_u64(skb, L2TP_ATTR_RX_BYTES, +		    atomic_long_read(&tunnel->stats.rx_bytes)) ||  	    nla_put_u64(skb, L2TP_ATTR_RX_SEQ_DISCARDS, -			stats.rx_seq_discards) || +		    atomic_long_read(&tunnel->stats.rx_seq_discards)) ||  	    nla_put_u64(skb, L2TP_ATTR_RX_OOS_PACKETS, -			stats.rx_oos_packets) || -	    nla_put_u64(skb, L2TP_ATTR_RX_ERRORS, stats.rx_errors)) +		    atomic_long_read(&tunnel->stats.rx_oos_packets)) || +	    nla_put_u64(skb, L2TP_ATTR_RX_ERRORS, +		    atomic_long_read(&tunnel->stats.rx_errors)))  		goto nla_put_failure;  	nla_nest_end(skb, nest); @@ -612,8 +604,6 @@ static int l2tp_nl_session_send(struct sk_buff *skb, u32 portid, u32 seq, int fl  	struct nlattr *nest;  	struct l2tp_tunnel *tunnel = session->tunnel;  	struct sock *sk = NULL; -	struct l2tp_stats stats; -	unsigned int start;  	sk = tunnel->sock; @@ -656,28 +646,22 @@ static int l2tp_nl_session_send(struct sk_buff *skb, u32 portid, u32 seq, int fl  	if (nest == NULL)  		goto nla_put_failure; -	do { -		start = u64_stats_fetch_begin(&session->stats.syncp); -		stats.tx_packets = session->stats.tx_packets; -		stats.tx_bytes = session->stats.tx_bytes; -		stats.tx_errors = session->stats.tx_errors; -		stats.rx_packets = session->stats.rx_packets; -		stats.rx_bytes = session->stats.rx_bytes; -		stats.rx_errors = session->stats.rx_errors; -		stats.rx_seq_discards = session->stats.rx_seq_discards; -		stats.rx_oos_packets = session->stats.rx_oos_packets; -	} while (u64_stats_fetch_retry(&session->stats.syncp, start)); - -	if (nla_put_u64(skb, L2TP_ATTR_TX_PACKETS, stats.tx_packets) || -	    nla_put_u64(skb, L2TP_ATTR_TX_BYTES, stats.tx_bytes) || -	    nla_put_u64(skb, L2TP_ATTR_TX_ERRORS, stats.tx_errors) || -	    nla_put_u64(skb, L2TP_ATTR_RX_PACKETS, stats.rx_packets) || -	    nla_put_u64(skb, L2TP_ATTR_RX_BYTES, stats.rx_bytes) || +	if (nla_put_u64(skb, L2TP_ATTR_TX_PACKETS, +		atomic_long_read(&session->stats.tx_packets)) || +	    nla_put_u64(skb, L2TP_ATTR_TX_BYTES, +		atomic_long_read(&session->stats.tx_bytes)) || +	    nla_put_u64(skb, L2TP_ATTR_TX_ERRORS, +		atomic_long_read(&session->stats.tx_errors)) || +	    nla_put_u64(skb, L2TP_ATTR_RX_PACKETS, +		atomic_long_read(&session->stats.rx_packets)) || +	    nla_put_u64(skb, L2TP_ATTR_RX_BYTES, +		atomic_long_read(&session->stats.rx_bytes)) ||  	    nla_put_u64(skb, L2TP_ATTR_RX_SEQ_DISCARDS, -			stats.rx_seq_discards) || +		atomic_long_read(&session->stats.rx_seq_discards)) ||  	    nla_put_u64(skb, L2TP_ATTR_RX_OOS_PACKETS, -			stats.rx_oos_packets) || -	    nla_put_u64(skb, L2TP_ATTR_RX_ERRORS, stats.rx_errors)) +		atomic_long_read(&session->stats.rx_oos_packets)) || +	    nla_put_u64(skb, L2TP_ATTR_RX_ERRORS, +		atomic_long_read(&session->stats.rx_errors)))  		goto nla_put_failure;  	nla_nest_end(skb, nest);  |