Commit 962c6832 authored by Sven Eckelmann's avatar Sven Eckelmann Committed by Antonio Quartulli

batman-adv: Convert batadv_neigh_ifinfo to kref

batman-adv uses a self-written reference implementation which is just based
on atomic_t. This is less obvious when reading the code than kref and
therefore increases the change that the reference counting will be missed.
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 6e8ef69d
...@@ -172,11 +172,14 @@ int batadv_originator_init(struct batadv_priv *bat_priv) ...@@ -172,11 +172,14 @@ int batadv_originator_init(struct batadv_priv *bat_priv)
/** /**
* batadv_neigh_ifinfo_release - release neigh_ifinfo from lists and queue for * batadv_neigh_ifinfo_release - release neigh_ifinfo from lists and queue for
* free after rcu grace period * free after rcu grace period
* @neigh_ifinfo: the neigh_ifinfo object to release * @ref: kref pointer of the neigh_ifinfo
*/ */
static void static void batadv_neigh_ifinfo_release(struct kref *ref)
batadv_neigh_ifinfo_release(struct batadv_neigh_ifinfo *neigh_ifinfo)
{ {
struct batadv_neigh_ifinfo *neigh_ifinfo;
neigh_ifinfo = container_of(ref, struct batadv_neigh_ifinfo, refcount);
if (neigh_ifinfo->if_outgoing != BATADV_IF_DEFAULT) if (neigh_ifinfo->if_outgoing != BATADV_IF_DEFAULT)
batadv_hardif_free_ref(neigh_ifinfo->if_outgoing); batadv_hardif_free_ref(neigh_ifinfo->if_outgoing);
...@@ -190,8 +193,7 @@ batadv_neigh_ifinfo_release(struct batadv_neigh_ifinfo *neigh_ifinfo) ...@@ -190,8 +193,7 @@ batadv_neigh_ifinfo_release(struct batadv_neigh_ifinfo *neigh_ifinfo)
*/ */
void batadv_neigh_ifinfo_free_ref(struct batadv_neigh_ifinfo *neigh_ifinfo) void batadv_neigh_ifinfo_free_ref(struct batadv_neigh_ifinfo *neigh_ifinfo)
{ {
if (atomic_dec_and_test(&neigh_ifinfo->refcount)) kref_put(&neigh_ifinfo->refcount, batadv_neigh_ifinfo_release);
batadv_neigh_ifinfo_release(neigh_ifinfo);
} }
/** /**
...@@ -405,7 +407,7 @@ batadv_neigh_ifinfo_get(struct batadv_neigh_node *neigh, ...@@ -405,7 +407,7 @@ batadv_neigh_ifinfo_get(struct batadv_neigh_node *neigh,
if (tmp_neigh_ifinfo->if_outgoing != if_outgoing) if (tmp_neigh_ifinfo->if_outgoing != if_outgoing)
continue; continue;
if (!atomic_inc_not_zero(&tmp_neigh_ifinfo->refcount)) if (!kref_get_unless_zero(&tmp_neigh_ifinfo->refcount))
continue; continue;
neigh_ifinfo = tmp_neigh_ifinfo; neigh_ifinfo = tmp_neigh_ifinfo;
...@@ -450,7 +452,8 @@ batadv_neigh_ifinfo_new(struct batadv_neigh_node *neigh, ...@@ -450,7 +452,8 @@ batadv_neigh_ifinfo_new(struct batadv_neigh_node *neigh,
} }
INIT_HLIST_NODE(&neigh_ifinfo->list); INIT_HLIST_NODE(&neigh_ifinfo->list);
atomic_set(&neigh_ifinfo->refcount, 2); kref_init(&neigh_ifinfo->refcount);
kref_get(&neigh_ifinfo->refcount);
neigh_ifinfo->if_outgoing = if_outgoing; neigh_ifinfo->if_outgoing = if_outgoing;
hlist_add_head_rcu(&neigh_ifinfo->list, &neigh->ifinfo_list); hlist_add_head_rcu(&neigh_ifinfo->list, &neigh->ifinfo_list);
......
...@@ -420,7 +420,7 @@ struct batadv_neigh_ifinfo { ...@@ -420,7 +420,7 @@ struct batadv_neigh_ifinfo {
struct batadv_hard_iface *if_outgoing; struct batadv_hard_iface *if_outgoing;
struct batadv_neigh_ifinfo_bat_iv bat_iv; struct batadv_neigh_ifinfo_bat_iv bat_iv;
u8 last_ttl; u8 last_ttl;
atomic_t refcount; struct kref refcount;
struct rcu_head rcu; struct rcu_head rcu;
}; };
......
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