net: add function dev_fetch_sw_netstats for fetching pcpu_sw_netstats
In several places the same code is used to populate rtnl_link_stats64 fields with data from pcpu_sw_netstats. Therefore factor out this code to a new function dev_fetch_sw_netstats(). v2: - constify argument netstats - don't ignore netstats being NULL or an ERRPTR - switch to EXPORT_SYMBOL_GPL Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Link: https://lore.kernel.org/r/6d16a338-52f5-df69-0020-6bc771a7d498@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
3618ad2a7c
commit
44fa32f008
|
@ -4499,6 +4499,8 @@ struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev,
|
|||
struct rtnl_link_stats64 *storage);
|
||||
void netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64,
|
||||
const struct net_device_stats *netdev_stats);
|
||||
void dev_fetch_sw_netstats(struct rtnl_link_stats64 *s,
|
||||
const struct pcpu_sw_netstats __percpu *netstats);
|
||||
|
||||
extern int netdev_max_backlog;
|
||||
extern int netdev_tstamp_prequeue;
|
||||
|
|
|
@ -10328,6 +10328,40 @@ struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev,
|
|||
}
|
||||
EXPORT_SYMBOL(dev_get_stats);
|
||||
|
||||
/**
|
||||
* dev_fetch_sw_netstats - get per-cpu network device statistics
|
||||
* @s: place to store stats
|
||||
* @netstats: per-cpu network stats to read from
|
||||
*
|
||||
* Read per-cpu network statistics and populate the related fields in @s.
|
||||
*/
|
||||
void dev_fetch_sw_netstats(struct rtnl_link_stats64 *s,
|
||||
const struct pcpu_sw_netstats __percpu *netstats)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
const struct pcpu_sw_netstats *stats;
|
||||
struct pcpu_sw_netstats tmp;
|
||||
unsigned int start;
|
||||
|
||||
stats = per_cpu_ptr(netstats, cpu);
|
||||
do {
|
||||
start = u64_stats_fetch_begin_irq(&stats->syncp);
|
||||
tmp.rx_packets = stats->rx_packets;
|
||||
tmp.rx_bytes = stats->rx_bytes;
|
||||
tmp.tx_packets = stats->tx_packets;
|
||||
tmp.tx_bytes = stats->tx_bytes;
|
||||
} while (u64_stats_fetch_retry_irq(&stats->syncp, start));
|
||||
|
||||
s->rx_packets += tmp.rx_packets;
|
||||
s->rx_bytes += tmp.rx_bytes;
|
||||
s->tx_packets += tmp.tx_packets;
|
||||
s->tx_bytes += tmp.tx_bytes;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dev_fetch_sw_netstats);
|
||||
|
||||
struct netdev_queue *dev_ingress_queue_create(struct net_device *dev)
|
||||
{
|
||||
struct netdev_queue *queue = dev_ingress_queue(dev);
|
||||
|
|
Loading…
Reference in New Issue