void can_stat_update(unsigned long data) { unsigned long j = jiffies; if (user_reset) can_init_stats(); if (j < can_stats.jiffies_init) can_init_stats(); if (can_stats.rx_frames > (ULONG_MAX / HZ)) can_init_stats(); if (can_stats.tx_frames > (ULONG_MAX / HZ)) can_init_stats(); if (can_stats.matches > (ULONG_MAX / 100)) can_init_stats(); if (can_stats.rx_frames) can_stats.total_rx_match_ratio = (can_stats.matches * 100) / can_stats.rx_frames; can_stats.total_tx_rate = calc_rate(can_stats.jiffies_init, j, can_stats.tx_frames); can_stats.total_rx_rate = calc_rate(can_stats.jiffies_init, j, can_stats.rx_frames); if (can_stats.rx_frames_delta) can_stats.current_rx_match_ratio = (can_stats.matches_delta * 100) / can_stats.rx_frames_delta; can_stats.current_tx_rate = calc_rate(0, HZ, can_stats.tx_frames_delta); can_stats.current_rx_rate = calc_rate(0, HZ, can_stats.rx_frames_delta); if (can_stats.max_tx_rate < can_stats.current_tx_rate) can_stats.max_tx_rate = can_stats.current_tx_rate; if (can_stats.max_rx_rate < can_stats.current_rx_rate) can_stats.max_rx_rate = can_stats.current_rx_rate; if (can_stats.max_rx_match_ratio < can_stats.current_rx_match_ratio) can_stats.max_rx_match_ratio = can_stats.current_rx_match_ratio; can_stats.tx_frames_delta = 0; can_stats.rx_frames_delta = 0; can_stats.matches_delta = 0; mod_timer(&can_stattimer, round_jiffies(jiffies + HZ)); }
void can_stat_update(unsigned long data) { unsigned long j = jiffies; /* snapshot */ /* restart counting in timer context on user request */ if (user_reset) can_init_stats(); /* restart counting on jiffies overflow */ if (j < can_stats.jiffies_init) can_init_stats(); /* prevent overflow in calc_rate() */ if (can_stats.rx_frames > (ULONG_MAX / HZ)) can_init_stats(); /* prevent overflow in calc_rate() */ if (can_stats.tx_frames > (ULONG_MAX / HZ)) can_init_stats(); /* matches overflow - very improbable */ if (can_stats.matches > (ULONG_MAX / 100)) can_init_stats(); /* calc total values */ if (can_stats.rx_frames) can_stats.total_rx_match_ratio = (can_stats.matches * 100) / can_stats.rx_frames; can_stats.total_tx_rate = calc_rate(can_stats.jiffies_init, j, can_stats.tx_frames); can_stats.total_rx_rate = calc_rate(can_stats.jiffies_init, j, can_stats.rx_frames); /* calc current values */ if (can_stats.rx_frames_delta) can_stats.current_rx_match_ratio = (can_stats.matches_delta * 100) / can_stats.rx_frames_delta; can_stats.current_tx_rate = calc_rate(0, HZ, can_stats.tx_frames_delta); can_stats.current_rx_rate = calc_rate(0, HZ, can_stats.rx_frames_delta); /* check / update maximum values */ if (can_stats.max_tx_rate < can_stats.current_tx_rate) can_stats.max_tx_rate = can_stats.current_tx_rate; if (can_stats.max_rx_rate < can_stats.current_rx_rate) can_stats.max_rx_rate = can_stats.current_rx_rate; if (can_stats.max_rx_match_ratio < can_stats.current_rx_match_ratio) can_stats.max_rx_match_ratio = can_stats.current_rx_match_ratio; /* clear values for 'current rate' calculation */ can_stats.tx_frames_delta = 0; can_stats.rx_frames_delta = 0; can_stats.matches_delta = 0; /* restart timer (one second) */ mod_timer(&can_stattimer, round_jiffies(jiffies + HZ)); }
void can_stat_update(struct timer_list *t) { struct net *net = from_timer(net, t, can.can_stattimer); struct s_stats *can_stats = net->can.can_stats; unsigned long j = jiffies; /* snapshot */ /* restart counting in timer context on user request */ if (user_reset) can_init_stats(net); /* restart counting on jiffies overflow */ if (j < can_stats->jiffies_init) can_init_stats(net); /* prevent overflow in calc_rate() */ if (can_stats->rx_frames > (ULONG_MAX / HZ)) can_init_stats(net); /* prevent overflow in calc_rate() */ if (can_stats->tx_frames > (ULONG_MAX / HZ)) can_init_stats(net); /* matches overflow - very improbable */ if (can_stats->matches > (ULONG_MAX / 100)) can_init_stats(net); /* calc total values */ if (can_stats->rx_frames) can_stats->total_rx_match_ratio = (can_stats->matches * 100) / can_stats->rx_frames; can_stats->total_tx_rate = calc_rate(can_stats->jiffies_init, j, can_stats->tx_frames); can_stats->total_rx_rate = calc_rate(can_stats->jiffies_init, j, can_stats->rx_frames); /* calc current values */ if (can_stats->rx_frames_delta) can_stats->current_rx_match_ratio = (can_stats->matches_delta * 100) / can_stats->rx_frames_delta; can_stats->current_tx_rate = calc_rate(0, HZ, can_stats->tx_frames_delta); can_stats->current_rx_rate = calc_rate(0, HZ, can_stats->rx_frames_delta); /* check / update maximum values */ if (can_stats->max_tx_rate < can_stats->current_tx_rate) can_stats->max_tx_rate = can_stats->current_tx_rate; if (can_stats->max_rx_rate < can_stats->current_rx_rate) can_stats->max_rx_rate = can_stats->current_rx_rate; if (can_stats->max_rx_match_ratio < can_stats->current_rx_match_ratio) can_stats->max_rx_match_ratio = can_stats->current_rx_match_ratio; /* clear values for 'current rate' calculation */ can_stats->tx_frames_delta = 0; can_stats->rx_frames_delta = 0; can_stats->matches_delta = 0; /* restart timer (one second) */ mod_timer(&net->can.can_stattimer, round_jiffies(jiffies + HZ)); }