All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RESEND net] ipv4: take rtnl_lock and mark mrt table as freed on namespace cleanup
@ 2015-03-31 18:01 Cong Wang
  2015-03-31 18:01 ` [Patch net] net: move fib_rules_unregister() under rtnl lock Cong Wang
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Cong Wang @ 2015-03-31 18:01 UTC (permalink / raw)
  To: netdev; +Cc: Cong Wang, Hannes Frederic Sowa

This is the IPv4 part for commit 905a6f96a1b1
(ipv6: take rtnl_lock and mark mrt6 table as freed on namespace cleanup).

Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
---
 net/ipv4/ipmr.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
index 9282544..bc40115 100644
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
@@ -278,10 +278,12 @@ static void __net_exit ipmr_rules_exit(struct net *net)
 {
 	struct mr_table *mrt, *next;
 
+	rtnl_lock();
 	list_for_each_entry_safe(mrt, next, &net->ipv4.mr_tables, list) {
 		list_del(&mrt->list);
 		ipmr_free_table(mrt);
 	}
+	rtnl_unlock();
 	fib_rules_unregister(net->ipv4.mr_rules_ops);
 }
 #else
@@ -308,7 +310,10 @@ static int __net_init ipmr_rules_init(struct net *net)
 
 static void __net_exit ipmr_rules_exit(struct net *net)
 {
+	rtnl_lock();
 	ipmr_free_table(net->ipv4.mrt);
+	net->ipv4.mrt = NULL;
+	rtnl_unlock();
 }
 #endif
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Patch net] net: move fib_rules_unregister() under rtnl lock
  2015-03-31 18:01 [PATCH RESEND net] ipv4: take rtnl_lock and mark mrt table as freed on namespace cleanup Cong Wang
@ 2015-03-31 18:01 ` Cong Wang
  2015-04-03  0:53   ` David Miller
  2015-03-31 18:01 ` [Patch net] ip6mr: call del_timer_sync() in ip6mr_free_table() Cong Wang
  2015-04-03  0:53 ` [PATCH RESEND net] ipv4: take rtnl_lock and mark mrt table as freed on namespace cleanup David Miller
  2 siblings, 1 reply; 6+ messages in thread
From: Cong Wang @ 2015-03-31 18:01 UTC (permalink / raw)
  To: netdev; +Cc: Cong Wang, Alexander Duyck, Thomas Graf

We have to hold rtnl lock for fib_rules_unregister()
otherwise the following race could happen:

fib_rules_unregister():	fib_nl_delrule():
...				...
...				ops = lookup_rules_ops();
list_del_rcu(&ops->list);
				list_for_each_entry(ops->rules) {
fib_rules_cleanup_ops(ops);	  ...
  list_del_rcu();		  list_del_rcu();
				}

Note, net->rules_mod_lock is actually not needed at all,
either upper layer netns code or rtnl lock guarantees
we are safe.

Cc: Alexander Duyck <alexander.h.duyck@redhat.com>
Cc: Thomas Graf <tgraf@suug.ch>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
---
 net/core/fib_rules.c    | 2 +-
 net/decnet/dn_rules.c   | 2 ++
 net/ipv4/fib_frontend.c | 3 +--
 net/ipv4/ipmr.c         | 2 +-
 net/ipv6/fib6_rules.c   | 2 ++
 net/ipv6/ip6mr.c        | 2 +-
 6 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c
index 44706e8..e4fdc9d 100644
--- a/net/core/fib_rules.c
+++ b/net/core/fib_rules.c
@@ -175,9 +175,9 @@ void fib_rules_unregister(struct fib_rules_ops *ops)
 
 	spin_lock(&net->rules_mod_lock);
 	list_del_rcu(&ops->list);
-	fib_rules_cleanup_ops(ops);
 	spin_unlock(&net->rules_mod_lock);
 
+	fib_rules_cleanup_ops(ops);
 	call_rcu(&ops->rcu, fib_rules_put_rcu);
 }
 EXPORT_SYMBOL_GPL(fib_rules_unregister);
diff --git a/net/decnet/dn_rules.c b/net/decnet/dn_rules.c
index faf7cc3..9d66a0f 100644
--- a/net/decnet/dn_rules.c
+++ b/net/decnet/dn_rules.c
@@ -248,7 +248,9 @@ void __init dn_fib_rules_init(void)
 
 void __exit dn_fib_rules_cleanup(void)
 {
+	rtnl_lock();
 	fib_rules_unregister(dn_fib_rules_ops);
+	rtnl_unlock();
 	rcu_barrier();
 }
 
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
index 57be71d..23b9b3e 100644
--- a/net/ipv4/fib_frontend.c
+++ b/net/ipv4/fib_frontend.c
@@ -1111,11 +1111,10 @@ static void ip_fib_net_exit(struct net *net)
 {
 	unsigned int i;
 
+	rtnl_lock();
 #ifdef CONFIG_IP_MULTIPLE_TABLES
 	fib4_rules_exit(net);
 #endif
-
-	rtnl_lock();
 	for (i = 0; i < FIB_TABLE_HASHSZ; i++) {
 		struct fib_table *tb;
 		struct hlist_head *head;
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
index bc40115..fe54eba 100644
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
@@ -283,8 +283,8 @@ static void __net_exit ipmr_rules_exit(struct net *net)
 		list_del(&mrt->list);
 		ipmr_free_table(mrt);
 	}
-	rtnl_unlock();
 	fib_rules_unregister(net->ipv4.mr_rules_ops);
+	rtnl_unlock();
 }
 #else
 #define ipmr_for_each_table(mrt, net) \
diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c
index 27ca796..70bc6ab 100644
--- a/net/ipv6/fib6_rules.c
+++ b/net/ipv6/fib6_rules.c
@@ -322,7 +322,9 @@ static int __net_init fib6_rules_net_init(struct net *net)
 
 static void __net_exit fib6_rules_net_exit(struct net *net)
 {
+	rtnl_lock();
 	fib_rules_unregister(net->ipv6.fib6_rules_ops);
+	rtnl_unlock();
 }
 
 static struct pernet_operations fib6_rules_net_ops = {
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
index 52028f4..2f1fd9f 100644
--- a/net/ipv6/ip6mr.c
+++ b/net/ipv6/ip6mr.c
@@ -267,8 +267,8 @@ static void __net_exit ip6mr_rules_exit(struct net *net)
 		list_del(&mrt->list);
 		ip6mr_free_table(mrt);
 	}
-	rtnl_unlock();
 	fib_rules_unregister(net->ipv6.mr6_rules_ops);
+	rtnl_unlock();
 }
 #else
 #define ip6mr_for_each_table(mrt, net) \
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Patch net] ip6mr: call del_timer_sync() in ip6mr_free_table()
  2015-03-31 18:01 [PATCH RESEND net] ipv4: take rtnl_lock and mark mrt table as freed on namespace cleanup Cong Wang
  2015-03-31 18:01 ` [Patch net] net: move fib_rules_unregister() under rtnl lock Cong Wang
