aboutsummaryrefslogtreecommitdiffstats
path: root/net/8021q/vlan_dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/8021q/vlan_dev.c')
-rw-r--r--net/8021q/vlan_dev.c62
1 files changed, 30 insertions, 32 deletions
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
index 019efb79708f..ad2ac3c00398 100644
--- a/net/8021q/vlan_dev.c
+++ b/net/8021q/vlan_dev.c
@@ -643,9 +643,9 @@ static netdev_features_t vlan_dev_fix_features(struct net_device *dev,
643 struct net_device *real_dev = vlan_dev_priv(dev)->real_dev; 643 struct net_device *real_dev = vlan_dev_priv(dev)->real_dev;
644 netdev_features_t old_features = features; 644 netdev_features_t old_features = features;
645 645
646 features &= real_dev->vlan_features; 646 features = netdev_intersect_features(features, real_dev->vlan_features);
647 features |= NETIF_F_RXCSUM; 647 features |= NETIF_F_RXCSUM;
648 features &= real_dev->features; 648 features = netdev_intersect_features(features, real_dev->features);
649 649
650 features |= old_features & NETIF_F_SOFT_FEATURES; 650 features |= old_features & NETIF_F_SOFT_FEATURES;
651 features |= NETIF_F_LLTX; 651 features |= NETIF_F_LLTX;
@@ -671,38 +671,36 @@ static void vlan_ethtool_get_drvinfo(struct net_device *dev,
671 671
672static struct rtnl_link_stats64 *vlan_dev_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) 672static struct rtnl_link_stats64 *vlan_dev_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
673{ 673{
674 struct vlan_pcpu_stats *p;
675 u32 rx_errors = 0, tx_dropped = 0;
676 int i;
674 677
675 if (vlan_dev_priv(dev)->vlan_pcpu_stats) { 678 for_each_possible_cpu(i) {
676 struct vlan_pcpu_stats *p; 679 u64 rxpackets, rxbytes, rxmulticast, txpackets, txbytes;
677 u32 rx_errors = 0, tx_dropped = 0; 680 unsigned int start;
678 int i; 681
679 682 p = per_cpu_ptr(vlan_dev_priv(dev)->vlan_pcpu_stats, i);
680 for_each_possible_cpu(i) { 683 do {
681 u64 rxpackets, rxbytes, rxmulticast, txpackets, txbytes; 684 start = u64_stats_fetch_begin_irq(&p->syncp);
682 unsigned int start; 685 rxpackets = p->rx_packets;
683 686 rxbytes = p->rx_bytes;
684 p = per_cpu_ptr(vlan_dev_priv(dev)->vlan_pcpu_stats, i); 687 rxmulticast = p->rx_multicast;
685 do { 688 txpackets = p->tx_packets;
686 start = u64_stats_fetch_begin_irq(&p->syncp); 689 txbytes = p->tx_bytes;
687 rxpackets = p->rx_packets; 690 } while (u64_stats_fetch_retry_irq(&p->syncp, start));
688 rxbytes = p->rx_bytes; 691
689 rxmulticast = p->rx_multicast; 692 stats->rx_packets += rxpackets;
690 txpackets = p->tx_packets; 693 stats->rx_bytes += rxbytes;
691 txbytes = p->tx_bytes; 694 stats->multicast += rxmulticast;
692 } while (u64_stats_fetch_retry_irq(&p->syncp, start)); 695 stats->tx_packets += txpackets;
693 696 stats->tx_bytes += txbytes;
694 stats->rx_packets += rxpackets; 697 /* rx_errors & tx_dropped are u32 */
695 stats->rx_bytes += rxbytes; 698 rx_errors += p->rx_errors;
696 stats->multicast += rxmulticast; 699 tx_dropped += p->tx_dropped;
697 stats->tx_packets += txpackets;
698 stats->tx_bytes += txbytes;
699 /* rx_errors & tx_dropped are u32 */
700 rx_errors += p->rx_errors;
701 tx_dropped += p->tx_dropped;
702 }
703 stats->rx_errors = rx_errors;
704 stats->tx_dropped = tx_dropped;
705 } 700 }
701 stats->rx_errors = rx_errors;
702 stats->tx_dropped = tx_dropped;
703
706 return stats; 704 return stats;
707} 705}
708 706