aboutsummaryrefslogtreecommitdiffstats
path: root/net/batman-adv/soft-interface.c
diff options
context:
space:
mode:
authorMarek Lindner <lindner_marek@yahoo.de>2012-06-23 05:47:53 -0400
committerAntonio Quartulli <ordex@autistici.org>2012-08-23 08:02:43 -0400
commit1c9b0550f4813c4931b4e142c80f5c89be9489ec (patch)
tree6c0434999f324b964a7fe837f855aa002080b213 /net/batman-adv/soft-interface.c
parent3eb8773e3a24d88ca528993af3756af70f307a82 (diff)
batman-adv: convert remaining packet counters to per_cpu_ptr() infrastructure
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de> Acked-by: Martin Hundebøll <martin@hundeboll.net> Signed-off-by: Antonio Quartulli <ordex@autistici.org>
Diffstat (limited to 'net/batman-adv/soft-interface.c')
-rw-r--r--net/batman-adv/soft-interface.c51
1 files changed, 34 insertions, 17 deletions
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
index 109ea2aae96c..2b3842b99096 100644
--- a/net/batman-adv/soft-interface.c
+++ b/net/batman-adv/soft-interface.c
@@ -93,7 +93,14 @@ static int batadv_interface_release(struct net_device *dev)
93static struct net_device_stats *batadv_interface_stats(struct net_device *dev) 93static struct net_device_stats *batadv_interface_stats(struct net_device *dev)
94{ 94{
95 struct batadv_priv *bat_priv = netdev_priv(dev); 95 struct batadv_priv *bat_priv = netdev_priv(dev);
96 return &bat_priv->stats; 96 struct net_device_stats *stats = &bat_priv->stats;
97
98 stats->tx_packets = batadv_sum_counter(bat_priv, BATADV_CNT_TX);
99 stats->tx_bytes = batadv_sum_counter(bat_priv, BATADV_CNT_TX_BYTES);
100 stats->tx_dropped = batadv_sum_counter(bat_priv, BATADV_CNT_TX_DROPPED);
101 stats->rx_packets = batadv_sum_counter(bat_priv, BATADV_CNT_RX);
102 stats->rx_bytes = batadv_sum_counter(bat_priv, BATADV_CNT_RX_BYTES);
103 return stats;
97} 104}
98 105
99static int batadv_interface_set_mac_addr(struct net_device *dev, void *p) 106static int batadv_interface_set_mac_addr(struct net_device *dev, void *p)
@@ -246,14 +253,14 @@ static int batadv_interface_tx(struct sk_buff *skb,
246 goto dropped_freed; 253 goto dropped_freed;
247 } 254 }
248 255
249 bat_priv->stats.tx_packets++; 256 batadv_inc_counter(bat_priv, BATADV_CNT_TX);
250 bat_priv->stats.tx_bytes += data_len; 257 batadv_add_counter(bat_priv, BATADV_CNT_TX_BYTES, data_len);
251 goto end; 258 goto end;
252 259
253dropped: 260dropped:
254 kfree_skb(skb); 261 kfree_skb(skb);
255dropped_freed: 262dropped_freed:
256 bat_priv->stats.tx_dropped++; 263 batadv_inc_counter(bat_priv, BATADV_CNT_TX_DROPPED);
257end: 264end:
258 if (primary_if) 265 if (primary_if)
259 batadv_hardif_free_ref(primary_if); 266 batadv_hardif_free_ref(primary_if);
@@ -308,8 +315,9 @@ void batadv_interface_rx(struct net_device *soft_iface,
308 315
309 /* skb->ip_summed = CHECKSUM_UNNECESSARY; */ 316 /* skb->ip_summed = CHECKSUM_UNNECESSARY; */
310 317
311 bat_priv->stats.rx_packets++; 318 batadv_inc_counter(bat_priv, BATADV_CNT_RX);
312 bat_priv->stats.rx_bytes += skb->len + ETH_HLEN; 319 batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
320 skb->len + ETH_HLEN);
313 321
314 soft_iface->last_rx = jiffies; 322 soft_iface->last_rx = jiffies;
315 323
@@ -379,15 +387,22 @@ struct net_device *batadv_softif_create(const char *name)
379 if (!soft_iface) 387 if (!soft_iface)
380 goto out; 388 goto out;
381 389
390 bat_priv = netdev_priv(soft_iface);
391
392 /* batadv_interface_stats() needs to be available as soon as
393 * register_netdevice() has been called
394 */
395 bat_priv->bat_counters = __alloc_percpu(cnt_len, __alignof__(uint64_t));
396 if (!bat_priv->bat_counters)
397 goto free_soft_iface;
398
382 ret = register_netdevice(soft_iface); 399 ret = register_netdevice(soft_iface);
383 if (ret < 0) { 400 if (ret < 0) {
384 pr_err("Unable to register the batman interface '%s': %i\n", 401 pr_err("Unable to register the batman interface '%s': %i\n",
385 name, ret); 402 name, ret);
386 goto free_soft_iface; 403 goto free_bat_counters;
387 } 404 }
388 405
389 bat_priv = netdev_priv(soft_iface);
390
391 atomic_set(&bat_priv->aggregated_ogms, 1); 406 atomic_set(&bat_priv->aggregated_ogms, 1);
392 atomic_set(&bat_priv->bonding, 0); 407 atomic_set(&bat_priv->bonding, 0);
393 atomic_set(&bat_priv->bridge_loop_avoidance, 0); 408 atomic_set(&bat_priv->bridge_loop_avoidance, 0);
@@ -417,17 +432,13 @@ struct net_device *batadv_softif_create(const char *name)
417 bat_priv->primary_if = NULL; 432 bat_priv->primary_if = NULL;
418 bat_priv->num_ifaces = 0; 433 bat_priv->num_ifaces = 0;
419 434
420 bat_priv->bat_counters = __alloc_percpu(cnt_len, __alignof__(uint64_t));
421 if (!bat_priv->bat_counters)
422 goto unreg_soft_iface;
423
424 ret = batadv_algo_select(bat_priv, batadv_routing_algo); 435 ret = batadv_algo_select(bat_priv, batadv_routing_algo);
425 if (ret < 0) 436 if (ret < 0)
426 goto free_bat_counters; 437 goto unreg_soft_iface;
427 438
428 ret = batadv_sysfs_add_meshif(soft_iface); 439 ret = batadv_sysfs_add_meshif(soft_iface);
429 if (ret < 0) 440 if (ret < 0)
430 goto free_bat_counters; 441 goto unreg_soft_iface;
431 442
432 ret = batadv_debugfs_add_meshif(soft_iface); 443 ret = batadv_debugfs_add_meshif(soft_iface);
433 if (ret < 0) 444 if (ret < 0)
@@ -443,12 +454,13 @@ unreg_debugfs:
443 batadv_debugfs_del_meshif(soft_iface); 454 batadv_debugfs_del_meshif(soft_iface);
444unreg_sysfs: 455unreg_sysfs:
445 batadv_sysfs_del_meshif(soft_iface); 456 batadv_sysfs_del_meshif(soft_iface);
446free_bat_counters:
447 free_percpu(bat_priv->bat_counters);
448unreg_soft_iface: 457unreg_soft_iface:
458 free_percpu(bat_priv->bat_counters);
449 unregister_netdevice(soft_iface); 459 unregister_netdevice(soft_iface);
450 return NULL; 460 return NULL;
451 461
462free_bat_counters:
463 free_percpu(bat_priv->bat_counters);
452free_soft_iface: 464free_soft_iface:
453 free_netdev(soft_iface); 465 free_netdev(soft_iface);
454out: 466out:
@@ -518,6 +530,11 @@ static u32 batadv_get_link(struct net_device *dev)
518static const struct { 530static const struct {
519 const char name[ETH_GSTRING_LEN]; 531 const char name[ETH_GSTRING_LEN];
520} batadv_counters_strings[] = { 532} batadv_counters_strings[] = {
533 { "tx" },
534 { "tx_bytes" },
535 { "tx_dropped" },
536 { "rx" },
537 { "rx_bytes" },
521 { "forward" }, 538 { "forward" },
522 { "forward_bytes" }, 539 { "forward_bytes" },
523 { "mgmt_tx" }, 540 { "mgmt_tx" },