diff options
author | John W. Linville <linville@tuxdriver.com> | 2010-07-27 11:59:19 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-07-27 11:59:19 -0400 |
commit | 800f65bba8d2030b3fef62850e203f9f176625a8 (patch) | |
tree | 6507c4fe7a0826c253b4afb29375ab306a0fd9c8 /net/8021q | |
parent | 06b3cda0c12986f5bba578b918b188d731c4e191 (diff) | |
parent | b3190df628617c7a4f188a9465aeabe1f5761933 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/holtmann/bluetooth-next-2.6
Conflicts:
drivers/net/wireless/iwlwifi/iwl-commands.h
Diffstat (limited to 'net/8021q')
-rw-r--r-- | net/8021q/vlan.c | 13 | ||||
-rw-r--r-- | net/8021q/vlan.h | 13 | ||||
-rw-r--r-- | net/8021q/vlan_core.c | 30 | ||||
-rw-r--r-- | net/8021q/vlan_dev.c | 164 | ||||
-rw-r--r-- | net/8021q/vlanproc.c | 16 |
5 files changed, 155 insertions, 81 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 3c1c8c14e929..a2ad15250575 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
@@ -155,9 +155,10 @@ void unregister_vlan_dev(struct net_device *dev, struct list_head *head) | |||
155 | BUG_ON(!grp); | 155 | BUG_ON(!grp); |
156 | 156 | ||
157 | /* Take it out of our own structures, but be sure to interlock with | 157 | /* Take it out of our own structures, but be sure to interlock with |
158 | * HW accelerating devices or SW vlan input packet processing. | 158 | * HW accelerating devices or SW vlan input packet processing if |
159 | * VLAN is not 0 (leave it there for 802.1p). | ||
159 | */ | 160 | */ |
160 | if (real_dev->features & NETIF_F_HW_VLAN_FILTER) | 161 | if (vlan_id && (real_dev->features & NETIF_F_HW_VLAN_FILTER)) |
161 | ops->ndo_vlan_rx_kill_vid(real_dev, vlan_id); | 162 | ops->ndo_vlan_rx_kill_vid(real_dev, vlan_id); |
162 | 163 | ||
163 | grp->nr_vlans--; | 164 | grp->nr_vlans--; |
@@ -419,6 +420,14 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, | |||
419 | if (is_vlan_dev(dev)) | 420 | if (is_vlan_dev(dev)) |
420 | __vlan_device_event(dev, event); | 421 | __vlan_device_event(dev, event); |
421 | 422 | ||
423 | if ((event == NETDEV_UP) && | ||
424 | (dev->features & NETIF_F_HW_VLAN_FILTER) && | ||
425 | dev->netdev_ops->ndo_vlan_rx_add_vid) { | ||
426 | pr_info("8021q: adding VLAN 0 to HW filter on device %s\n", | ||
427 | dev->name); | ||
428 | dev->netdev_ops->ndo_vlan_rx_add_vid(dev, 0); | ||
429 | } | ||
430 | |||
422 | grp = __vlan_find_group(dev); | 431 | grp = __vlan_find_group(dev); |
423 | if (!grp) | 432 | if (!grp) |
424 | goto out; | 433 | goto out; |
diff --git a/net/8021q/vlan.h b/net/8021q/vlan.h index 6abdcac1b2e8..8d9503ad01da 100644 --- a/net/8021q/vlan.h +++ b/net/8021q/vlan.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define __BEN_VLAN_802_1Q_INC__ | 2 | #define __BEN_VLAN_802_1Q_INC__ |
3 | 3 | ||
4 | #include <linux/if_vlan.h> | 4 | #include <linux/if_vlan.h> |
5 | #include <linux/u64_stats_sync.h> | ||
5 | 6 | ||
6 | 7 | ||
7 | /** | 8 | /** |
@@ -21,14 +22,16 @@ struct vlan_priority_tci_mapping { | |||
21 | * struct vlan_rx_stats - VLAN percpu rx stats | 22 | * struct vlan_rx_stats - VLAN percpu rx stats |
22 | * @rx_packets: number of received packets | 23 | * @rx_packets: number of received packets |
23 | * @rx_bytes: number of received bytes | 24 | * @rx_bytes: number of received bytes |
24 | * @multicast: number of received multicast packets | 25 | * @rx_multicast: number of received multicast packets |
26 | * @syncp: synchronization point for 64bit counters | ||
25 | * @rx_errors: number of errors | 27 | * @rx_errors: number of errors |
26 | */ | 28 | */ |
27 | struct vlan_rx_stats { | 29 | struct vlan_rx_stats { |
28 | unsigned long rx_packets; | 30 | u64 rx_packets; |
29 | unsigned long rx_bytes; | 31 | u64 rx_bytes; |
30 | unsigned long multicast; | 32 | u64 rx_multicast; |
31 | unsigned long rx_errors; | 33 | struct u64_stats_sync syncp; |
34 | unsigned long rx_errors; | ||
32 | }; | 35 | }; |
33 | 36 | ||
34 | /** | 37 | /** |
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c index bd537fc10254..01ddb0472f86 100644 --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c | |||
@@ -8,17 +8,23 @@ | |||
8 | int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, | 8 | int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp, |
9 | u16 vlan_tci, int polling) | 9 | u16 vlan_tci, int polling) |
10 | { | 10 | { |
11 | struct net_device *vlan_dev; | ||
12 | u16 vlan_id; | ||
13 | |||
11 | if (netpoll_rx(skb)) | 14 | if (netpoll_rx(skb)) |
12 | return NET_RX_DROP; | 15 | return NET_RX_DROP; |
13 | 16 | ||
14 | if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master))) | 17 | if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master))) |
15 | goto drop; | 18 | skb->deliver_no_wcard = 1; |
16 | 19 | ||
17 | skb->skb_iif = skb->dev->ifindex; | 20 | skb->skb_iif = skb->dev->ifindex; |
18 | __vlan_hwaccel_put_tag(skb, vlan_tci); | 21 | __vlan_hwaccel_put_tag(skb, vlan_tci); |
19 | skb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK); | 22 | vlan_id = vlan_tci & VLAN_VID_MASK; |
23 | vlan_dev = vlan_group_get_device(grp, vlan_id); | ||
20 | 24 | ||
21 | if (!skb->dev) | 25 | if (vlan_dev) |
26 | skb->dev = vlan_dev; | ||
27 | else if (vlan_id) | ||
22 | goto drop; | 28 | goto drop; |
23 | 29 | ||
24 | return (polling ? netif_receive_skb(skb) : netif_rx(skb)); | 30 | return (polling ? netif_receive_skb(skb) : netif_rx(skb)); |
@@ -41,9 +47,9 @@ int vlan_hwaccel_do_receive(struct sk_buff *skb) | |||
41 | skb->priority = vlan_get_ingress_priority(dev, skb->vlan_tci); | 47 | skb->priority = vlan_get_ingress_priority(dev, skb->vlan_tci); |
42 | skb->vlan_tci = 0; | 48 | skb->vlan_tci = 0; |
43 | 49 | ||
44 | rx_stats = per_cpu_ptr(vlan_dev_info(dev)->vlan_rx_stats, | 50 | rx_stats = this_cpu_ptr(vlan_dev_info(dev)->vlan_rx_stats); |
45 | smp_processor_id()); | ||
46 | 51 | ||
52 | u64_stats_update_begin(&rx_stats->syncp); | ||
47 | rx_stats->rx_packets++; | 53 | rx_stats->rx_packets++; |
48 | rx_stats->rx_bytes += skb->len; | 54 | rx_stats->rx_bytes += skb->len; |
49 | 55 | ||
@@ -51,7 +57,7 @@ int vlan_hwaccel_do_receive(struct sk_buff *skb) | |||
51 | case PACKET_BROADCAST: | 57 | case PACKET_BROADCAST: |
52 | break; | 58 | break; |
53 | case PACKET_MULTICAST: | 59 | case PACKET_MULTICAST: |
54 | rx_stats->multicast++; | 60 | rx_stats->rx_multicast++; |
55 | break; | 61 | break; |
56 | case PACKET_OTHERHOST: | 62 | case PACKET_OTHERHOST: |
57 | /* Our lower layer thinks this is not local, let's make sure. | 63 | /* Our lower layer thinks this is not local, let's make sure. |
@@ -62,6 +68,7 @@ int vlan_hwaccel_do_receive(struct sk_buff *skb) | |||
62 | skb->pkt_type = PACKET_HOST; | 68 | skb->pkt_type = PACKET_HOST; |
63 | break; | 69 | break; |
64 | } | 70 | } |
71 | u64_stats_update_end(&rx_stats->syncp); | ||
65 | return 0; | 72 | return 0; |
66 | } | 73 | } |
67 | 74 | ||
@@ -82,15 +89,20 @@ vlan_gro_common(struct napi_struct *napi, struct vlan_group *grp, | |||
82 | unsigned int vlan_tci, struct sk_buff *skb) | 89 | unsigned int vlan_tci, struct sk_buff *skb) |
83 | { | 90 | { |
84 | struct sk_buff *p; | 91 | struct sk_buff *p; |
92 | struct net_device *vlan_dev; | ||
93 | u16 vlan_id; | ||
85 | 94 | ||
86 | if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master))) | 95 | if (skb_bond_should_drop(skb, ACCESS_ONCE(skb->dev->master))) |
87 | goto drop; | 96 | skb->deliver_no_wcard = 1; |
88 | 97 | ||
89 | skb->skb_iif = skb->dev->ifindex; | 98 | skb->skb_iif = skb->dev->ifindex; |
90 | __vlan_hwaccel_put_tag(skb, vlan_tci); | 99 | __vlan_hwaccel_put_tag(skb, vlan_tci); |
91 | skb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK); | 100 | vlan_id = vlan_tci & VLAN_VID_MASK; |
101 | vlan_dev = vlan_group_get_device(grp, vlan_id); | ||
92 | 102 | ||
93 | if (!skb->dev) | 103 | if (vlan_dev) |
104 | skb->dev = vlan_dev; | ||
105 | else if (vlan_id) | ||
94 | goto drop; | 106 | goto drop; |
95 | 107 | ||
96 | for (p = napi->gro_list; p; p = p->next) { | 108 | for (p = napi->gro_list; p; p = p->next) { |
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 55be90826f5f..3d59c9bf8feb 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
@@ -142,6 +142,7 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev, | |||
142 | { | 142 | { |
143 | struct vlan_hdr *vhdr; | 143 | struct vlan_hdr *vhdr; |
144 | struct vlan_rx_stats *rx_stats; | 144 | struct vlan_rx_stats *rx_stats; |
145 | struct net_device *vlan_dev; | ||
145 | u16 vlan_id; | 146 | u16 vlan_id; |
146 | u16 vlan_tci; | 147 | u16 vlan_tci; |
147 | 148 | ||
@@ -157,53 +158,71 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev, | |||
157 | vlan_id = vlan_tci & VLAN_VID_MASK; | 158 | vlan_id = vlan_tci & VLAN_VID_MASK; |
158 | 159 | ||
159 | rcu_read_lock(); | 160 | rcu_read_lock(); |
160 | skb->dev = __find_vlan_dev(dev, vlan_id); | 161 | vlan_dev = __find_vlan_dev(dev, vlan_id); |
161 | if (!skb->dev) { | ||
162 | pr_debug("%s: ERROR: No net_device for VID: %u on dev: %s\n", | ||
163 | __func__, vlan_id, dev->name); | ||
164 | goto err_unlock; | ||
165 | } | ||
166 | |||
167 | rx_stats = per_cpu_ptr(vlan_dev_info(skb->dev)->vlan_rx_stats, | ||
168 | smp_processor_id()); | ||
169 | rx_stats->rx_packets++; | ||
170 | rx_stats->rx_bytes += skb->len; | ||
171 | |||
172 | skb_pull_rcsum(skb, VLAN_HLEN); | ||
173 | |||
174 | skb->priority = vlan_get_ingress_priority(skb->dev, vlan_tci); | ||
175 | |||
176 | pr_debug("%s: priority: %u for TCI: %hu\n", | ||
177 | __func__, skb->priority, vlan_tci); | ||
178 | |||
179 | switch (skb->pkt_type) { | ||
180 | case PACKET_BROADCAST: /* Yeah, stats collect these together.. */ | ||
181 | /* stats->broadcast ++; // no such counter :-( */ | ||
182 | break; | ||
183 | 162 | ||
184 | case PACKET_MULTICAST: | 163 | /* If the VLAN device is defined, we use it. |
185 | rx_stats->multicast++; | 164 | * If not, and the VID is 0, it is a 802.1p packet (not |
186 | break; | 165 | * really a VLAN), so we will just netif_rx it later to the |
166 | * original interface, but with the skb->proto set to the | ||
167 | * wrapped proto: we do nothing here. | ||
168 | */ | ||
187 | 169 | ||
188 | case PACKET_OTHERHOST: | 170 | if (!vlan_dev) { |
189 | /* Our lower layer thinks this is not local, let's make sure. | 171 | if (vlan_id) { |
190 | * This allows the VLAN to have a different MAC than the | 172 | pr_debug("%s: ERROR: No net_device for VID: %u on dev: %s\n", |
191 | * underlying device, and still route correctly. | 173 | __func__, vlan_id, dev->name); |
192 | */ | 174 | goto err_unlock; |
193 | if (!compare_ether_addr(eth_hdr(skb)->h_dest, | 175 | } |
194 | skb->dev->dev_addr)) | 176 | rx_stats = NULL; |
195 | skb->pkt_type = PACKET_HOST; | 177 | } else { |
196 | break; | 178 | skb->dev = vlan_dev; |
197 | default: | 179 | |
198 | break; | 180 | rx_stats = per_cpu_ptr(vlan_dev_info(skb->dev)->vlan_rx_stats, |
181 | smp_processor_id()); | ||
182 | u64_stats_update_begin(&rx_stats->syncp); | ||
183 | rx_stats->rx_packets++; | ||
184 | rx_stats->rx_bytes += skb->len; | ||
185 | |||
186 | skb->priority = vlan_get_ingress_priority(skb->dev, vlan_tci); | ||
187 | |||
188 | pr_debug("%s: priority: %u for TCI: %hu\n", | ||
189 | __func__, skb->priority, vlan_tci); | ||
190 | |||
191 | switch (skb->pkt_type) { | ||
192 | case PACKET_BROADCAST: | ||
193 | /* Yeah, stats collect these together.. */ | ||
194 | /* stats->broadcast ++; // no such counter :-( */ | ||
195 | break; | ||
196 | |||
197 | case PACKET_MULTICAST: | ||
198 | rx_stats->rx_multicast++; | ||
199 | break; | ||
200 | |||
201 | case PACKET_OTHERHOST: | ||
202 | /* Our lower layer thinks this is not local, let's make | ||
203 | * sure. | ||
204 | * This allows the VLAN to have a different MAC than the | ||
205 | * underlying device, and still route correctly. | ||
206 | */ | ||
207 | if (!compare_ether_addr(eth_hdr(skb)->h_dest, | ||
208 | skb->dev->dev_addr)) | ||
209 | skb->pkt_type = PACKET_HOST; | ||
210 | break; | ||
211 | default: | ||
212 | break; | ||
213 | } | ||
214 | u64_stats_update_end(&rx_stats->syncp); | ||
199 | } | 215 | } |
200 | 216 | ||
217 | skb_pull_rcsum(skb, VLAN_HLEN); | ||
201 | vlan_set_encap_proto(skb, vhdr); | 218 | vlan_set_encap_proto(skb, vhdr); |
202 | 219 | ||
203 | skb = vlan_check_reorder_header(skb); | 220 | if (vlan_dev) { |
204 | if (!skb) { | 221 | skb = vlan_check_reorder_header(skb); |
205 | rx_stats->rx_errors++; | 222 | if (!skb) { |
206 | goto err_unlock; | 223 | rx_stats->rx_errors++; |
224 | goto err_unlock; | ||
225 | } | ||
207 | } | 226 | } |
208 | 227 | ||
209 | netif_rx(skb); | 228 | netif_rx(skb); |
@@ -708,7 +727,8 @@ static int vlan_dev_init(struct net_device *dev) | |||
708 | netif_carrier_off(dev); | 727 | netif_carrier_off(dev); |
709 | 728 | ||
710 | /* IFF_BROADCAST|IFF_MULTICAST; ??? */ | 729 | /* IFF_BROADCAST|IFF_MULTICAST; ??? */ |
711 | dev->flags = real_dev->flags & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI); | 730 | dev->flags = real_dev->flags & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI | |
731 | IFF_MASTER | IFF_SLAVE); | ||
712 | dev->iflink = real_dev->ifindex; | 732 | dev->iflink = real_dev->ifindex; |
713 | dev->state = (real_dev->state & ((1<<__LINK_STATE_NOCARRIER) | | 733 | dev->state = (real_dev->state & ((1<<__LINK_STATE_NOCARRIER) | |
714 | (1<<__LINK_STATE_DORMANT))) | | 734 | (1<<__LINK_STATE_DORMANT))) | |
@@ -800,37 +820,65 @@ static u32 vlan_ethtool_get_flags(struct net_device *dev) | |||
800 | return dev_ethtool_get_flags(vlan->real_dev); | 820 | return dev_ethtool_get_flags(vlan->real_dev); |
801 | } | 821 | } |
802 | 822 | ||
803 | static struct net_device_stats *vlan_dev_get_stats(struct net_device *dev) | 823 | static struct rtnl_link_stats64 *vlan_dev_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) |
804 | { | 824 | { |
805 | struct net_device_stats *stats = &dev->stats; | ||
806 | |||
807 | dev_txq_stats_fold(dev, stats); | 825 | dev_txq_stats_fold(dev, stats); |
808 | 826 | ||
809 | if (vlan_dev_info(dev)->vlan_rx_stats) { | 827 | if (vlan_dev_info(dev)->vlan_rx_stats) { |
810 | struct vlan_rx_stats *p, rx = {0}; | 828 | struct vlan_rx_stats *p, accum = {0}; |
811 | int i; | 829 | int i; |
812 | 830 | ||
813 | for_each_possible_cpu(i) { | 831 | for_each_possible_cpu(i) { |
832 | u64 rxpackets, rxbytes, rxmulticast; | ||
833 | unsigned int start; | ||
834 | |||
814 | p = per_cpu_ptr(vlan_dev_info(dev)->vlan_rx_stats, i); | 835 | p = per_cpu_ptr(vlan_dev_info(dev)->vlan_rx_stats, i); |
815 | rx.rx_packets += p->rx_packets; | 836 | do { |
816 | rx.rx_bytes += p->rx_bytes; | 837 | start = u64_stats_fetch_begin_bh(&p->syncp); |
817 | rx.rx_errors += p->rx_errors; | 838 | rxpackets = p->rx_packets; |
818 | rx.multicast += p->multicast; | 839 | rxbytes = p->rx_bytes; |
840 | rxmulticast = p->rx_multicast; | ||
841 | } while (u64_stats_fetch_retry_bh(&p->syncp, start)); | ||
842 | accum.rx_packets += rxpackets; | ||
843 | accum.rx_bytes += rxbytes; | ||
844 | accum.rx_multicast += rxmulticast; | ||
845 | /* rx_errors is an ulong, not protected by syncp */ | ||
846 | accum.rx_errors += p->rx_errors; | ||
819 | } | 847 | } |
820 | stats->rx_packets = rx.rx_packets; | 848 | stats->rx_packets = accum.rx_packets; |
821 | stats->rx_bytes = rx.rx_bytes; | 849 | stats->rx_bytes = accum.rx_bytes; |
822 | stats->rx_errors = rx.rx_errors; | 850 | stats->rx_errors = accum.rx_errors; |
823 | stats->multicast = rx.multicast; | 851 | stats->multicast = accum.rx_multicast; |
824 | } | 852 | } |
825 | return stats; | 853 | return stats; |
826 | } | 854 | } |
827 | 855 | ||
856 | static int vlan_ethtool_set_tso(struct net_device *dev, u32 data) | ||
857 | { | ||
858 | if (data) { | ||
859 | struct net_device *real_dev = vlan_dev_info(dev)->real_dev; | ||
860 | |||
861 | /* Underlying device must support TSO for VLAN-tagged packets | ||
862 | * and must have TSO enabled now. | ||
863 | */ | ||
864 | if (!(real_dev->vlan_features & NETIF_F_TSO)) | ||
865 | return -EOPNOTSUPP; | ||
866 | if (!(real_dev->features & NETIF_F_TSO)) | ||
867 | return -EINVAL; | ||
868 | dev->features |= NETIF_F_TSO; | ||
869 | } else { | ||
870 | dev->features &= ~NETIF_F_TSO; | ||
871 | } | ||
872 | return 0; | ||
873 | } | ||
874 | |||
828 | static const struct ethtool_ops vlan_ethtool_ops = { | 875 | static const struct ethtool_ops vlan_ethtool_ops = { |
829 | .get_settings = vlan_ethtool_get_settings, | 876 | .get_settings = vlan_ethtool_get_settings, |
830 | .get_drvinfo = vlan_ethtool_get_drvinfo, | 877 | .get_drvinfo = vlan_ethtool_get_drvinfo, |
831 | .get_link = ethtool_op_get_link, | 878 | .get_link = ethtool_op_get_link, |
832 | .get_rx_csum = vlan_ethtool_get_rx_csum, | 879 | .get_rx_csum = vlan_ethtool_get_rx_csum, |
833 | .get_flags = vlan_ethtool_get_flags, | 880 | .get_flags = vlan_ethtool_get_flags, |
881 | .set_tso = vlan_ethtool_set_tso, | ||
834 | }; | 882 | }; |
835 | 883 | ||
836 | static const struct net_device_ops vlan_netdev_ops = { | 884 | static const struct net_device_ops vlan_netdev_ops = { |
@@ -847,7 +895,7 @@ static const struct net_device_ops vlan_netdev_ops = { | |||
847 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, | 895 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, |
848 | .ndo_do_ioctl = vlan_dev_ioctl, | 896 | .ndo_do_ioctl = vlan_dev_ioctl, |
849 | .ndo_neigh_setup = vlan_dev_neigh_setup, | 897 | .ndo_neigh_setup = vlan_dev_neigh_setup, |
850 | .ndo_get_stats = vlan_dev_get_stats, | 898 | .ndo_get_stats64 = vlan_dev_get_stats64, |
851 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | 899 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) |
852 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, | 900 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, |
853 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, | 901 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, |
@@ -871,7 +919,7 @@ static const struct net_device_ops vlan_netdev_accel_ops = { | |||
871 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, | 919 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, |
872 | .ndo_do_ioctl = vlan_dev_ioctl, | 920 | .ndo_do_ioctl = vlan_dev_ioctl, |
873 | .ndo_neigh_setup = vlan_dev_neigh_setup, | 921 | .ndo_neigh_setup = vlan_dev_neigh_setup, |
874 | .ndo_get_stats = vlan_dev_get_stats, | 922 | .ndo_get_stats64 = vlan_dev_get_stats64, |
875 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | 923 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) |
876 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, | 924 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, |
877 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, | 925 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, |
@@ -896,7 +944,7 @@ static const struct net_device_ops vlan_netdev_ops_sq = { | |||
896 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, | 944 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, |
897 | .ndo_do_ioctl = vlan_dev_ioctl, | 945 | .ndo_do_ioctl = vlan_dev_ioctl, |
898 | .ndo_neigh_setup = vlan_dev_neigh_setup, | 946 | .ndo_neigh_setup = vlan_dev_neigh_setup, |
899 | .ndo_get_stats = vlan_dev_get_stats, | 947 | .ndo_get_stats64 = vlan_dev_get_stats64, |
900 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | 948 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) |
901 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, | 949 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, |
902 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, | 950 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, |
@@ -921,7 +969,7 @@ static const struct net_device_ops vlan_netdev_accel_ops_sq = { | |||
921 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, | 969 | .ndo_change_rx_flags = vlan_dev_change_rx_flags, |
922 | .ndo_do_ioctl = vlan_dev_ioctl, | 970 | .ndo_do_ioctl = vlan_dev_ioctl, |
923 | .ndo_neigh_setup = vlan_dev_neigh_setup, | 971 | .ndo_neigh_setup = vlan_dev_neigh_setup, |
924 | .ndo_get_stats = vlan_dev_get_stats, | 972 | .ndo_get_stats64 = vlan_dev_get_stats64, |
925 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) | 973 | #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) |
926 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, | 974 | .ndo_fcoe_ddp_setup = vlan_dev_fcoe_ddp_setup, |
927 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, | 975 | .ndo_fcoe_ddp_done = vlan_dev_fcoe_ddp_done, |
diff --git a/net/8021q/vlanproc.c b/net/8021q/vlanproc.c index afead353e215..80e280f56686 100644 --- a/net/8021q/vlanproc.c +++ b/net/8021q/vlanproc.c | |||
@@ -278,25 +278,27 @@ static int vlandev_seq_show(struct seq_file *seq, void *offset) | |||
278 | { | 278 | { |
279 | struct net_device *vlandev = (struct net_device *) seq->private; | 279 | struct net_device *vlandev = (struct net_device *) seq->private; |
280 | const struct vlan_dev_info *dev_info = vlan_dev_info(vlandev); | 280 | const struct vlan_dev_info *dev_info = vlan_dev_info(vlandev); |
281 | const struct net_device_stats *stats; | 281 | struct rtnl_link_stats64 temp; |
282 | const struct rtnl_link_stats64 *stats; | ||
282 | static const char fmt[] = "%30s %12lu\n"; | 283 | static const char fmt[] = "%30s %12lu\n"; |
284 | static const char fmt64[] = "%30s %12llu\n"; | ||
283 | int i; | 285 | int i; |
284 | 286 | ||
285 | if (!is_vlan_dev(vlandev)) | 287 | if (!is_vlan_dev(vlandev)) |
286 | return 0; | 288 | return 0; |
287 | 289 | ||
288 | stats = dev_get_stats(vlandev); | 290 | stats = dev_get_stats(vlandev, &temp); |
289 | seq_printf(seq, | 291 | seq_printf(seq, |
290 | "%s VID: %d REORDER_HDR: %i dev->priv_flags: %hx\n", | 292 | "%s VID: %d REORDER_HDR: %i dev->priv_flags: %hx\n", |
291 | vlandev->name, dev_info->vlan_id, | 293 | vlandev->name, dev_info->vlan_id, |
292 | (int)(dev_info->flags & 1), vlandev->priv_flags); | 294 | (int)(dev_info->flags & 1), vlandev->priv_flags); |
293 | 295 | ||
294 | seq_printf(seq, fmt, "total frames received", stats->rx_packets); | 296 | seq_printf(seq, fmt64, "total frames received", stats->rx_packets); |
295 | seq_printf(seq, fmt, "total bytes received", stats->rx_bytes); | 297 | seq_printf(seq, fmt64, "total bytes received", stats->rx_bytes); |
296 | seq_printf(seq, fmt, "Broadcast/Multicast Rcvd", stats->multicast); | 298 | seq_printf(seq, fmt64, "Broadcast/Multicast Rcvd", stats->multicast); |
297 | seq_puts(seq, "\n"); | 299 | seq_puts(seq, "\n"); |
298 | seq_printf(seq, fmt, "total frames transmitted", stats->tx_packets); | 300 | seq_printf(seq, fmt64, "total frames transmitted", stats->tx_packets); |
299 | seq_printf(seq, fmt, "total bytes transmitted", stats->tx_bytes); | 301 | seq_printf(seq, fmt64, "total bytes transmitted", stats->tx_bytes); |
300 | seq_printf(seq, fmt, "total headroom inc", | 302 | seq_printf(seq, fmt, "total headroom inc", |
301 | dev_info->cnt_inc_headroom_on_tx); | 303 | dev_info->cnt_inc_headroom_on_tx); |
302 | seq_printf(seq, fmt, "total encap on xmit", | 304 | seq_printf(seq, fmt, "total encap on xmit", |