Skip to content

Commit 1c9b055

Browse files
Marek LindnerAntonio Quartulli
authored andcommitted
batman-adv: convert remaining packet counters to per_cpu_ptr() infrastructure
Signed-off-by: Marek Lindner <[email protected]> Acked-by: Martin Hundebøll <[email protected]> Signed-off-by: Antonio Quartulli <[email protected]>
1 parent 3eb8773 commit 1c9b055

File tree

3 files changed

+42
-19
lines changed

3 files changed

+42
-19
lines changed

net/batman-adv/bridge_loop_avoidance.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,8 +340,9 @@ static void batadv_bla_send_claim(struct batadv_priv *bat_priv, uint8_t *mac,
340340

341341
skb_reset_mac_header(skb);
342342
skb->protocol = eth_type_trans(skb, soft_iface);
343-
bat_priv->stats.rx_packets++;
344-
bat_priv->stats.rx_bytes += skb->len + ETH_HLEN;
343+
batadv_inc_counter(bat_priv, BATADV_CNT_RX);
344+
batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
345+
skb->len + ETH_HLEN);
345346
soft_iface->last_rx = jiffies;
346347

347348
netif_rx(skb);

net/batman-adv/soft-interface.c

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,14 @@ static int batadv_interface_release(struct net_device *dev)
9393
static struct net_device_stats *batadv_interface_stats(struct net_device *dev)
9494
{
9595
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;
97104
}
98105

99106
static 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,
246253
goto dropped_freed;
247254
}
248255

249-
bat_priv->stats.tx_packets++;
250-
bat_priv->stats.tx_bytes += data_len;
256+
batadv_inc_counter(bat_priv, BATADV_CNT_TX);
257+
batadv_add_counter(bat_priv, BATADV_CNT_TX_BYTES, data_len);
251258
goto end;
252259

253260
dropped:
254261
kfree_skb(skb);
255262
dropped_freed:
256-
bat_priv->stats.tx_dropped++;
263+
batadv_inc_counter(bat_priv, BATADV_CNT_TX_DROPPED);
257264
end:
258265
if (primary_if)
259266
batadv_hardif_free_ref(primary_if);
@@ -308,8 +315,9 @@ void batadv_interface_rx(struct net_device *soft_iface,
308315

309316
/* skb->ip_summed = CHECKSUM_UNNECESSARY; */
310317

311-
bat_priv->stats.rx_packets++;
312-
bat_priv->stats.rx_bytes += skb->len + ETH_HLEN;
318+
batadv_inc_counter(bat_priv, BATADV_CNT_RX);
319+
batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
320+
skb->len + ETH_HLEN);
313321

314322
soft_iface->last_rx = jiffies;
315323

@@ -379,15 +387,22 @@ struct net_device *batadv_softif_create(const char *name)
379387
if (!soft_iface)
380388
goto out;
381389

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+
382399
ret = register_netdevice(soft_iface);
383400
if (ret < 0) {
384401
pr_err("Unable to register the batman interface '%s': %i\n",
385402
name, ret);
386-
goto free_soft_iface;
403+
goto free_bat_counters;
387404
}
388405

389-
bat_priv = netdev_priv(soft_iface);
390-
391406
atomic_set(&bat_priv->aggregated_ogms, 1);
392407
atomic_set(&bat_priv->bonding, 0);
393408
atomic_set(&bat_priv->bridge_loop_avoidance, 0);
@@ -417,17 +432,13 @@ struct net_device *batadv_softif_create(const char *name)
417432
bat_priv->primary_if = NULL;
418433
bat_priv->num_ifaces = 0;
419434

420-
bat_priv->bat_counters = __alloc_percpu(cnt_len, __alignof__(uint64_t));
421-
if (!bat_priv->bat_counters)
422-
goto unreg_soft_iface;
423-
424435
ret = batadv_algo_select(bat_priv, batadv_routing_algo);
425436
if (ret < 0)
426-
goto free_bat_counters;
437+
goto unreg_soft_iface;
427438

428439
ret = batadv_sysfs_add_meshif(soft_iface);
429440
if (ret < 0)
430-
goto free_bat_counters;
441+
goto unreg_soft_iface;
431442

432443
ret = batadv_debugfs_add_meshif(soft_iface);
433444
if (ret < 0)
@@ -443,12 +454,13 @@ struct net_device *batadv_softif_create(const char *name)
443454
batadv_debugfs_del_meshif(soft_iface);
444455
unreg_sysfs:
445456
batadv_sysfs_del_meshif(soft_iface);
446-
free_bat_counters:
447-
free_percpu(bat_priv->bat_counters);
448457
unreg_soft_iface:
458+
free_percpu(bat_priv->bat_counters);
449459
unregister_netdevice(soft_iface);
450460
return NULL;
451461

462+
free_bat_counters:
463+
free_percpu(bat_priv->bat_counters);
452464
free_soft_iface:
453465
free_netdev(soft_iface);
454466
out:
@@ -518,6 +530,11 @@ static u32 batadv_get_link(struct net_device *dev)
518530
static const struct {
519531
const char name[ETH_GSTRING_LEN];
520532
} batadv_counters_strings[] = {
533+
{ "tx" },
534+
{ "tx_bytes" },
535+
{ "tx_dropped" },
536+
{ "rx" },
537+
{ "rx_bytes" },
521538
{ "forward" },
522539
{ "forward_bytes" },
523540
{ "mgmt_tx" },

net/batman-adv/types.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,11 @@ struct batadv_bcast_duplist_entry {
145145
#endif
146146

147147
enum batadv_counters {
148+
BATADV_CNT_TX,
149+
BATADV_CNT_TX_BYTES,
150+
BATADV_CNT_TX_DROPPED,
151+
BATADV_CNT_RX,
152+
BATADV_CNT_RX_BYTES,
148153
BATADV_CNT_FORWARD,
149154
BATADV_CNT_FORWARD_BYTES,
150155
BATADV_CNT_MGMT_TX,

0 commit comments

Comments
 (0)