mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
Revert "can: statistics: use atomic access in hot path"
This reverts commit 4b07ce83e9 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 <gregkh@google.com>
This commit is contained in:
@@ -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++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user