From: Arnd Bergmann <arnd@arndb.de>
To: virtualization@lists.linux-foundation.org
Cc: Herbert Xu <herbert@gondor.apana.org.au>,
Eric Dumazet <eric.dumazet@gmail.com>,
Anna Fischer <anna.fischer@hp.com>,
netdev@vger.kernel.org, bridge@lists.linux-foundation.org,
linux-kernel@vger.kernel.org,
Mark Smith <lk-netdev@lk-netdev.nosense.org>,
Gerhard Stenzel <gerhard.stenzel@de.ibm.com>,
"Eric W. Biederman" <ebiederm@xmission.com>,
Jens Osterkamp <jens@linux.vnet.ibm.com>,
Patrick Mullaney <pmullaney@novell.com>,
Stephen Hemminger <shemminger@vyatta.com>,
Edge Virtual Bridging <evb@yahoogroups.com>,
David Miller <davem@davemloft.net>
Subject: Re: [Bridge] [PATCH 2/4] macvlan: cleanup rx statistics
Date: Tue, 24 Nov 2009 09:28:43 +0000 [thread overview]
Message-ID: <200911240928.43901.arnd@arndb.de> (raw)
In-Reply-To: <200911240845.14454.arnd@arndb.de>
On Tuesday 24 November 2009 08:45:14 Arnd Bergmann wrote:
> On Tuesday 24 November 2009 08:15:53 Eric Dumazet wrote:
> > Arnd Bergmann a écrit :
> > I find following more readable, it probably generates more branches,
> > but avoid dirtying rx_errors if it is in another cache line.
> >
> > if (likely(success)) {
> > rx_stats->rx_packets++;
> > rx_stats->rx_bytes += length;
> > if (multicast)
> > rx_stats->multicast++;
> > } else {
> > rx_stats->rx_errors++;
> > }
>
> Given that the structure only has four members and alloc_percpu requests
> cache aligned data, it is rather likely to be in the same cache line.
>
> I'll have a look at what gcc generates on x86-64 for both versions
> and use the version you suggested unless it looks significantly more
> expensive.
Ok, that's what I got for trying to be clever. My version did not avoid
any branches, just created more code. I'll fold this update into my
patches then:
---
macvlan: cleanups
Use bool instead of int for flags, don't misoptimize rx counters,
avoid accessing a NULL skb.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
index 3db96b9..ff5f0b0 100644
--- a/drivers/net/macvlan.c
+++ b/drivers/net/macvlan.c
@@ -119,19 +119,23 @@ static int macvlan_addr_busy(const struct macvlan_port *port,
}
static inline void macvlan_count_rx(const struct macvlan_dev *vlan, int length,
- int success, int multicast)
+ bool success, bool multicast)
{
struct macvlan_rx_stats *rx_stats;
rx_stats = per_cpu_ptr(vlan->rx_stats, smp_processor_id());
- rx_stats->rx_packets += success != 0;
- rx_stats->rx_bytes += success ? length : 0;
- rx_stats->multicast += success && multicast;
- rx_stats->rx_errors += !success;
+ if (likely(success)) {
+ rx_stats->rx_packets++;;
+ rx_stats->rx_bytes += length;
+ if (multicast)
+ rx_stats->multicast++;
+ } else {
+ rx_stats->rx_errors++;
+ }
}
static int macvlan_broadcast_one(struct sk_buff *skb, struct net_device *dev,
- const struct ethhdr *eth, int local)
+ const struct ethhdr *eth, bool local)
{
if (!skb)
return NET_RX_DROP;
@@ -173,7 +177,7 @@ static void macvlan_broadcast(struct sk_buff *skb,
err = macvlan_broadcast_one(nskb, vlan->dev, eth,
mode == MACVLAN_MODE_BRIDGE);
macvlan_count_rx(vlan, skb->len + ETH_HLEN,
- likely(err == NET_RX_SUCCESS), 1);
+ err == NET_RX_SUCCESS, 1);
}
}
}
@@ -186,6 +190,7 @@ static struct sk_buff *macvlan_handle_frame(struct sk_buff *skb)
const struct macvlan_dev *vlan;
const struct macvlan_dev *src;
struct net_device *dev;
+ int len;
port = rcu_dereference(skb->dev->macvlan_port);
if (port == NULL)
@@ -218,8 +223,11 @@ static struct sk_buff *macvlan_handle_frame(struct sk_buff *skb)
kfree_skb(skb);
return NULL;
}
+ len = skb->len + ETH_HLEN;
skb = skb_share_check(skb, GFP_ATOMIC);
- macvlan_count_rx(vlan, skb->len + ETH_HLEN, likely(skb != NULL), 0);
+ macvlan_count_rx(vlan, len, skb != NULL, 0);
+ if (!skb)
+ return NULL;
skb->dev = dev;
skb->pkt_type = PACKET_HOST;
@@ -248,7 +256,7 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)
int length = skb->len + ETH_HLEN;
int ret = dev_forward_skb(dest->dev, skb);
macvlan_count_rx(dest, length,
- likely(ret == NET_RX_SUCCESS), 0);
+ ret == NET_RX_SUCCESS, 0);
return NET_XMIT_SUCCESS;
}
WARNING: multiple messages have this Message-ID (diff)
From: Arnd Bergmann <arnd@arndb.de>
To: virtualization@lists.linux-foundation.org
Cc: Eric Dumazet <eric.dumazet@gmail.com>,
Herbert Xu <herbert@gondor.apana.org.au>,
Anna Fischer <anna.fischer@hp.com>,
netdev@vger.kernel.org, bridge@lists.linux-foundation.org,
linux-kernel@vger.kernel.org,
Mark Smith <lk-netdev@lk-netdev.nosense.org>,
Gerhard Stenzel <gerhard.stenzel@de.ibm.com>,
"Eric W. Biederman" <ebiederm@xmission.com>,
Jens Osterkamp <jens@linux.vnet.ibm.com>,
Patrick Mullaney <pmullaney@novell.com>,
Stephen Hemminger <shemminger@vyatta.com>,
Edge Virtual Bridging <evb@yahoogroups.com>,
David Miller <davem@davemloft.net>
Subject: Re: [PATCH 2/4] macvlan: cleanup rx statistics
Date: Tue, 24 Nov 2009 09:28:43 +0000 [thread overview]
Message-ID: <200911240928.43901.arnd@arndb.de> (raw)
In-Reply-To: <200911240845.14454.arnd@arndb.de>
On Tuesday 24 November 2009 08:45:14 Arnd Bergmann wrote:
> On Tuesday 24 November 2009 08:15:53 Eric Dumazet wrote:
> > Arnd Bergmann a écrit :
> > I find following more readable, it probably generates more branches,
> > but avoid dirtying rx_errors if it is in another cache line.
> >
> > if (likely(success)) {
> > rx_stats->rx_packets++;
> > rx_stats->rx_bytes += length;
> > if (multicast)
> > rx_stats->multicast++;
> > } else {
> > rx_stats->rx_errors++;
> > }
>
> Given that the structure only has four members and alloc_percpu requests
> cache aligned data, it is rather likely to be in the same cache line.
>
> I'll have a look at what gcc generates on x86-64 for both versions
> and use the version you suggested unless it looks significantly more
> expensive.
Ok, that's what I got for trying to be clever. My version did not avoid
any branches, just created more code. I'll fold this update into my
patches then:
---
macvlan: cleanups
Use bool instead of int for flags, don't misoptimize rx counters,
avoid accessing a NULL skb.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
index 3db96b9..ff5f0b0 100644
--- a/drivers/net/macvlan.c
+++ b/drivers/net/macvlan.c
@@ -119,19 +119,23 @@ static int macvlan_addr_busy(const struct macvlan_port *port,
}
static inline void macvlan_count_rx(const struct macvlan_dev *vlan, int length,
- int success, int multicast)
+ bool success, bool multicast)
{
struct macvlan_rx_stats *rx_stats;
rx_stats = per_cpu_ptr(vlan->rx_stats, smp_processor_id());
- rx_stats->rx_packets += success != 0;
- rx_stats->rx_bytes += success ? length : 0;
- rx_stats->multicast += success && multicast;
- rx_stats->rx_errors += !success;
+ if (likely(success)) {
+ rx_stats->rx_packets++;;
+ rx_stats->rx_bytes += length;
+ if (multicast)
+ rx_stats->multicast++;
+ } else {
+ rx_stats->rx_errors++;
+ }
}
static int macvlan_broadcast_one(struct sk_buff *skb, struct net_device *dev,
- const struct ethhdr *eth, int local)
+ const struct ethhdr *eth, bool local)
{
if (!skb)
return NET_RX_DROP;
@@ -173,7 +177,7 @@ static void macvlan_broadcast(struct sk_buff *skb,
err = macvlan_broadcast_one(nskb, vlan->dev, eth,
mode == MACVLAN_MODE_BRIDGE);
macvlan_count_rx(vlan, skb->len + ETH_HLEN,
- likely(err == NET_RX_SUCCESS), 1);
+ err == NET_RX_SUCCESS, 1);
}
}
}
@@ -186,6 +190,7 @@ static struct sk_buff *macvlan_handle_frame(struct sk_buff *skb)
const struct macvlan_dev *vlan;
const struct macvlan_dev *src;
struct net_device *dev;
+ int len;
port = rcu_dereference(skb->dev->macvlan_port);
if (port == NULL)
@@ -218,8 +223,11 @@ static struct sk_buff *macvlan_handle_frame(struct sk_buff *skb)
kfree_skb(skb);
return NULL;
}
+ len = skb->len + ETH_HLEN;
skb = skb_share_check(skb, GFP_ATOMIC);
- macvlan_count_rx(vlan, skb->len + ETH_HLEN, likely(skb != NULL), 0);
+ macvlan_count_rx(vlan, len, skb != NULL, 0);
+ if (!skb)
+ return NULL;
skb->dev = dev;
skb->pkt_type = PACKET_HOST;
@@ -248,7 +256,7 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)
int length = skb->len + ETH_HLEN;
int ret = dev_forward_skb(dest->dev, skb);
macvlan_count_rx(dest, length,
- likely(ret == NET_RX_SUCCESS), 0);
+ ret == NET_RX_SUCCESS, 0);
return NET_XMIT_SUCCESS;
}
next prev parent reply other threads:[~2009-11-24 9:28 UTC|newest]
Thread overview: 90+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-24 0:56 [Bridge] [PATCHv2 0/4] macvlan: add vepa and bridge mode Arnd Bergmann
2009-11-24 0:56 ` Arnd Bergmann
2009-11-24 0:56 ` [Bridge] [PATCH 1/4] veth: move loopback logic to common location Arnd Bergmann
2009-11-24 0:56 ` Arnd Bergmann
2009-11-24 9:51 ` Patrick McHardy
2009-11-24 9:51 ` [Bridge] " Patrick McHardy
2009-11-24 9:51 ` Patrick McHardy
2009-11-24 10:02 ` Arnd Bergmann
2009-11-24 10:02 ` [Bridge] " Arnd Bergmann
2009-11-24 10:02 ` Arnd Bergmann
2009-11-24 10:17 ` [Bridge] " Patrick McHardy
2009-11-24 10:17 ` Patrick McHardy
2009-11-24 10:34 ` Arnd Bergmann
2009-11-24 10:34 ` [Bridge] " Arnd Bergmann
2009-11-24 10:34 ` Arnd Bergmann
2009-11-24 10:40 ` Patrick McHardy
2009-11-24 10:40 ` [Bridge] " Patrick McHardy
2009-11-24 10:40 ` Patrick McHardy
2009-11-24 13:13 ` Arnd Bergmann
2009-11-24 13:13 ` [Bridge] " Arnd Bergmann
2009-11-24 13:13 ` Arnd Bergmann
2009-11-24 16:42 ` [Bridge] " Eric W. Biederman
2009-11-24 16:42 ` Eric W. Biederman
2009-11-24 16:56 ` [Bridge] " Patrick McHardy
2009-11-24 16:56 ` Patrick McHardy
2009-11-24 18:10 ` Eric W. Biederman
2009-11-24 18:10 ` [Bridge] " Eric W. Biederman
2009-11-24 18:10 ` Eric W. Biederman
2009-11-24 18:28 ` Arnd Bergmann
2009-11-24 18:28 ` [Bridge] " Arnd Bergmann
2009-11-24 18:28 ` Arnd Bergmann
2009-11-24 18:38 ` [Bridge] " Patrick McHardy
2009-11-24 18:38 ` Patrick McHardy
2009-11-26 15:21 ` Arnd Bergmann
2009-11-26 15:21 ` [Bridge] " Arnd Bergmann
2009-11-26 15:21 ` Arnd Bergmann
2009-11-26 15:33 ` Patrick McHardy
2009-11-26 15:33 ` [Bridge] " Patrick McHardy
2009-11-26 15:33 ` Patrick McHardy
2009-11-26 16:38 ` Eric W. Biederman
2009-11-26 16:38 ` [Bridge] " Eric W. Biederman
2009-11-26 16:38 ` Eric W. Biederman
2009-11-26 17:44 ` [Bridge] " Arnd Bergmann
2009-11-26 17:44 ` Arnd Bergmann
2009-11-26 21:14 ` Patrick McHardy
2009-11-26 21:14 ` [Bridge] " Patrick McHardy
2009-11-26 21:14 ` Patrick McHardy
2009-11-26 17:44 ` Arnd Bergmann
2009-11-24 18:38 ` Patrick McHardy
2009-11-24 16:56 ` Patrick McHardy
2009-11-24 16:42 ` Eric W. Biederman
2009-11-24 10:17 ` Patrick McHardy
2009-11-24 0:56 ` Arnd Bergmann
2009-11-24 0:56 ` [PATCH 2/4] macvlan: cleanup rx statistics Arnd Bergmann
2009-11-24 0:56 ` [Bridge] " Arnd Bergmann
2009-11-24 0:56 ` Arnd Bergmann
2009-11-24 8:15 ` [Bridge] " Eric Dumazet
2009-11-24 8:15 ` Eric Dumazet
2009-11-24 8:45 ` Arnd Bergmann
2009-11-24 8:45 ` [Bridge] " Arnd Bergmann
2009-11-24 8:45 ` Arnd Bergmann
2009-11-24 9:28 ` Arnd Bergmann [this message]
2009-11-24 9:28 ` Arnd Bergmann
2009-11-24 9:28 ` Arnd Bergmann
2009-11-24 8:15 ` Eric Dumazet
2009-11-24 10:41 ` [Bridge] " Patrick McHardy
2009-11-24 10:41 ` Patrick McHardy
2009-11-24 10:41 ` Patrick McHardy
2009-11-24 0:56 ` [Bridge] [PATCH 3/4] macvlan: implement bridge, VEPA and private mode Arnd Bergmann
2009-11-24 0:56 ` Arnd Bergmann
2009-11-24 0:56 ` Arnd Bergmann
2009-11-24 0:56 ` Arnd Bergmann
2009-11-24 10:42 ` [Bridge] " Patrick McHardy
2009-11-24 10:42 ` Patrick McHardy
2009-11-24 12:45 ` Arnd Bergmann
2009-11-24 12:45 ` [Bridge] " Arnd Bergmann
2009-11-24 12:45 ` Arnd Bergmann
2009-11-24 10:42 ` Patrick McHardy
2009-11-24 0:56 ` [PATCH 4/4] macvlan: export macvlan mode through netlink Arnd Bergmann
2009-11-24 0:56 ` [Bridge] " Arnd Bergmann
2009-11-24 0:56 ` Arnd Bergmann
2009-11-24 10:53 ` [Bridge] " Patrick McHardy
2009-11-24 10:53 ` Patrick McHardy
2009-11-24 12:57 ` Arnd Bergmann
2009-11-24 12:57 ` [Bridge] " Arnd Bergmann
2009-11-24 12:57 ` Arnd Bergmann
2009-11-24 13:47 ` Patrick McHardy
2009-11-24 13:47 ` [Bridge] " Patrick McHardy
2009-11-24 13:47 ` Patrick McHardy
2009-11-24 10:53 ` Patrick McHardy
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=200911240928.43901.arnd@arndb.de \
--to=arnd@arndb.de \
--cc=anna.fischer@hp.com \
--cc=bridge@lists.linux-foundation.org \
--cc=davem@davemloft.net \
--cc=ebiederm@xmission.com \
--cc=eric.dumazet@gmail.com \
--cc=evb@yahoogroups.com \
--cc=gerhard.stenzel@de.ibm.com \
--cc=herbert@gondor.apana.org.au \
--cc=jens@linux.vnet.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lk-netdev@lk-netdev.nosense.org \
--cc=netdev@vger.kernel.org \
--cc=pmullaney@novell.com \
--cc=shemminger@vyatta.com \
--cc=virtualization@lists.linux-foundation.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.