Commit 140ed8e8 authored by Sven Eckelmann's avatar Sven Eckelmann Committed by Antonio Quartulli

batman-adv: Drop reference to netdevice on last reference

The references to the network device should be dropped inside the release
function for batadv_hard_iface similar to what is done with the batman-adv
internal datastructures.
Signed-off-by: default avatarSven Eckelmann <sven@narfation.org>
Signed-off-by: default avatarMarek Lindner <mareklindner@neomailbox.ch>
Signed-off-by: default avatarAntonio Quartulli <a@unstable.cc>
parent aaa56720
...@@ -47,13 +47,16 @@ ...@@ -47,13 +47,16 @@
#include "sysfs.h" #include "sysfs.h"
#include "translation-table.h" #include "translation-table.h"
void batadv_hardif_free_rcu(struct rcu_head *rcu) /**
* batadv_hardif_release - release hard interface from lists and queue for
* free after rcu grace period
* @hard_iface: the hard interface to free
*/
void batadv_hardif_release(struct batadv_hard_iface *hard_iface)
{ {
struct batadv_hard_iface *hard_iface;
hard_iface = container_of(rcu, struct batadv_hard_iface, rcu);
dev_put(hard_iface->net_dev); dev_put(hard_iface->net_dev);
kfree(hard_iface);
kfree_rcu(hard_iface, rcu);
} }
struct batadv_hard_iface * struct batadv_hard_iface *
......
...@@ -61,18 +61,18 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface, ...@@ -61,18 +61,18 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
void batadv_hardif_remove_interfaces(void); void batadv_hardif_remove_interfaces(void);
int batadv_hardif_min_mtu(struct net_device *soft_iface); int batadv_hardif_min_mtu(struct net_device *soft_iface);
void batadv_update_min_mtu(struct net_device *soft_iface); void batadv_update_min_mtu(struct net_device *soft_iface);
void batadv_hardif_free_rcu(struct rcu_head *rcu); void batadv_hardif_release(struct batadv_hard_iface *hard_iface);
/** /**
* batadv_hardif_free_ref - decrement the hard interface refcounter and * batadv_hardif_free_ref - decrement the hard interface refcounter and
* possibly free it * possibly release it
* @hard_iface: the hard interface to free * @hard_iface: the hard interface to free
*/ */
static inline void static inline void
batadv_hardif_free_ref(struct batadv_hard_iface *hard_iface) batadv_hardif_free_ref(struct batadv_hard_iface *hard_iface)
{ {
if (atomic_dec_and_test(&hard_iface->refcount)) if (atomic_dec_and_test(&hard_iface->refcount))
call_rcu(&hard_iface->rcu, batadv_hardif_free_rcu); batadv_hardif_release(hard_iface);
} }
static inline struct batadv_hard_iface * static inline struct batadv_hard_iface *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment