Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+10 −7
Original line number Original line Diff line number Diff line
@@ -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)
 */
 */
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,
		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,
	}
	}


	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);
+1 −1
Original line number Original line Diff line number Diff line
@@ -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;
};
};