From: Stephen Hemminger <shemminger@vyatta.com>
To: Jiri Pirko <jpirko@redhat.com>
Cc: ivecera@redhat.com, fubar@us.ibm.com, netdev@vger.kernel.org,
bridge@lists.linux-foundation.org, linux-kernel@vger.kernel.org,
mschmidt@redhat.com, bonding-devel@lists.sourceforge.net,
dada1@cosmosbay.com, jgarzik@pobox.com, davem@davemloft.net
Subject: Re: [Bridge] [PATCH 3/4] net: bridge: use device address list instead of dev_addr
Date: Mon, 13 Apr 2009 07:54:00 -0700 [thread overview]
Message-ID: <20090413075400.34604e72@nehalam> (raw)
In-Reply-To: <20090413084407.GD23734@psychotron.englab.brq.redhat.com>
On Mon, 13 Apr 2009 10:44:08 +0200
Jiri Pirko <jpirko@redhat.com> wrote:
> This patch changes the handling of mac addresses of bridge port devices. Now
> it uses previously introduced list of device addresses. It allows the bridge to
> know more then one local mac address per port which is mandatory for the right
> work in some cases.
>
> Signed-off-by: Jiri Pirko <jpirko@redhat.com>
> ---
> net/bridge/br_fdb.c | 120 +++++++++++++++++++++++++++++++++--------------
> net/bridge/br_if.c | 2 +-
> net/bridge/br_notify.c | 2 +-
> net/bridge/br_private.h | 4 +-
> 4 files changed, 89 insertions(+), 39 deletions(-)
>
> diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
> index a48f5ef..6efc556 100644
> --- a/net/bridge/br_fdb.c
> +++ b/net/bridge/br_fdb.c
> @@ -77,10 +77,45 @@ static inline void fdb_delete(struct net_bridge_fdb_entry *f)
> br_fdb_put(f);
> }
>
> -void br_fdb_changeaddr(struct net_bridge_port *p, const unsigned char *newaddr)
> +/*
> + * Finds out if passed address is one of the addresses assigned to the device.
> + * Returns 1 on positive result
> + */
> +static inline int is_dev_addr(struct net_device *dev, unsigned char *addr)
Why not a general version in net_device.h or etherdevice.h?
static inline bool is_etherdev_addr(const struct net_device *dev, const unsigned char addr[ETH_ALEN])
> +{
> + struct hw_addr *ha;
> + int ret = 1;
> +
> + netif_dev_addr_lock_bh(dev);
> + for_each_dev_addr(dev, ha) {
User RCU
> + ret = compare_ether_addr(addr, ha->addr);
> + if (!ret)
> + break;
> + }
> + netif_dev_addr_unlock_bh(dev);
> + return !ret ? 1 : 0;
> +}
> +
> +static int another_port_has_addr(const struct net_bridge_port *p,
> + struct net_bridge_fdb_entry *f)
> +{
> + struct net_bridge *br = p->br;
> + struct net_bridge_port *op;
> +
> + list_for_each_entry(op, &br->port_list, list) {
> + if (op != p && is_dev_addr(op->dev, f->addr.addr)) {
> + f->dst = op;
> + return 1;
> + }
> + }
> + return 0;
> +}
Forwarding database is hot path, people sometimes run lots of devices
on single bridge, doesn't this scale worse?
> +void br_fdb_changeaddr(struct net_bridge_port *p, struct net_device *dev)
> {
> struct net_bridge *br = p->br;
> int i;
> + struct hw_addr *ha;
>
> spin_lock_bh(&br->hash_lock);
>
> @@ -92,26 +127,23 @@ void br_fdb_changeaddr(struct net_bridge_port *p, const unsigned char *newaddr)
>
> f = hlist_entry(h, struct net_bridge_fdb_entry, hlist);
> if (f->dst == p && f->is_local) {
> - /* maybe another port has same hw addr? */
> - struct net_bridge_port *op;
> - list_for_each_entry(op, &br->port_list, list) {
> - if (op != p &&
> - !compare_ether_addr(op->dev->dev_addr,
> - f->addr.addr)) {
> - f->dst = op;
> - goto insert;
> - }
> - }
> -
> - /* delete old one */
> - fdb_delete(f);
> - goto insert;
> + /*
> + * maybe another port has same hw addr?,
> + * if not then delete it
> + */
> + if (!another_port_has_addr(p, f))
> + fdb_delete(f);
> }
> }
> }
> - insert:
> - /* insert new address, may fail if invalid address or dup. */
> - fdb_insert(br, p, newaddr);
> +
> + /* insert device addresses, may fail if invalid address. */
> +
> + netif_dev_addr_lock_bh(dev);
> + for_each_dev_addr(dev, ha) {
> + fdb_insert(br, p, ha->addr);
> + }
> + netif_dev_addr_unlock_bh(dev);
>
You added another layer of locking on the already hot bridge
fast path.
WARNING: multiple messages have this Message-ID (diff)
From: Stephen Hemminger <shemminger@vyatta.com>
To: Jiri Pirko <jpirko@redhat.com>
Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
jgarzik@pobox.com, davem@davemloft.net,
bridge@lists.linux-foundation.org, fubar@us.ibm.com,
bonding-devel@lists.sourceforge.net, kaber@trash.net,
mschmidt@redhat.com, dada1@cosmosbay.com, ivecera@redhat.com
Subject: Re: [PATCH 3/4] net: bridge: use device address list instead of dev_addr
Date: Mon, 13 Apr 2009 07:54:00 -0700 [thread overview]
Message-ID: <20090413075400.34604e72@nehalam> (raw)
In-Reply-To: <20090413084407.GD23734@psychotron.englab.brq.redhat.com>
On Mon, 13 Apr 2009 10:44:08 +0200
Jiri Pirko <jpirko@redhat.com> wrote:
> This patch changes the handling of mac addresses of bridge port devices. Now
> it uses previously introduced list of device addresses. It allows the bridge to
> know more then one local mac address per port which is mandatory for the right
> work in some cases.
>
> Signed-off-by: Jiri Pirko <jpirko@redhat.com>
> ---
> net/bridge/br_fdb.c | 120 +++++++++++++++++++++++++++++++++--------------
> net/bridge/br_if.c | 2 +-
> net/bridge/br_notify.c | 2 +-
> net/bridge/br_private.h | 4 +-
> 4 files changed, 89 insertions(+), 39 deletions(-)
>
> diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
> index a48f5ef..6efc556 100644
> --- a/net/bridge/br_fdb.c
> +++ b/net/bridge/br_fdb.c
> @@ -77,10 +77,45 @@ static inline void fdb_delete(struct net_bridge_fdb_entry *f)
> br_fdb_put(f);
> }
>
> -void br_fdb_changeaddr(struct net_bridge_port *p, const unsigned char *newaddr)
> +/*
> + * Finds out if passed address is one of the addresses assigned to the device.
> + * Returns 1 on positive result
> + */
> +static inline int is_dev_addr(struct net_device *dev, unsigned char *addr)
Why not a general version in net_device.h or etherdevice.h?
static inline bool is_etherdev_addr(const struct net_device *dev, const unsigned char addr[ETH_ALEN])
> +{
> + struct hw_addr *ha;
> + int ret = 1;
> +
> + netif_dev_addr_lock_bh(dev);
> + for_each_dev_addr(dev, ha) {
User RCU
> + ret = compare_ether_addr(addr, ha->addr);
> + if (!ret)
> + break;
> + }
> + netif_dev_addr_unlock_bh(dev);
> + return !ret ? 1 : 0;
> +}
> +
> +static int another_port_has_addr(const struct net_bridge_port *p,
> + struct net_bridge_fdb_entry *f)
> +{
> + struct net_bridge *br = p->br;
> + struct net_bridge_port *op;
> +
> + list_for_each_entry(op, &br->port_list, list) {
> + if (op != p && is_dev_addr(op->dev, f->addr.addr)) {
> + f->dst = op;
> + return 1;
> + }
> + }
> + return 0;
> +}
Forwarding database is hot path, people sometimes run lots of devices
on single bridge, doesn't this scale worse?
> +void br_fdb_changeaddr(struct net_bridge_port *p, struct net_device *dev)
> {
> struct net_bridge *br = p->br;
> int i;
> + struct hw_addr *ha;
>
> spin_lock_bh(&br->hash_lock);
>
> @@ -92,26 +127,23 @@ void br_fdb_changeaddr(struct net_bridge_port *p, const unsigned char *newaddr)
>
> f = hlist_entry(h, struct net_bridge_fdb_entry, hlist);
> if (f->dst == p && f->is_local) {
> - /* maybe another port has same hw addr? */
> - struct net_bridge_port *op;
> - list_for_each_entry(op, &br->port_list, list) {
> - if (op != p &&
> - !compare_ether_addr(op->dev->dev_addr,
> - f->addr.addr)) {
> - f->dst = op;
> - goto insert;
> - }
> - }
> -
> - /* delete old one */
> - fdb_delete(f);
> - goto insert;
> + /*
> + * maybe another port has same hw addr?,
> + * if not then delete it
> + */
> + if (!another_port_has_addr(p, f))
> + fdb_delete(f);
> }
> }
> }
> - insert:
> - /* insert new address, may fail if invalid address or dup. */
> - fdb_insert(br, p, newaddr);
> +
> + /* insert device addresses, may fail if invalid address. */
> +
> + netif_dev_addr_lock_bh(dev);
> + for_each_dev_addr(dev, ha) {
> + fdb_insert(br, p, ha->addr);
> + }
> + netif_dev_addr_unlock_bh(dev);
>
You added another layer of locking on the already hot bridge
fast path.
next prev parent reply other threads:[~2009-04-13 14:54 UTC|newest]
Thread overview: 198+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-13 18:33 [Bridge] [PATCH] bonding: allow bond in mode balance-alb to work properly in bridge Jiri Pirko
2009-03-13 18:33 ` Jiri Pirko
2009-03-14 5:39 ` [Bridge] " Stephen Hemminger
2009-03-14 5:39 ` Stephen Hemminger
2009-03-14 9:49 ` [Bridge] " Jiri Pirko
2009-03-14 9:49 ` Jiri Pirko
2009-03-15 23:12 ` [Bridge] " Stephen Hemminger
2009-03-15 23:12 ` Stephen Hemminger
2009-03-16 11:11 ` [Bridge] " Jiri Pirko
2009-03-16 11:11 ` Jiri Pirko
2009-03-19 6:20 ` [Bridge] " David Miller
2009-03-19 6:20 ` David Miller
2009-03-19 8:44 ` [Bridge] " Jiri Pirko
2009-03-19 8:44 ` Jiri Pirko
2009-03-19 10:21 ` [Bridge] " David Miller
2009-03-19 10:21 ` David Miller
2009-03-19 11:19 ` [Bridge] " Jiri Pirko
2009-03-19 11:19 ` Jiri Pirko
2009-03-19 8:50 ` [Bridge] " Patrick McHardy
2009-03-19 8:50 ` Patrick McHardy
2009-03-19 16:31 ` [Bridge] " Jiri Pirko
2009-03-19 16:31 ` Jiri Pirko
2009-03-25 13:04 ` [Bridge] [PATCH] bonding: allow bond in mode balance-alb to work properly in bridge -try2 Jiri Pirko
2009-03-25 13:04 ` Jiri Pirko
2009-03-25 13:40 ` [Bridge] " Eric Dumazet
2009-03-25 13:40 ` Eric Dumazet
2009-03-25 14:39 ` [Bridge] " Jiri Pirko
2009-03-25 14:39 ` Jiri Pirko
2009-03-25 15:19 ` [Bridge] [PATCH] bonding: allow bond in mode balance-alb to work properly in bridge -try3 Jiri Pirko
2009-03-25 15:19 ` Jiri Pirko
2009-03-25 16:31 ` [Bridge] " Jay Vosburgh
2009-03-25 16:31 ` Jay Vosburgh
2009-03-25 17:44 ` [Bridge] " Jiri Pirko
2009-03-25 17:44 ` Jiri Pirko
2009-03-26 0:24 ` [Bridge] " David Miller
2009-03-26 0:24 ` David Miller
2009-03-26 0:34 ` [Bridge] " Jay Vosburgh
2009-03-26 0:34 ` Jay Vosburgh
2009-03-26 11:12 ` [Bridge] " Jiri Pirko
2009-03-26 11:12 ` Jiri Pirko
2009-03-26 15:52 ` [Bridge] [PATCH] bonding: allow bond in mode balance-alb to work properly in bridge -try4 Jiri Pirko
2009-03-26 15:52 ` Jiri Pirko
2009-03-27 7:38 ` [Bridge] " David Miller
2009-03-27 7:38 ` David Miller
2009-03-27 7:46 ` [Bridge] " Jiri Pirko
2009-03-27 7:46 ` Jiri Pirko
2009-03-27 7:53 ` [Bridge] " Patrick McHardy
2009-03-27 7:53 ` Patrick McHardy
2009-03-27 8:41 ` [Bridge] " Jiri Pirko
2009-03-27 8:41 ` Jiri Pirko
2009-03-27 8:55 ` [Bridge] " Patrick McHardy
2009-03-27 8:55 ` Patrick McHardy
2009-03-27 9:47 ` [Bridge] " Jiri Pirko
2009-03-27 9:47 ` Jiri Pirko
2009-03-29 20:53 ` [Bridge] " David Miller
2009-03-29 20:53 ` David Miller
2009-03-30 12:04 ` [Bridge] " Patrick McHardy
2009-03-30 12:04 ` Patrick McHardy
2009-03-30 12:40 ` [Bridge] " Jiri Pirko
2009-03-30 12:40 ` Jiri Pirko
2009-03-30 12:47 ` [Bridge] " Patrick McHardy
2009-03-30 12:47 ` Patrick McHardy
2009-03-30 12:52 ` [Bridge] " Jiri Pirko
2009-03-30 12:52 ` Jiri Pirko
2009-03-30 12:58 ` [Bridge] " Patrick McHardy
2009-03-30 12:58 ` Patrick McHardy
2009-05-26 15:17 ` [Bridge] [PATCH net-next] bonding: allow bond in mode balance-alb to work properly in bridge -try4.1 Jiri Pirko
2009-05-26 16:32 ` Andy Gospodarek
2009-05-27 8:25 ` Jiri Pirko
2009-05-26 16:59 ` Eric Dumazet
2009-05-27 8:42 ` Jiri Pirko
2009-05-27 13:53 ` [Bridge] [PATCH net-next] bonding: allow bond in mode balance-alb to work properly in bridge -try4.2 Jiri Pirko
2009-05-27 14:39 ` Eric Dumazet
2009-05-28 9:57 ` Jiri Pirko
2009-05-28 11:05 ` [Bridge] [PATCH net-next] bonding: allow bond in mode balance-alb to work properly in bridge -try4.3 Jiri Pirko
2009-05-28 11:41 ` Eric Dumazet
2009-05-29 8:52 ` David Miller
2009-05-28 12:11 ` Andy Gospodarek
2009-04-13 8:37 ` [Bridge] [PATCH 0/4] bonding: allow bond in mode balance-alb to work properly in bridge -try5 Jiri Pirko
2009-04-13 8:37 ` Jiri Pirko
2009-04-13 8:38 ` [Bridge] [PATCH 1/4] net: introduce dev_mac_address_changed Jiri Pirko
2009-04-13 8:38 ` Jiri Pirko
2009-04-13 14:58 ` [Bridge] " Stephen Hemminger
2009-04-13 14:58 ` Stephen Hemminger
2009-04-13 8:42 ` [Bridge] [PATCH 2/4] net: introduce a list of device addresses dev_addr_list Jiri Pirko
2009-04-13 8:42 ` Jiri Pirko
2009-04-13 14:49 ` [Bridge] " Stephen Hemminger
2009-04-13 14:49 ` Stephen Hemminger
2009-04-13 22:54 ` [Bridge] " David Miller
2009-04-13 22:54 ` David Miller
2009-04-13 22:53 ` [Bridge] " David Miller
2009-04-13 22:53 ` David Miller
2009-04-13 8:44 ` [Bridge] [PATCH 3/4] net: bridge: use device address list instead of dev_addr Jiri Pirko
2009-04-13 8:44 ` Jiri Pirko
2009-04-13 14:54 ` Stephen Hemminger [this message]
2009-04-13 14:54 ` Stephen Hemminger
2009-04-14 10:15 ` [Bridge] " Jiri Pirko
2009-04-14 10:15 ` Jiri Pirko
2009-04-13 22:54 ` [Bridge] " David Miller
2009-04-13 22:54 ` David Miller
2009-04-13 8:46 ` [Bridge] [PATCH 4/4] net: bonding: add slave device addresses in mode alb Jiri Pirko
2009-04-13 8:46 ` Jiri Pirko
2009-04-13 14:56 ` [Bridge] " Stephen Hemminger
2009-04-13 14:56 ` Stephen Hemminger
2009-04-15 8:17 ` [Bridge] [PATCH 0/3] bonding: allow bond in mode balance-alb to work properly in bridge -try6 Jiri Pirko
2009-04-15 8:17 ` Jiri Pirko
2009-04-15 8:18 ` [Bridge] [PATCH 1/3] net: introduce a list of device addresses dev_addr_list Jiri Pirko
2009-04-15 8:18 ` Jiri Pirko
2009-04-15 8:26 ` [Bridge] " Li Zefan
2009-04-15 8:26 ` Li Zefan
2009-04-15 8:29 ` [Bridge] " Jiri Pirko
2009-04-15 8:29 ` Jiri Pirko
2009-04-15 8:32 ` [Bridge] " Jiri Pirko
2009-04-15 8:32 ` Jiri Pirko
2009-04-15 9:21 ` [Bridge] " David Miller
2009-04-15 9:21 ` David Miller
2009-04-15 9:27 ` [Bridge] " Eric Dumazet
2009-04-15 9:27 ` Eric Dumazet
2009-04-15 9:31 ` [Bridge] " David Miller
2009-04-15 9:31 ` David Miller
2009-04-15 10:13 ` [Bridge] " Patrick McHardy
2009-04-15 10:13 ` Patrick McHardy
2009-04-15 10:15 ` [Bridge] " David Miller
2009-04-15 10:15 ` David Miller
2009-04-15 10:41 ` [Bridge] " Patrick McHardy
2009-04-15 10:41 ` Patrick McHardy
2009-04-15 10:45 ` [Bridge] " David Miller
2009-04-15 10:45 ` David Miller
2009-04-15 10:47 ` [Bridge] " Patrick McHardy
2009-04-15 10:47 ` Patrick McHardy
2009-04-15 14:42 ` [Bridge] " Jiri Pirko
2009-04-15 14:42 ` Jiri Pirko
2009-04-15 11:17 ` [Bridge] " Jiri Pirko
2009-04-15 11:17 ` Jiri Pirko
2009-04-15 11:22 ` [Bridge] " Patrick McHardy
2009-04-15 11:22 ` Patrick McHardy
2009-04-15 11:28 ` [Bridge] " Jiri Pirko
2009-04-15 11:28 ` Jiri Pirko
2009-04-15 12:28 ` [Bridge] " Eric Dumazet
2009-04-15 12:28 ` Eric Dumazet
2009-04-15 18:02 ` [Bridge] [PATCH 1/3] net: introduce a list of device addresses dev_addr_list (v2) Jiri Pirko
2009-04-15 18:02 ` Jiri Pirko
2009-04-15 18:54 ` [Bridge] " Eric Dumazet
2009-04-15 18:54 ` Eric Dumazet
2009-04-16 8:46 ` [Bridge] " Jiri Pirko
2009-04-16 8:46 ` Jiri Pirko
2009-04-17 11:57 ` [Bridge] [PATCH 1/3] net: introduce a list of device addresses dev_addr_list (v3) Jiri Pirko
2009-04-17 11:57 ` Jiri Pirko
2009-04-17 15:33 ` [Bridge] " Stephen Hemminger
2009-04-17 15:33 ` Stephen Hemminger
2009-04-18 7:01 ` [Bridge] " Jiri Pirko
2009-04-18 7:01 ` Jiri Pirko
2009-04-18 7:35 ` [Bridge] " Eric Dumazet
2009-04-18 7:35 ` Eric Dumazet
2009-04-18 7:44 ` [Bridge] " Jiri Pirko
2009-04-18 7:44 ` Jiri Pirko
2009-04-18 8:06 ` [Bridge] " Eric Dumazet
2009-04-18 8:06 ` Eric Dumazet
2009-04-18 8:58 ` [Bridge] [PATCH 1/3] net: introduce a list of device addresses dev_addr_list (v4) Jiri Pirko
2009-04-18 8:58 ` Jiri Pirko
2009-04-20 16:11 ` [Bridge] " Jiri Pirko
2009-04-20 16:11 ` Jiri Pirko
2009-04-23 8:09 ` [Bridge] " Jiri Pirko
2009-04-23 8:09 ` Jiri Pirko
2009-04-23 15:58 ` [Bridge] [Bonding-devel] " Stephen Hemminger
2009-04-24 21:26 ` Jiri Pirko
2009-05-04 11:14 ` [Bridge] [PATCH] net: introduce a list of device addresses dev_addr_list (v5) Jiri Pirko
2009-05-04 11:14 ` Jiri Pirko
2009-05-05 4:37 ` [Bridge] " David Miller
2009-05-05 4:37 ` David Miller
2009-05-05 6:37 ` [Bridge] " Jiri Pirko
2009-05-05 6:37 ` Jiri Pirko
2009-05-05 12:48 ` [Bridge] [PATCH] net: introduce a list of device addresses dev_addr_list (v6) Jiri Pirko
2009-05-05 12:48 ` Jiri Pirko
2009-05-05 19:27 ` [Bridge] " David Miller
2009-05-05 19:27 ` David Miller
2009-05-08 22:38 ` [Bridge] " Stephen Hemminger
2009-05-08 22:38 ` Stephen Hemminger
2009-05-08 23:00 ` [Bridge] " David Miller
2009-05-08 23:00 ` David Miller
2009-05-08 23:12 ` [Bridge] " Stephen Hemminger
2009-05-08 23:12 ` Stephen Hemminger
2009-05-08 23:25 ` [Bridge] " David Miller
2009-05-08 23:25 ` David Miller
2009-05-08 23:29 ` [Bridge] " Stephen Hemminger
2009-05-08 23:29 ` Stephen Hemminger
2009-04-15 8:21 ` [Bridge] [PATCH 2/3] net: bridge: use device address list instead of dev_addr Jiri Pirko
2009-04-15 8:21 ` Jiri Pirko
2009-05-06 14:46 ` [Bridge] [PATCH net-next] net: bridge: use device address list instead of dev_addr (repost) Jiri Pirko
2009-05-06 14:46 ` Jiri Pirko
2009-05-06 15:08 ` [Bridge] " Eric Dumazet
2009-05-06 15:08 ` Eric Dumazet
2009-05-06 19:26 ` [Bridge] " Stephen Hemminger
2009-05-06 19:26 ` Stephen Hemminger
2009-05-07 22:03 ` [Bridge] " David Miller
2009-05-07 22:03 ` David Miller
2009-04-15 8:22 ` [Bridge] [PATCH 3/3] net: bonding: add slave device addresses in mode alb Jiri Pirko
2009-04-15 8:22 ` Jiri Pirko
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=20090413075400.34604e72@nehalam \
--to=shemminger@vyatta.com \
--cc=bonding-devel@lists.sourceforge.net \
--cc=bridge@lists.linux-foundation.org \
--cc=dada1@cosmosbay.com \
--cc=davem@davemloft.net \
--cc=fubar@us.ibm.com \
--cc=ivecera@redhat.com \
--cc=jgarzik@pobox.com \
--cc=jpirko@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mschmidt@redhat.com \
--cc=netdev@vger.kernel.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.