* [PATCH] net: count hw_addr syncs so that unsync works properly.
@ 2013-04-02 21:10 Vlad Yasevich
2013-04-05 4:20 ` David Miller
0 siblings, 1 reply; 2+ messages in thread
From: Vlad Yasevich @ 2013-04-02 21:10 UTC (permalink / raw)
To: netdev; +Cc: Vlad Yasevich
A few drivers use dev_uc_sync/unsync to synchronize the
address lists from master down to slave/lower devices. In
some cases (bond/team) a single address list is synched down
to multiple devices. At the time of unsync, we have a leak
in these lower devices, because "synced" is treated as a
boolean and the address will not be unsynced for anything after
the fist device/call.
Treat "synced" as a count (same as refcount) and allow all
unsync calls to work.
Signed-off-by: Vlad Yasevich <vyasevic@redhat.com>
---
include/linux/netdevice.h | 2 +-
net/core/dev_addr_lists.c | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 8bfa956..6151e90 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -210,9 +210,9 @@ struct netdev_hw_addr {
#define NETDEV_HW_ADDR_T_SLAVE 3
#define NETDEV_HW_ADDR_T_UNICAST 4
#define NETDEV_HW_ADDR_T_MULTICAST 5
- bool synced;
bool global_use;
int refcount;
+ int synced;
struct rcu_head rcu_head;
};
diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c
index bd2eb9d..abdc9e6 100644
--- a/net/core/dev_addr_lists.c
+++ b/net/core/dev_addr_lists.c
@@ -37,7 +37,7 @@ static int __hw_addr_create_ex(struct netdev_hw_addr_list *list,
ha->type = addr_type;
ha->refcount = 1;
ha->global_use = global;
- ha->synced = false;
+ ha->synced = 0;
list_add_tail_rcu(&ha->list, &list->list);
list->count++;
@@ -165,7 +165,7 @@ int __hw_addr_sync(struct netdev_hw_addr_list *to_list,
addr_len, ha->type);
if (err)
break;
- ha->synced = true;
+ ha->synced++;
ha->refcount++;
} else if (ha->refcount == 1) {
__hw_addr_del(to_list, ha->addr, addr_len, ha->type);
@@ -186,7 +186,7 @@ void __hw_addr_unsync(struct netdev_hw_addr_list *to_list,
if (ha->synced) {
__hw_addr_del(to_list, ha->addr,
addr_len, ha->type);
- ha->synced = false;
+ ha->synced--;
__hw_addr_del(from_list, ha->addr,
addr_len, ha->type);
}
--
1.8.1.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] net: count hw_addr syncs so that unsync works properly.
2013-04-02 21:10 [PATCH] net: count hw_addr syncs so that unsync works properly Vlad Yasevich
@ 2013-04-05 4:20 ` David Miller
0 siblings, 0 replies; 2+ messages in thread
From: David Miller @ 2013-04-05 4:20 UTC (permalink / raw)
To: vyasevic; +Cc: netdev
From: Vlad Yasevich <vyasevic@redhat.com>
Date: Tue, 2 Apr 2013 17:10:07 -0400
> A few drivers use dev_uc_sync/unsync to synchronize the
> address lists from master down to slave/lower devices. In
> some cases (bond/team) a single address list is synched down
> to multiple devices. At the time of unsync, we have a leak
> in these lower devices, because "synced" is treated as a
> boolean and the address will not be unsynced for anything after
> the fist device/call.
>
> Treat "synced" as a count (same as refcount) and allow all
> unsync calls to work.
>
> Signed-off-by: Vlad Yasevich <vyasevic@redhat.com>
Applied and queued up for -stable, thanks Vlad.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-04-05 4:20 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-02 21:10 [PATCH] net: count hw_addr syncs so that unsync works properly Vlad Yasevich
2013-04-05 4:20 ` 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).