mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 13:14:07 +08:00
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: Sven Eckelmann <sven@narfation.org> Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch> Signed-off-by: Antonio Quartulli <a@unstable.cc>
This commit is contained in:
parent
aaa5672052
commit
140ed8e87c
@ -47,13 +47,16 @@
|
||||
#include "sysfs.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);
|
||||
kfree(hard_iface);
|
||||
|
||||
kfree_rcu(hard_iface, rcu);
|
||||
}
|
||||
|
||||
struct batadv_hard_iface *
|
||||
|
@ -61,18 +61,18 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
|
||||
void batadv_hardif_remove_interfaces(void);
|
||||
int batadv_hardif_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
|
||||
* possibly free it
|
||||
* possibly release it
|
||||
* @hard_iface: the hard interface to free
|
||||
*/
|
||||
static inline void
|
||||
batadv_hardif_free_ref(struct batadv_hard_iface *hard_iface)
|
||||
{
|
||||
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 *
|
||||
|
Loading…
Reference in New Issue
Block a user