S2io: fix statistics flush after a MTU change
Subsystems (2)
PATCH 1/1 S2io: fix statistics flush after a MTU change
On s2io driver, when you change the interface MTU, it invokes a card reset, which flush some statistics. This patch solves this problem, and also set the net_device->stats as the default statistics structure, instead of s2io_nic->stats.
To do that, s2io_nic->stats turned into a staging area, where is saved statistics of the last hardware statistics query. So, the difference between the current hardware statistics and s2io_nic->stats, is the value that should be summed up, in order to get the correct statistics value, even after a reset.
----
drivers/net/s2io.c +23 -6
@@ -3139,7 +3139,7 @@ static void tx_intr_handler(struct fifo_info *fifo_data) pkt_cnt++;/* Updating the statistics block */ - nic->stats.tx_bytes += skb->len; + nic->dev->stats.tx_bytes += skb->len; nic->mac_control.stats_info->sw_stat.mem_freed += skb->truesize;dev_kfree_skb_irq (skb);
@@ -4892,25 +4892,42 @@ static struct net_device_stats *s2io_get_stats(struct net_device *dev)/* Configure Stats for immediate updt */ s2io_updt_stats (sp); +/* Using sp->stats as a staging area, because reset (due to mtu +change, for example) will clear some hardware counters */ + dev->stats.tx_packets += +le32_to_cpu (mac_control->stats_info->tmac_frms) - + sp->stats.tx_packets; sp->stats.tx_packets =le32_to_cpu (mac_control->stats_info->tmac_frms); + dev->stats.tx_errors += +le32_to_cpu (mac_control->stats_info->tmac_any_err_frms) - + sp->stats.tx_errors; sp->stats.tx_errors =le32_to_cpu (mac_control->stats_info->tmac_any_err_frms); + dev->stats.rx_errors += +le64_to_cpu (mac_control->stats_info->rmac_drop_frms) - + sp->stats.rx_errors; sp->stats.rx_errors =le64_to_cpu (mac_control->stats_info->rmac_drop_frms); + dev->stats.multicast = +le32_to_cpu (mac_control->stats_info->rmac_vld_mcst_frms) - + sp->stats.multicast; sp->stats.multicast =le32_to_cpu (mac_control->stats_info->rmac_vld_mcst_frms); + dev->stats.rx_length_errors = +le64_to_cpu (mac_control->stats_info->rmac_long_frms) - + sp->stats.rx_length_errors; sp->stats.rx_length_errors =le64_to_cpu (mac_control->stats_info->rmac_long_frms);/* collect per-ring rx_packets and rx_bytes */ - sp->stats.rx_packets = sp->stats.rx_bytes =0 ; + dev->stats.rx_packets = dev->stats.rx_bytes =0 ;for (i =0 ; i < config->rx_ring_num; i++) { - sp->stats.rx_packets += mac_control->rings[i].rx_packets; - sp->stats.rx_bytes += mac_control->rings[i].rx_bytes; + dev->stats.rx_packets += mac_control->rings[i].rx_packets; + dev->stats.rx_bytes += mac_control->rings[i].rx_bytes; } -return (&sp->stats); +return (&dev->stats); }/**
@@ -7413,7 +7430,7 @@ static int rx_osm_handler(struct ring_info *ring_data, struct RxD_t * rxdp)if (err_mask !=0x5 ) {DBG_PRINT (ERR_DBG ,"%s: Rx error Value: 0x%x\n" , dev->name, err_mask); - sp->stats.rx_crc_errors++; + dev->stats.rx_crc_errors++; sp->mac_control.stats_info->sw_stat.mem_freed += skb->truesize;dev_kfree_skb (skb);
Jeff,
The patch looks good. Please accept.
Thanks,
Ram
Quoted 5 lines
-----Original Message-----
From: Breno Leitao [mailto:[email protected]]
Sent: Tuesday, July 22, 2008 12:27 PM
To: [email protected]
Cc: [email protected]; [email protected]; Rastapur Santosh;
Sivakumar
Quoted 6 lines
Subramani; Sreenivasa Honnur; Jay Vosburgh
Subject: [Patch 1/1 net-next] S2io: fix statistics flush after a MTU changeOn s2io driver, when you change the interface MTU, it invokes a card reset, which flush some statistics. This patch solves this problem,
and
Quoted 33 lines
also set the
net_device->statsas the default statistics structure, instead ofs2io_nic->stats.To do that,
s2io_nic->statsturned into a staging area, where is saved statistics of the last hardware statistics query. So, the difference between the current hardware statistics ands2io_nic->stats, is the value that should be summed up, in order to get the correct statistics value, even after a reset.Signed-off-by Breno Leitao <[email protected]>Signed-off-by Jay Vosburgh <[email protected]>----
drivers/net/s2io.c +1
-1@@ -3139,7 +3139,7 @@ static void tx_intr_handler(struct fifo_info *fifo_data) pkt_cnt++;/* Updating the statistics block */ - nic->stats.tx_bytes += skb->len; + nic->dev->stats.tx_bytes += skb->len; nic->mac_control.stats_info->sw_stat.mem_freed += skb- >truesize;drivers/net/s2io.c +0
-0dev_kfree_skb_irq (skb);@@ -4892,25 +4892,42 @@ static struct net_device_stats *s2io_get_stats(struct net_device *dev) /* Configure Stats for immediate updt */s2io_updt_stats (sp);
drivers/net/s2io.c static struct net_device_stats · line 4904
Quoted 10 lines
drivers/net/s2io.c +7
-0+/* Using sp->stats as a staging area, because reset (due to mtu +change, for example) will clear some hardware counters */ + dev->stats.tx_packets += +le32_to_cpu (mac_control->stats_info->tmac_frms) - + sp->stats.tx_packets; sp->stats.tx_packets =le32_to_cpu (mac_control->stats_info->tmac_frms); + dev->stats.tx_errors += +le32_to_cpu (mac_control->stats_info->tmac_any_err_frms)
-
drivers/net/s2io.c static struct net_device_stats *s2io_get_stats(struct net_device *dev)
Quoted 10 lines
drivers/net/s2io.c +6
-0+ sp->stats.tx_errors; sp->stats.tx_errors =le32_to_cpu (mac_control->stats_info->tmac_any_err_frms); + dev->stats.rx_errors += +le64_to_cpu (mac_control->stats_info->rmac_drop_frms) - + sp->stats.rx_errors; sp->stats.rx_errors =le64_to_cpu (mac_control->stats_info->rmac_drop_frms); + dev->stats.multicast = +le32_to_cpu (mac_control->stats_info->rmac_vld_mcst_frms)
-
drivers/net/s2io.c static struct net_device_stats *s2io_get_stats(struct net_device *dev) · line 4922
Quoted 3 lines
drivers/net/s2io.c +1
-0+ sp->stats.multicast; sp->stats.multicast =
le32_to_cpu(mac_control->stats_info->rmac_vld_mcst_frms);
drivers/net/s2io.c static struct net_device_stats *s2io_get_stats(struct net_device *dev)
Quoted 11 lines
drivers/net/s2io.c +4
-2+ dev->stats.rx_length_errors = +le64_to_cpu (mac_control->stats_info->rmac_long_frms) - + sp->stats.rx_length_errors; sp->stats.rx_length_errors =le64_to_cpu (mac_control->stats_info->rmac_long_frms);/* collect per-ring rx_packets and rx_bytes */ - sp->stats.rx_packets = sp->stats.rx_bytes =0 ; + dev->stats.rx_packets = dev->stats.rx_bytes =0 ;for (i =0 ; i < config->rx_ring_num; i++) { - sp->stats.rx_packets +=
mac_control->rings[i].rx_packets;
drivers/net/s2io.c static struct net_device_stats · line 4927
Quoted 2 lines
drivers/net/s2io.c +1
-1- sp->stats.rx_bytes += mac_control->rings[i].rx_bytes; + dev->stats.rx_packets +=
mac_control->rings[i].rx_packets;
Quoted 18 lines
drivers/net/s2io.c +2
-1+ dev->stats.rx_bytes += mac_control->rings[i].rx_bytes; } -return (&sp->stats); +return (&dev->stats); }/**
drivers/net/s2io.c +1
-1@@ -7413,7 +7430,7 @@ static int rx_osm_handler(struct ring_info *ring_data, struct RxD_t * rxdp)if (err_mask !=0x5 ) {DBG_PRINT (ERR_DBG ,"%s: Rx error Value: 0x%x\n" , dev->name, err_mask); - sp->stats.rx_crc_errors++; + dev->stats.rx_crc_errors++; sp->mac_control.stats_info->sw_stat.mem_freed += skb->truesize;
dev_kfree_skb(skb);
Jeff Garzik
AppliedQuoted 5 lines · Breno Leitao
On s2io driver, when you change the interface MTU, it invokes a card reset, which flush some statistics. This patch solves this problem, and also set the
net_device->statsas the default statistics structure, instead ofs2io_nic->stats.
Quoted 8 lines
To do that,
s2io_nic->statsturned into a staging area, where is saved statistics of the last hardware statistics query. So, the difference between the current hardware statistics ands2io_nic->stats, is the value that should be summed up, in order to get the correct statistics value, even after a reset.Signed-off-by Breno Leitao <[email protected]>Signed-off-by Jay Vosburgh <[email protected]>
applied