From f6e3f076219ad555f412c15cec1b76674875b478 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 15 Apr 2025 10:01:08 +0000 Subject: [PATCH] Revert "can: statistics: use atomic access in hot path" This reverts commit 4b07ce83e9ed8ddad08ff049a2aa814cffef5109 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: I5458aa41226201953c4c9be42e4c3993293c8b7b Signed-off-by: Greg Kroah-Hartman --- net/can/af_can.c | 12 ++++++------ net/can/af_can.h | 12 ++++++------ net/can/proc.c | 46 +++++++++++++++++++--------------------------- 3 files changed, 31 insertions(+), 39 deletions(-) diff --git a/net/can/af_can.c b/net/can/af_can.c index bbd8e959137d..7d8543e877b4 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c @@ -287,8 +287,8 @@ int can_send(struct sk_buff *skb, int loop) netif_rx(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; @@ -648,8 +648,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)) @@ -670,8 +670,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 22f3352c77fe..7c2d9161e224 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 25fdf060e30d..bbce97825f13 100644 --- a/net/can/proc.c +++ b/net/can/proc.c @@ -118,13 +118,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); @@ -134,33 +127,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) @@ -173,9 +168,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)); @@ -219,12 +214,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');