public inbox for b.a.t.m.a.n@lists.open-mesh.org
 help / color / mirror / Atom feed
From: Sven Eckelmann <sven@narfation.org>
To: b.a.t.m.a.n@lists.open-mesh.org
Subject: [B.A.T.M.A.N.] [PATCH v6 13/20] batman-adv: Convert batadv_neigh_ifinfo to kref
Date: Sat, 16 Jan 2016 10:29:51 +0100	[thread overview]
Message-ID: <1452936598-28619-13-git-send-email-sven@narfation.org> (raw)
In-Reply-To: <1452936598-28619-1-git-send-email-sven@narfation.org>

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: Sven Eckelmann <sven@narfation.org>
---
v6:
 - removed patches which are now applied in the branch next
 - rebased remaining patches on the patch
   "batman-adv: Avoid recursive call_rcu for batadv_nc_node" which was
   modified by Marek while he applied the patches (this unfortunately made
   some of the remaining patches "hard" to apply)
v5:
 - add hack which allows to compile against stable kernel like 3.2.44 which
   also added the kref_get_unless_zero function
v4:
 - fix function names in commit messages
 - fix double whitespace in batadv_tt_orig_list_entry_release kerneldoc
 - add extra patch for batadv_claim_free_ref kerneldoc fix
 - change the phrase "free it" in all *_free_ref/*_put functions to "release it"
v3:
 - update copyright year
v2:
 - split patchset into fixes and kref migration to make it easier when the
   decision is made where each patch will be applied

 net/batman-adv/originator.c | 17 ++++++++++-------
 net/batman-adv/types.h      |  2 +-
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/net/batman-adv/originator.c b/net/batman-adv/originator.c
index 7710595..1c50abe 100644
--- a/net/batman-adv/originator.c
+++ b/net/batman-adv/originator.c
@@ -172,11 +172,14 @@ err:
 /**
  * batadv_neigh_ifinfo_release - release neigh_ifinfo from lists and queue for
  *  free after rcu grace period
- * @neigh_ifinfo: the neigh_ifinfo object to release
+ * @ref: kref pointer of the neigh_ifinfo
  */
-static void
-batadv_neigh_ifinfo_release(struct batadv_neigh_ifinfo *neigh_ifinfo)
+static void batadv_neigh_ifinfo_release(struct kref *ref)
 {
+	struct batadv_neigh_ifinfo *neigh_ifinfo;
+
+	neigh_ifinfo = container_of(ref, struct batadv_neigh_ifinfo, refcount);
+
 	if (neigh_ifinfo->if_outgoing != BATADV_IF_DEFAULT)
 		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)
 {
-	if (atomic_dec_and_test(&neigh_ifinfo->refcount))
-		batadv_neigh_ifinfo_release(neigh_ifinfo);
+	kref_put(&neigh_ifinfo->refcount, batadv_neigh_ifinfo_release);
 }
 
 /**
@@ -405,7 +407,7 @@ batadv_neigh_ifinfo_get(struct batadv_neigh_node *neigh,
 		if (tmp_neigh_ifinfo->if_outgoing != if_outgoing)
 			continue;
 
-		if (!atomic_inc_not_zero(&tmp_neigh_ifinfo->refcount))
+		if (!kref_get_unless_zero(&tmp_neigh_ifinfo->refcount))
 			continue;
 
 		neigh_ifinfo = tmp_neigh_ifinfo;
@@ -450,7 +452,8 @@ batadv_neigh_ifinfo_new(struct batadv_neigh_node *neigh,
 	}
 
 	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;
 
 	hlist_add_head_rcu(&neigh_ifinfo->list, &neigh->ifinfo_list);
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
index 17f97ff..81d9f8d 100644
--- a/net/batman-adv/types.h
+++ b/net/batman-adv/types.h
@@ -420,7 +420,7 @@ struct batadv_neigh_ifinfo {
 	struct batadv_hard_iface *if_outgoing;
 	struct batadv_neigh_ifinfo_bat_iv bat_iv;
 	u8 last_ttl;
-	atomic_t refcount;
+	struct kref refcount;
 	struct rcu_head rcu;
 };
 
-- 
2.7.0.rc3


  parent reply	other threads:[~2016-01-16  9:29 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-16  9:29 [B.A.T.M.A.N.] [PATCH v6 01/20] batman-adv: Add compatibility code for kref_get_unless_zero Sven Eckelmann
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 02/20] batman-adv: Convert batadv_hardif_neigh_node to kref Sven Eckelmann
2016-01-17  5:20   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 03/20] batman-adv: Convert batadv_gw_node " Sven Eckelmann
2016-01-17  5:22   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 04/20] batman-adv: Convert batadv_softif_vlan " Sven Eckelmann
2016-01-17  5:23   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 05/20] batman-adv: Convert batadv_bla_backbone_gw " Sven Eckelmann
2016-01-17  5:25   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 06/20] batman-adv: Convert batadv_bla_claim " Sven Eckelmann
2016-01-17  5:26   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 07/20] batman-adv: Convert batadv_nc_node " Sven Eckelmann
2016-01-17  5:28   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 08/20] batman-adv: Convert batadv_nc_path " Sven Eckelmann
2016-01-17  5:30   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 09/20] batman-adv: Convert batadv_dat_entry " Sven Eckelmann
2016-01-17  5:32   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 10/20] batman-adv: Convert batadv_tvlv_container " Sven Eckelmann
2016-01-17  5:33   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 11/20] batman-adv: Convert batadv_tvlv_handler " Sven Eckelmann
2016-01-17  6:51   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 12/20] batman-adv: Convert batadv_tt_orig_list_entry " Sven Eckelmann
2016-01-17  6:56   ` Marek Lindner
2016-01-16  9:29 ` Sven Eckelmann [this message]
2016-01-17  6:57   ` [B.A.T.M.A.N.] [PATCH v6 13/20] batman-adv: Convert batadv_neigh_ifinfo " Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 14/20] batman-adv: Convert batadv_orig_ifinfo " Sven Eckelmann
2016-01-17  6:59   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 15/20] batman-adv: Convert batadv_neigh_node " Sven Eckelmann
2016-01-17  7:01   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 16/20] batman-adv: Convert batadv_hard_iface " Sven Eckelmann
2016-01-17  8:35   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 17/20] batman-adv: Convert batadv_orig_node_vlan " Sven Eckelmann
2016-01-17  8:38   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 18/20] batman-adv: Convert batadv_orig_node " Sven Eckelmann
2016-01-17  8:40   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 19/20] batman-adv: Convert batadv_tt_common_entry " Sven Eckelmann
2016-01-17  8:42   ` Marek Lindner
2016-01-16  9:29 ` [B.A.T.M.A.N.] [PATCH v6 20/20] batman-adv: Rename *_free_ref function to *_put Sven Eckelmann
2016-01-17  5:17 ` [B.A.T.M.A.N.] [PATCH v6 01/20] batman-adv: Add compatibility code for kref_get_unless_zero Marek Lindner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1452936598-28619-13-git-send-email-sven@narfation.org \
    --to=sven@narfation.org \
    --cc=b.a.t.m.a.n@lists.open-mesh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox