All of lore.kernel.org
 help / color / mirror / Atom feed
From: Antonio Quartulli <a@unstable.cc>
To: davem@davemloft.net
Cc: netdev@vger.kernel.org, b.a.t.m.a.n@lists.open-mesh.org,
	Sven Eckelmann <sven@narfation.org>,
	Marek Lindner <mareklindner@neomailbox.ch>,
	Antonio Quartulli <a@unstable.cc>
Subject: [PATCH 2/8] batman-adv: Avoid recursive call_rcu for batadv_nc_node
Date: Sun, 17 Jan 2016 13:24:35 +0800	[thread overview]
Message-ID: <1453008281-15396-3-git-send-email-a__32529.1609777652$1453008479$gmane$org@unstable.cc> (raw)
In-Reply-To: <1453008281-15396-1-git-send-email-a@unstable.cc>

From: Sven Eckelmann <sven@narfation.org>

The batadv_nc_node_free_ref function uses call_rcu to delay the free of the
batadv_nc_node object until no (already started) rcu_read_lock is enabled
anymore. This makes sure that no context is still trying to access the
object which should be removed. But batadv_nc_node also contains a
reference to orig_node which must be removed.

The reference drop of orig_node was done in the call_rcu function
batadv_nc_node_free_rcu but should actually be done in the
batadv_nc_node_release function to avoid nested call_rcus. This is
important because rcu_barrier (e.g. batadv_softif_free or batadv_exit) will
not detect the inner call_rcu as relevant for its execution. Otherwise this
barrier will most likely be inserted in the queue before the callback of
the first call_rcu was executed. The caller of rcu_barrier will therefore
continue to run before the inner call_rcu callback finished.

Fixes: d56b1705e28c ("batman-adv: network coding - detect coding nodes and remove these after timeout")
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
Signed-off-by: Antonio Quartulli <a@unstable.cc>
---
 net/batman-adv/network-coding.c | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

diff --git a/net/batman-adv/network-coding.c b/net/batman-adv/network-coding.c
index c98b0ab85449..cc63b44f0d2e 100644
--- a/net/batman-adv/network-coding.c
+++ b/net/batman-adv/network-coding.c
@@ -203,28 +203,25 @@ void batadv_nc_init_orig(struct batadv_orig_node *orig_node)
 }
 
 /**
- * batadv_nc_node_free_rcu - rcu callback to free an nc node and remove
- *  its refcount on the orig_node
- * @rcu: rcu pointer of the nc node
+ * batadv_nc_node_release - release nc_node from lists and queue for free after
+ *  rcu grace period
+ * @nc_node: the nc node to free
  */
-static void batadv_nc_node_free_rcu(struct rcu_head *rcu)
+static void batadv_nc_node_release(struct batadv_nc_node *nc_node)
 {
-	struct batadv_nc_node *nc_node;
-
-	nc_node = container_of(rcu, struct batadv_nc_node, rcu);
 	batadv_orig_node_free_ref(nc_node->orig_node);
-	kfree(nc_node);
+	kfree_rcu(nc_node, rcu);
 }
 
 /**
- * batadv_nc_node_free_ref - decrements the nc node refcounter and possibly
- * frees it
+ * batadv_nc_node_free_ref - decrement the nc node refcounter and possibly
+ *  release it
  * @nc_node: the nc node to free
  */
 static void batadv_nc_node_free_ref(struct batadv_nc_node *nc_node)
 {
 	if (atomic_dec_and_test(&nc_node->refcount))
-		call_rcu(&nc_node->rcu, batadv_nc_node_free_rcu);
+		batadv_nc_node_release(nc_node);
 }
 
 /**
-- 
2.7.0

  parent reply	other threads:[~2016-01-17  5:26 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-17  5:24 [B.A.T.M.A.N.] pull request [net]: batman-adv 20160117 Antonio Quartulli
2016-01-17  5:24 ` [PATCH 1/8] batman-adv: Avoid recursive call_rcu for batadv_bla_claim Antonio Quartulli
2016-01-17  5:24 ` [B.A.T.M.A.N.] " Antonio Quartulli
2016-01-17  5:24 ` [B.A.T.M.A.N.] [PATCH 2/8] batman-adv: Avoid recursive call_rcu for batadv_nc_node Antonio Quartulli
2016-01-17  5:24 ` Antonio Quartulli [this message]
2016-01-17  5:24 ` [PATCH 3/8] batman-adv: Drop immediate batadv_orig_ifinfo free function Antonio Quartulli
2016-01-17  5:24 ` [B.A.T.M.A.N.] " Antonio Quartulli
2016-01-17  5:24 ` [B.A.T.M.A.N.] [PATCH 4/8] batman-adv: Drop immediate batadv_neigh_node " Antonio Quartulli
2016-01-17  5:24 ` Antonio Quartulli
2016-01-17  5:24 ` [B.A.T.M.A.N.] [PATCH 5/8] batman-adv: Drop immediate batadv_hardif_neigh_node " Antonio Quartulli
2016-01-17  5:24 ` Antonio Quartulli
2016-01-17  5:24 ` [PATCH 6/8] batman-adv: Drop immediate neigh_ifinfo " Antonio Quartulli
2016-01-17  5:24   ` [B.A.T.M.A.N.] " Antonio Quartulli
2016-01-17  5:24 ` [PATCH 7/8] batman-adv: Drop immediate batadv_hard_iface " Antonio Quartulli
2016-01-17  5:24   ` [B.A.T.M.A.N.] " Antonio Quartulli
2016-01-17  5:24 ` [PATCH 8/8] batman-adv: Drop immediate orig_node " Antonio Quartulli
2016-01-17  5:24   ` [B.A.T.M.A.N.] " Antonio Quartulli
     [not found] ` <1453008281-15396-1-git-send-email-a-2CpIooy/SPIKlTDg6p0iyA@public.gmane.org>
2016-01-17  6:04   ` pull request [net]: batman-adv 20160117 David Miller
2016-01-17  6:04     ` [B.A.T.M.A.N.] " David Miller
2016-01-17  6:12     ` Antonio Quartulli
     [not found]       ` <569B30D0.2040406-2CpIooy/SPIKlTDg6p0iyA@public.gmane.org>
2016-01-17 16:39         ` David Miller
2016-01-17 16:39           ` [B.A.T.M.A.N.] " David Miller
2016-01-17  6:12     ` Antonio Quartulli

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='1453008281-15396-3-git-send-email-a__32529.1609777652$1453008479$gmane$org@unstable.cc' \
    --to=a@unstable.cc \
    --cc=b.a.t.m.a.n@lists.open-mesh.org \
    --cc=davem@davemloft.net \
    --cc=mareklindner@neomailbox.ch \
    --cc=netdev@vger.kernel.org \
    --cc=sven@narfation.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.