@ 2015-03-31 18:01 ` Cong Wang
  2015-04-03  0:53   ` David Miller
  2015-04-03  0:53 ` [PATCH RESEND net] ipv4: take rtnl_lock and mark mrt table as freed on namespace cleanup David Miller
  2 siblings, 1 reply; 6+ messages in thread
From: Cong Wang @ 2015-03-31 18:01 UTC (permalink / raw)
  To: netdev; +Cc: Cong Wang, Hannes Frederic Sowa

We need to wait for the flying timers, since we
are going to free the mrtable right after it.

Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
---
 net/ipv6/ip6mr.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
index 2f1fd9f..312e0ff 100644
--- a/net/ipv6/ip6mr.c
+++ b/net/ipv6/ip6mr.c
@@ -336,7 +336,7 @@ static struct mr6_table *ip6mr_new_table(struct net *net, u32 id)
 
 static void ip6mr_free_table(struct mr6_table *mrt)
 {
-	del_timer(&mrt->ipmr_expire_timer);
+	del_timer_sync(&mrt->ipmr_expire_timer);
 	mroute_clean_tables(mrt);
 	kfree(mrt);
 }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH RESEND net] ipv4: take rtnl_lock and mark mrt table as freed on namespace cleanup
  2015-03-31 18:01 [PATCH RESEND net] ipv4: take rtnl_lock and mark mrt table as freed on namespace cleanup Cong Wang
  2015-03-31 18:01 ` [Patch net] net: move fib_rules_unregister() under rtnl lock Cong Wang
  2015-03-31 18:01 ` [Patch net] ip6mr: call del_timer_sync() in ip6mr_free_table() Cong Wang
@ 2015-04-03  0:53 ` David Miller
  2 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2015-04-03  0:53 UTC (permalink / raw)
  To: xiyou.wangcong; +Cc: netdev, hannes

