|
@@ -326,7 +326,7 @@ batadv_orig_ifinfo_get(struct batadv_orig_node *orig_node,
|
|
if (tmp->if_outgoing != if_outgoing)
|
|
if (tmp->if_outgoing != if_outgoing)
|
|
continue;
|
|
continue;
|
|
|
|
|
|
- if (!atomic_inc_not_zero(&tmp->refcount))
|
|
|
|
|
|
+ if (!kref_get_unless_zero(&tmp->refcount))
|
|
continue;
|
|
continue;
|
|
|
|
|
|
orig_ifinfo = tmp;
|
|
orig_ifinfo = tmp;
|
|
@@ -377,7 +377,8 @@ batadv_orig_ifinfo_new(struct batadv_orig_node *orig_node,
|
|
orig_ifinfo->batman_seqno_reset = reset_time;
|
|
orig_ifinfo->batman_seqno_reset = reset_time;
|
|
orig_ifinfo->if_outgoing = if_outgoing;
|
|
orig_ifinfo->if_outgoing = if_outgoing;
|
|
INIT_HLIST_NODE(&orig_ifinfo->list);
|
|
INIT_HLIST_NODE(&orig_ifinfo->list);
|
|
- atomic_set(&orig_ifinfo->refcount, 2);
|
|
|
|
|
|
+ kref_init(&orig_ifinfo->refcount);
|
|
|
|
+ kref_get(&orig_ifinfo->refcount);
|
|
hlist_add_head_rcu(&orig_ifinfo->list,
|
|
hlist_add_head_rcu(&orig_ifinfo->list,
|
|
&orig_node->ifinfo_list);
|
|
&orig_node->ifinfo_list);
|
|
out:
|
|
out:
|
|
@@ -704,12 +705,15 @@ int batadv_hardif_neigh_seq_print_text(struct seq_file *seq, void *offset)
|
|
/**
|
|
/**
|
|
* batadv_orig_ifinfo_release - release orig_ifinfo from lists and queue for
|
|
* batadv_orig_ifinfo_release - release orig_ifinfo from lists and queue for
|
|
* free after rcu grace period
|
|
* free after rcu grace period
|
|
- * @orig_ifinfo: the orig_ifinfo object to release
|
|
|
|
|
|
+ * @ref: kref pointer of the orig_ifinfo
|
|
*/
|
|
*/
|
|
-static void batadv_orig_ifinfo_release(struct batadv_orig_ifinfo *orig_ifinfo)
|
|
|
|
|
|
+static void batadv_orig_ifinfo_release(struct kref *ref)
|
|
{
|
|
{
|
|
|
|
+ struct batadv_orig_ifinfo *orig_ifinfo;
|
|
struct batadv_neigh_node *router;
|
|
struct batadv_neigh_node *router;
|
|
|
|
|
|
|
|
+ orig_ifinfo = container_of(ref, struct batadv_orig_ifinfo, refcount);
|
|
|
|
+
|
|
if (orig_ifinfo->if_outgoing != BATADV_IF_DEFAULT)
|
|
if (orig_ifinfo->if_outgoing != BATADV_IF_DEFAULT)
|
|
batadv_hardif_free_ref(orig_ifinfo->if_outgoing);
|
|
batadv_hardif_free_ref(orig_ifinfo->if_outgoing);
|
|
|
|
|
|
@@ -728,8 +732,7 @@ static void batadv_orig_ifinfo_release(struct batadv_orig_ifinfo *orig_ifinfo)
|
|
*/
|
|
*/
|
|
void batadv_orig_ifinfo_free_ref(struct batadv_orig_ifinfo *orig_ifinfo)
|
|
void batadv_orig_ifinfo_free_ref(struct batadv_orig_ifinfo *orig_ifinfo)
|
|
{
|
|
{
|
|
- if (atomic_dec_and_test(&orig_ifinfo->refcount))
|
|
|
|
- batadv_orig_ifinfo_release(orig_ifinfo);
|
|
|
|
|
|
+ kref_put(&orig_ifinfo->refcount, batadv_orig_ifinfo_release);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|