* [PATCHv2 0/5] bonding: enslave and locking bug fixes
@ 2013-04-18 17:33 Nikolay Aleksandrov
2013-04-18 17:33 ` [PATCHv2 1/5] bonding: mc addresses don't get deleted on enslave failure Nikolay Aleksandrov
` (5 more replies)
0 siblings, 6 replies; 9+ messages in thread
From: Nikolay Aleksandrov @ 2013-04-18 17:33 UTC (permalink / raw)
To: netdev; +Cc: andy, fubar, davem
Hi,
This patch-set fixes mainly bugs on enslave failure and one occasion
of a needed locking. The patches are:
1. On enslave failure mc addresses are not flushed from the slave
2. On enslave failure vlans are not cleaned up from the slave
3. On enslave failure the bond's primary and curr_active_slave
are not cleaned up (which might result in use of freed memory)
4. On enslave failure netpoll is not disabled which might result in
a memory leak
5. In bond_mc_swap() the bond's mc addr list is walked without
netif_addr_lock, since it can be called without rtnl, add it
v2: patch 01 - fix log message and remove unnecessary code move
Best regards,
Nik
Nikolay Aleksandrov (5):
bonding: mc addresses don't get deleted on enslave failure
bonding: vlans don't get deleted on enslave failure
bonding: primary_slave & curr_active_slave are not cleaned on enslave
failure
bonding: disable netpoll on enslave failure
bonding: in bond_mc_swap() bond's mc addr list is walked without lock
drivers/net/bonding/bond_main.c | 27 +++++++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)
--
1.8.1.4
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCHv2 1/5] bonding: mc addresses don't get deleted on enslave failure
2013-04-18 17:33 [PATCHv2 0/5] bonding: enslave and locking bug fixes Nikolay Aleksandrov
@ 2013-04-18 17:33 ` Nikolay Aleksandrov
2013-04-18 17:33 ` [PATCHv2 2/5] bonding: vlans " Nikolay Aleksandrov
` (4 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Nikolay Aleksandrov @ 2013-04-18 17:33 UTC (permalink / raw)
To: netdev; +Cc: andy, fubar, davem
Add bond_mc_list_flush() after err_detach as that's the first error path
after the addresses are added. The main issue is the mc addresses' refcount
which only gets bumped up.
v2: update log message and don't move code unnecessarily
Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
---
drivers/net/bonding/bond_main.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index a61a760..6fe1544 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1901,6 +1901,11 @@ err_dest_symlinks:
bond_destroy_slave_symlinks(bond_dev, slave_dev);
err_detach:
+ if (!USES_PRIMARY(bond->params.mode)) {
+ netif_addr_lock_bh(bond_dev);
+ bond_mc_list_flush(bond_dev, slave_dev);
+ netif_addr_unlock_bh(bond_dev);
+ }
write_lock_bh(&bond->lock);
bond_detach_slave(bond, new_slave);
write_unlock_bh(&bond->lock);
--
1.8.1.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCHv2 2/5] bonding: vlans don't get deleted on enslave failure
2013-04-18 17:33 [PATCHv2 0/5] bonding: enslave and locking bug fixes Nikolay Aleksandrov
2013-04-18 17:33 ` [PATCHv2 1/5] bonding: mc addresses don't get deleted on enslave failure Nikolay Aleksandrov
@ 2013-04-18 17:33 ` Nikolay Aleksandrov
2013-04-18 17:33 ` [PATCHv3 3/5] bonding: primary_slave & curr_active_slave are not cleaned " Nikolay Aleksandrov
` (3 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Nikolay Aleksandrov @ 2013-04-18 17:33 UTC (permalink / raw)
To: netdev; +Cc: andy, fubar, davem
The main problem is with vid refcount which only gets bumped up.
Delete the vlans after err_detach as that's the first error path
after the vlans are added.
Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
---
drivers/net/bonding/bond_main.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 6fe1544..2e7fce0 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1906,6 +1906,7 @@ err_detach:
bond_mc_list_flush(bond_dev, slave_dev);
netif_addr_unlock_bh(bond_dev);
}
+ bond_del_vlans_from_slave(bond, slave_dev);
write_lock_bh(&bond->lock);
bond_detach_slave(bond, new_slave);
write_unlock_bh(&bond->lock);
--
1.8.1.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCHv3 3/5] bonding: primary_slave & curr_active_slave are not cleaned on enslave failure
2013-04-18 17:33 [PATCHv2 0/5] bonding: enslave and locking bug fixes Nikolay Aleksandrov
2013-04-18 17:33 ` [PATCHv2 1/5] bonding: mc addresses don't get deleted on enslave failure Nikolay Aleksandrov
2013-04-18 17:33 ` [PATCHv2 2/5] bonding: vlans " Nikolay Aleksandrov
@ 2013-04-18 17:33 ` Nikolay Aleksandrov
2013-04-18 17:39 ` Nikolay Aleksandrov
2013-04-18 17:33 ` [PATCHv2 4/5] bonding: disable netpoll " Nikolay Aleksandrov
` (2 subsequent siblings)
5 siblings, 1 reply; 9+ messages in thread
From: Nikolay Aleksandrov @ 2013-04-18 17:33 UTC (permalink / raw)
To: netdev; +Cc: andy, fubar, davem
On enslave failure primary_slave can point to new_slave which is to be
freed, and the same applies to curr_active_slave. So check if this is
the case and clean up properly after err_detach because that's the first
error code path after they're set.
Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
---
drivers/net/bonding/bond_main.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 2e7fce0..c56e132 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1909,7 +1909,17 @@ err_detach:
bond_del_vlans_from_slave(bond, slave_dev);
write_lock_bh(&bond->lock);
bond_detach_slave(bond, new_slave);
+ if (bond->primary_slave == new_slave)
+ bond->primary_slave = NULL;
write_unlock_bh(&bond->lock);
+ if (bond->curr_active_slave == new_slave) {
+ read_lock(&bond->lock);
+ write_lock_bh(&bond->curr_slave_lock);
+ bond_change_active_slave(bond, NULL);
+ bond_select_active_slave(bond);
+ write_unlock_bh(&bond->curr_slave_lock);
+ read_unlock(&bond->lock);
+ }
err_close:
slave_dev->priv_flags &= ~IFF_BONDING;
--
1.8.1.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCHv2 4/5] bonding: disable netpoll on enslave failure
2013-04-18 17:33 [PATCHv2 0/5] bonding: enslave and locking bug fixes Nikolay Aleksandrov
` (2 preceding siblings ...)
2013-04-18 17:33 ` [PATCHv3 3/5] bonding: primary_slave & curr_active_slave are not cleaned " Nikolay Aleksandrov
@ 2013-04-18 17:33 ` Nikolay Aleksandrov
2013-04-18 17:33 ` [PATCHv2 5/5] bonding: in bond_mc_swap() bond's mc addr list is walked without lock Nikolay Aleksandrov
2013-04-18 18:58 ` [PATCHv2 0/5] bonding: enslave and locking bug fixes Jay Vosburgh
5 siblings, 0 replies; 9+ messages in thread
From: Nikolay Aleksandrov @ 2013-04-18 17:33 UTC (permalink / raw)
To: netdev; +Cc: andy, fubar, davem
slave_disable_netpoll() is not called upon enslave failure which would
lead to a memory leak. Call slave_disable_netpoll() after err_detach as
that's the first error path after enabling netpoll on that slave.
Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
---
drivers/net/bonding/bond_main.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index c56e132..1f3b1cc 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1920,6 +1920,7 @@ err_detach:
write_unlock_bh(&bond->curr_slave_lock);
read_unlock(&bond->lock);
}
+ slave_disable_netpoll(new_slave);
err_close:
slave_dev->priv_flags &= ~IFF_BONDING;
--
1.8.1.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCHv2 5/5] bonding: in bond_mc_swap() bond's mc addr list is walked without lock
2013-04-18 17:33 [PATCHv2 0/5] bonding: enslave and locking bug fixes Nikolay Aleksandrov
` (3 preceding siblings ...)
2013-04-18 17:33 ` [PATCHv2 4/5] bonding: disable netpoll " Nikolay Aleksandrov
@ 2013-04-18 17:33 ` Nikolay Aleksandrov
2013-04-18 18:58 ` [PATCHv2 0/5] bonding: enslave and locking bug fixes Jay Vosburgh
5 siblings, 0 replies; 9+ messages in thread
From: Nikolay Aleksandrov @ 2013-04-18 17:33 UTC (permalink / raw)
To: netdev; +Cc: andy, fubar, davem
Use netif_addr_lock_bh() to acquire the appropriate lock before walking.
Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
---
drivers/net/bonding/bond_main.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 1f3b1cc..5a2b5f1 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -846,8 +846,10 @@ static void bond_mc_swap(struct bonding *bond, struct slave *new_active,
if (bond->dev->flags & IFF_ALLMULTI)
dev_set_allmulti(old_active->dev, -1);
+ netif_addr_lock_bh(bond->dev);
netdev_for_each_mc_addr(ha, bond->dev)
dev_mc_del(old_active->dev, ha->addr);
+ netif_addr_unlock_bh(bond->dev);
}
if (new_active) {
@@ -858,8 +860,10 @@ static void bond_mc_swap(struct bonding *bond, struct slave *new_active,
if (bond->dev->flags & IFF_ALLMULTI)
dev_set_allmulti(new_active->dev, 1);
+ netif_addr_lock_bh(bond->dev);
netdev_for_each_mc_addr(ha, bond->dev)
dev_mc_add(new_active->dev, ha->addr);
+ netif_addr_unlock_bh(bond->dev);
}
}
--
1.8.1.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCHv3 3/5] bonding: primary_slave & curr_active_slave are not cleaned on enslave failure
2013-04-18 17:33 ` [PATCHv3 3/5] bonding: primary_slave & curr_active_slave are not cleaned " Nikolay Aleksandrov
@ 2013-04-18 17:39 ` Nikolay Aleksandrov
0 siblings, 0 replies; 9+ messages in thread
From: Nikolay Aleksandrov @ 2013-04-18 17:39 UTC (permalink / raw)
To: netdev; +Cc: andy, fubar, davem
On 18/04/13 19:33, Nikolay Aleksandrov wrote:
> On enslave failure primary_slave can point to new_slave which is to be
> freed, and the same applies to curr_active_slave. So check if this is
> the case and clean up properly after err_detach because that's the first
> error code path after they're set.
>
> Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
> ---
> drivers/net/bonding/bond_main.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
> index 2e7fce0..c56e132 100644
> --- a/drivers/net/bonding/bond_main.c
> +++ b/drivers/net/bonding/bond_main.c
> @@ -1909,7 +1909,17 @@ err_detach:
> bond_del_vlans_from_slave(bond, slave_dev);
> write_lock_bh(&bond->lock);
> bond_detach_slave(bond, new_slave);
> + if (bond->primary_slave == new_slave)
> + bond->primary_slave = NULL;
> write_unlock_bh(&bond->lock);
> + if (bond->curr_active_slave == new_slave) {
> + read_lock(&bond->lock);
> + write_lock_bh(&bond->curr_slave_lock);
> + bond_change_active_slave(bond, NULL);
> + bond_select_active_slave(bond);
> + write_unlock_bh(&bond->curr_slave_lock);
> + read_unlock(&bond->lock);
> + }
>
> err_close:
> slave_dev->priv_flags &= ~IFF_BONDING;
I've had too much coffee today, this should've been
v2 although there aren't any changes :-)
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCHv2 0/5] bonding: enslave and locking bug fixes
2013-04-18 17:33 [PATCHv2 0/5] bonding: enslave and locking bug fixes Nikolay Aleksandrov
` (4 preceding siblings ...)
2013-04-18 17:33 ` [PATCHv2 5/5] bonding: in bond_mc_swap() bond's mc addr list is walked without lock Nikolay Aleksandrov
@ 2013-04-18 18:58 ` Jay Vosburgh
2013-04-19 21:50 ` David Miller
5 siblings, 1 reply; 9+ messages in thread
From: Jay Vosburgh @ 2013-04-18 18:58 UTC (permalink / raw)
To: Nikolay Aleksandrov; +Cc: netdev, andy, davem
Nikolay Aleksandrov <nikolay@redhat.com> wrote:
>Hi,
>This patch-set fixes mainly bugs on enslave failure and one occasion
>of a needed locking. The patches are:
>
> 1. On enslave failure mc addresses are not flushed from the slave
> 2. On enslave failure vlans are not cleaned up from the slave
> 3. On enslave failure the bond's primary and curr_active_slave
> are not cleaned up (which might result in use of freed memory)
> 4. On enslave failure netpoll is not disabled which might result in
> a memory leak
> 5. In bond_mc_swap() the bond's mc addr list is walked without
> netif_addr_lock, since it can be called without rtnl, add it
>
>v2: patch 01 - fix log message and remove unnecessary code move
All look good to me.
Signed-off-by: Jay Vosburgh <fubar@us.ibm.com>
-J
>Best regards,
> Nik
>
>Nikolay Aleksandrov (5):
> bonding: mc addresses don't get deleted on enslave failure
> bonding: vlans don't get deleted on enslave failure
> bonding: primary_slave & curr_active_slave are not cleaned on enslave
> failure
> bonding: disable netpoll on enslave failure
> bonding: in bond_mc_swap() bond's mc addr list is walked without lock
>
> drivers/net/bonding/bond_main.c | 27 +++++++++++++++++++++++----
> 1 file changed, 23 insertions(+), 4 deletions(-)
>
>--
>1.8.1.4
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCHv2 0/5] bonding: enslave and locking bug fixes
2013-04-18 18:58 ` [PATCHv2 0/5] bonding: enslave and locking bug fixes Jay Vosburgh
@ 2013-04-19 21:50 ` David Miller
0 siblings, 0 replies; 9+ messages in thread
From: David Miller @ 2013-04-19 21:50 UTC (permalink / raw)
To: fubar; +Cc: nikolay, netdev, andy
From: Jay Vosburgh <fubar@us.ibm.com>
Date: Thu, 18 Apr 2013 11:58:06 -0700
> Nikolay Aleksandrov <nikolay@redhat.com> wrote:
>
>>Hi,
>>This patch-set fixes mainly bugs on enslave failure and one occasion
>>of a needed locking. The patches are:
>>
>> 1. On enslave failure mc addresses are not flushed from the slave
>> 2. On enslave failure vlans are not cleaned up from the slave
>> 3. On enslave failure the bond's primary and curr_active_slave
>> are not cleaned up (which might result in use of freed memory)
>> 4. On enslave failure netpoll is not disabled which might result in
>> a memory leak
>> 5. In bond_mc_swap() the bond's mc addr list is walked without
>> netif_addr_lock, since it can be called without rtnl, add it
>>
>>v2: patch 01 - fix log message and remove unnecessary code move
>
> All look good to me.
>
> Signed-off-by: Jay Vosburgh <fubar@us.ibm.com>
Series applied, thanks everyone.
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2013-04-19 21:50 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-04-18 17:33 [PATCHv2 0/5] bonding: enslave and locking bug fixes Nikolay Aleksandrov
2013-04-18 17:33 ` [PATCHv2 1/5] bonding: mc addresses don't get deleted on enslave failure Nikolay Aleksandrov
2013-04-18 17:33 ` [PATCHv2 2/5] bonding: vlans " Nikolay Aleksandrov
2013-04-18 17:33 ` [PATCHv3 3/5] bonding: primary_slave & curr_active_slave are not cleaned " Nikolay Aleksandrov
2013-04-18 17:39 ` Nikolay Aleksandrov
2013-04-18 17:33 ` [PATCHv2 4/5] bonding: disable netpoll " Nikolay Aleksandrov
2013-04-18 17:33 ` [PATCHv2 5/5] bonding: in bond_mc_swap() bond's mc addr list is walked without lock Nikolay Aleksandrov
2013-04-18 18:58 ` [PATCHv2 0/5] bonding: enslave and locking bug fixes Jay Vosburgh
2013-04-19 21:50 ` David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).