From: Cong Wang <xiyou.wangcong@gmail.com>
Date: Tue, 31 Mar 2015 11:01:45 -0700

> This is the IPv4 part for commit 905a6f96a1b1
> (ipv6: take rtnl_lock and mark mrt6 table as freed on namespace cleanup).
> 
> Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
> Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>

Applied.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Patch net] ip6mr: call del_timer_sync() in ip6mr_free_table()
  2015-03-31 18:01 ` [Patch net] ip6mr: call del_timer_sync() in ip6mr_free_table() Cong Wang
@ 2015-04-03  0:53   ` David Miller
  0 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2015-04-03  0:53 UTC (permalink / raw)
  To: xiyou.wangcong; +Cc: netdev, hannes

From: Cong Wang <xiyou.wangcong@gmail.com>
Date: Tue, 31 Mar 2015 11:01:47 -0700

> We need to wait for the flying timers, since we
> are going to free the mrtable right after it.
> 
> Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>

Applied.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Patch net] net: move fib_rules_unregister() under rtnl lock
  2015-03-31 18:01 ` [Patch net] net: move fib_rules_unregister() under rtnl lock Cong Wang
@ 2015-04-03  0:53   ` David Miller
  0 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2015-04-03  0:53 UTC (permalink / raw)
  To: xiyou.wangcong; +Cc: netdev, alexander.h.duyck, tgraf

From: Cong Wang <xiyou.wangcong@gmail.com>
Date: Tue, 31 Mar 2015 11:01:46 -0700

> We have to hold rtnl lock for fib_rules_unregister()
> otherwise the following race could happen:
> 
> fib_rules_unregister():	fib_nl_delrule():
> ...				...
> ...				ops = lookup_rules_ops();
> list_del_rcu(&ops->list);
> 				list_for_each_entry(ops->rules) {
> fib_rules_cleanup_ops(ops);	  ...
>   list_del_rcu();		  list_del_rcu();
> 				}
> 
> Note, net->rules_mod_lock is actually not needed at all,
> either upper layer netns code or rtnl lock guarantees
> we are safe.
> 
> Cc: Alexander Duyck <alexander.h.duyck@redhat.com>
> Cc: Thomas Graf <tgraf@suug.ch>
> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>

Applied.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-04-03  0:53 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-31 18:01 [PATCH RESEND net] ipv4: take rtnl_lock and mark mrt table as freed on namespace cleanup Cong Wang
2015-03-31 18:01 ` [Patch net] net: move fib_rules_unregister() under rtnl lock Cong Wang
2015-04-03  0:53   ` David Miller
2015-03-31 18:01 ` [Patch net] ip6mr: call del_timer_sync() in ip6mr_free_table() Cong Wang
2015-04-03  0:53   ` David Miller
2015-04-03  0:53 ` [PATCH RESEND net] ipv4: take rtnl_lock and mark mrt table as freed on namespace cleanup David Miller

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.