Revert "can: statistics: use atomic access in hot path"

This reverts commit 9d2578886070b365089e47d4845ec82c2377e0aa which is
commit 80b5f90158d1364cbd80ad82852a757fc0692bf2 upstream.

It breaks the Android kernel abi and can be brought back in the future
in an abi-safe way if it is really needed.

Bug: 161946584
Change-Id: I90f0281d9af75348e0491947d77774192f22fd1a
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
diff --git a/net/can/af_can.c b/net/can/af_can.c
index 3e77a52..de47c16 100644
--- a/net/can/af_can.c
+++ b/net/can/af_can.c
@@ -288,8 +288,8 @@ int can_send(struct sk_buff *skb, int loop)
 		netif_rx_ni(newskb);
 
 	/* update statistics */
-	atomic_long_inc(&pkg_stats->tx_frames);
-	atomic_long_inc(&pkg_stats->tx_frames_delta);
+	pkg_stats->tx_frames++;
+	pkg_stats->tx_frames_delta++;
 
 	return 0;
 
@@ -649,8 +649,8 @@ static void can_receive(struct sk_buff *skb, struct net_device *dev)
 	int matches;
 
 	/* update statistics */
-	atomic_long_inc(&pkg_stats->rx_frames);
-	atomic_long_inc(&pkg_stats->rx_frames_delta);
+	pkg_stats->rx_frames++;
+	pkg_stats->rx_frames_delta++;
 
 	/* create non-zero unique skb identifier together with *skb */
 	while (!(can_skb_prv(skb)->skbcnt))
@@ -671,8 +671,8 @@ static void can_receive(struct sk_buff *skb, struct net_device *dev)
 	consume_skb(skb);
 
 	if (matches > 0) {
-		atomic_long_inc(&pkg_stats->matches);
-		atomic_long_inc(&pkg_stats->matches_delta);
+		pkg_stats->matches++;
+		pkg_stats->matches_delta++;
 	}
 }
 
diff --git a/net/can/af_can.h b/net/can/af_can.h
index 22f3352..7c2d916 100644
--- a/net/can/af_can.h
+++ b/net/can/af_can.h
@@ -66,9 +66,9 @@ struct receiver {
 struct can_pkg_stats {
 	unsigned long jiffies_init;
 
-	atomic_long_t rx_frames;
-	atomic_long_t tx_frames;
-	atomic_long_t matches;
+	unsigned long rx_frames;
+	unsigned long tx_frames;
+	unsigned long matches;
 
 	unsigned long total_rx_rate;
 	unsigned long total_tx_rate;
@@ -82,9 +82,9 @@ struct can_pkg_stats {
 	unsigned long max_tx_rate;
 	unsigned long max_rx_match_ratio;
 
-	atomic_long_t rx_frames_delta;
-	atomic_long_t tx_frames_delta;
-	atomic_long_t matches_delta;
+	unsigned long rx_frames_delta;
+	unsigned long tx_frames_delta;
+	unsigned long matches_delta;
 };
 
 /* persistent statistics */
diff --git a/net/can/proc.c b/net/can/proc.c
index 2be4a23..b15760b 100644
--- a/net/can/proc.c
+++ b/net/can/proc.c
@@ -122,13 +122,6 @@ void can_stat_update(struct timer_list *t)
 	struct can_pkg_stats *pkg_stats = net->can.pkg_stats;
 	unsigned long j = jiffies; /* snapshot */
 
-	long rx_frames = atomic_long_read(&pkg_stats->rx_frames);
-	long tx_frames = atomic_long_read(&pkg_stats->tx_frames);
-	long matches = atomic_long_read(&pkg_stats->matches);
-	long rx_frames_delta = atomic_long_read(&pkg_stats->rx_frames_delta);
-	long tx_frames_delta = atomic_long_read(&pkg_stats->tx_frames_delta);
-	long matches_delta = atomic_long_read(&pkg_stats->matches_delta);
-
 	/* restart counting in timer context on user request */
 	if (user_reset)
 		can_init_stats(net);
@@ -138,33 +131,35 @@ void can_stat_update(struct timer_list *t)
 		can_init_stats(net);
 
 	/* prevent overflow in calc_rate() */
-	if (rx_frames > (LONG_MAX / HZ))
+	if (pkg_stats->rx_frames > (ULONG_MAX / HZ))
 		can_init_stats(net);
 
 	/* prevent overflow in calc_rate() */
-	if (tx_frames > (LONG_MAX / HZ))
+	if (pkg_stats->tx_frames > (ULONG_MAX / HZ))
 		can_init_stats(net);
 
 	/* matches overflow - very improbable */
-	if (matches > (LONG_MAX / 100))
+	if (pkg_stats->matches > (ULONG_MAX / 100))
 		can_init_stats(net);
 
 	/* calc total values */
-	if (rx_frames)
-		pkg_stats->total_rx_match_ratio = (matches * 100) / rx_frames;
+	if (pkg_stats->rx_frames)
+		pkg_stats->total_rx_match_ratio = (pkg_stats->matches * 100) /
+			pkg_stats->rx_frames;
 
 	pkg_stats->total_tx_rate = calc_rate(pkg_stats->jiffies_init, j,
-					    tx_frames);
+					    pkg_stats->tx_frames);
 	pkg_stats->total_rx_rate = calc_rate(pkg_stats->jiffies_init, j,
-					    rx_frames);
+					    pkg_stats->rx_frames);
 
 	/* calc current values */
