Thread (3 messages) 3 messages, 2 authors, 2025-02-06

Re: [PATCH net-next] batman-adv: adopt netdev_hold() / netdev_put()

From: Eric Dumazet <edumazet@google.com>
Date: 2025-02-06 15:25:03
Also in: batman
Subsystem: batman advanced, the rest · Maintainers: Marek Lindner, Simon Wunderlich, Antonio Quartulli, Sven Eckelmann, Linus Torvalds

On Thu, Feb 6, 2025 at 3:13 PM Antonio Quartulli [off-list ref] wrote:
On 06/02/2025 15:04, Eric Dumazet wrote:
quoted
Add a device tracker to struct batadv_hard_iface to help
debugging of network device refcount imbalances.

Signed-off-by: Eric Dumazet <edumazet@google.com>
---
  net/batman-adv/hard-interface.c | 14 +++++---------
  net/batman-adv/types.h          |  3 +++
  2 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
index 96a412beab2de9069c0f88e4cd844fbc0922aa18..9a3ae567eb12d0c65b25292d020462b6ad60b699 100644
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@ -51,7 +51,7 @@ void batadv_hardif_release(struct kref *ref)
      struct batadv_hard_iface *hard_iface;

      hard_iface = container_of(ref, struct batadv_hard_iface, refcount);
-     dev_put(hard_iface->net_dev);
+     netdev_put(hard_iface->net_dev, &hard_iface->dev_tracker);

      kfree_rcu(hard_iface, rcu);
  }
@@ -875,15 +875,16 @@ batadv_hardif_add_interface(struct net_device *net_dev)
      ASSERT_RTNL();

      if (!batadv_is_valid_iface(net_dev))
-             goto out;
+             return NULL;

-     dev_hold(net_dev);

      hard_iface = kzalloc(sizeof(*hard_iface), GFP_ATOMIC);
      if (!hard_iface)
-             goto release_dev;
+             return NULL;

+     netdev_hold(net_dev, &hard_iface->dev_tracker, GFP_ATOMIC);
      hard_iface->net_dev = net_dev;
+
      hard_iface->soft_iface = NULL;
      hard_iface->if_status = BATADV_IF_NOT_IN_USE;
@@ -909,11 +910,6 @@ batadv_hardif_add_interface(struct net_device *net_dev)
      batadv_hardif_generation++;

      return hard_iface;
-
-release_dev:
-     dev_put(net_dev);
-out:
-     return NULL;
  }

  static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface)
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
index f491bff8c51b8bf68eb11dbbeb1a434d446c25f0..a73fc3ab7dd28ae2c8484c0d198a15437d49ea73 100644
--- a/net/batman-adv/types.h
+++ b/net/batman-adv/types.h
@@ -186,6 +186,9 @@ struct batadv_hard_iface {
      /** @net_dev: pointer to the net_device */
      struct net_device *net_dev;

+     /** @dev_tracker device tracker for @net_dev */
+     netdevice_tracker  dev_tracker;
There are two blanks between type and member name. Is that intended?
Not intended. Also a : is missing :

I can submit a V2 if you want, or feel free to make the changes.
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
index a73fc3ab7dd28ae2c8484c0d198a15437d49ea73..8ac061379b6f72ef7f1d4e191888db2cc56376da
100644
--- a/net/batman-adv/types.h
+++ b/net/batman-adv/types.h
@@ -186,8 +186,8 @@ struct batadv_hard_iface {
        /** @net_dev: pointer to the net_device */
        struct net_device *net_dev;

-       /** @dev_tracker device tracker for @net_dev */
-       netdevice_tracker  dev_tracker;
+       /** @dev_tracker: device tracker for @net_dev */
+       netdevice_tracker dev_tracker;

        /** @refcount: number of contexts the object is used */
        struct kref refcount;

quoted
+
      /** @refcount: number of contexts the object is used */
      struct kref refcount;
We also have hard_iface->soft_iface storing a pointer to the soft_iface
(batX) netdev.

How about converting that to netdev_put/hold as well?
See batadv_hardif_enable_interface() / batadv_hardif_disable_interface()
Sure, feel free to submit a patch for this one as well.

Thanks.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help