-	if (rx_frames_delta)
+	if (pkg_stats->rx_frames_delta)
 		pkg_stats->current_rx_match_ratio =
-			(matches_delta * 100) /	rx_frames_delta;
+			(pkg_stats->matches_delta * 100) /
+			pkg_stats->rx_frames_delta;
 
-	pkg_stats->current_tx_rate = calc_rate(0, HZ, tx_frames_delta);
-	pkg_stats->current_rx_rate = calc_rate(0, HZ, rx_frames_delta);
+	pkg_stats->current_tx_rate = calc_rate(0, HZ, pkg_stats->tx_frames_delta);
+	pkg_stats->current_rx_rate = calc_rate(0, HZ, pkg_stats->rx_frames_delta);
 
 	/* check / update maximum values */
 	if (pkg_stats->max_tx_rate < pkg_stats->current_tx_rate)
@@ -177,9 +172,9 @@ void can_stat_update(struct timer_list *t)
 		pkg_stats->max_rx_match_ratio = pkg_stats->current_rx_match_ratio;
 
 	/* clear values for 'current rate' calculation */
-	atomic_long_set(&pkg_stats->tx_frames_delta, 0);
-	atomic_long_set(&pkg_stats->rx_frames_delta, 0);
-	atomic_long_set(&pkg_stats->matches_delta, 0);
+	pkg_stats->tx_frames_delta = 0;
+	pkg_stats->rx_frames_delta = 0;
+	pkg_stats->matches_delta   = 0;
 
 	/* restart timer (one second) */
 	mod_timer(&net->can.stattimer, round_jiffies(jiffies + HZ));
@@ -221,12 +216,9 @@ static int can_stats_proc_show(struct seq_file *m, void *v)
 	struct can_rcv_lists_stats *rcv_lists_stats = net->can.rcv_lists_stats;
 
 	seq_putc(m, '\n');
-	seq_printf(m, " %8ld transmitted frames (TXF)\n",
-		   atomic_long_read(&pkg_stats->tx_frames));
-	seq_printf(m, " %8ld received frames (RXF)\n",
-		   atomic_long_read(&pkg_stats->rx_frames));
-	seq_printf(m, " %8ld matched frames (RXMF)\n",
-		   atomic_long_read(&pkg_stats->matches));
+	seq_printf(m, " %8ld transmitted frames (TXF)\n", pkg_stats->tx_frames);
+	seq_printf(m, " %8ld received frames (RXF)\n", pkg_stats->rx_frames);
+	seq_printf(m, " %8ld matched frames (RXMF)\n", pkg_stats->matches);
 
 	seq_putc(m, '\n');