Commit 3ab52c69 authored by David S. Miller's avatar David S. Miller

Merge branch 'macvlan'

Jason Baron says:

====================
macvlan: optimize receive path

So after porting this optimization to net-next, I found that the netperf
results of TCP_RR regress right at the maximum peak of transactions/sec. That
is as I increase the number of threads via the first argument to super_netperf,
the number of transactions/sec keep increasing, peak, and then start
decreasing. It is right at the peak, that I see a small regression with this
patch (see results in patch 2/2).

Without the patch, the ksoftirqd threads are the top cpu consumers threads on
the system, since the extra 'netif_rx()', is queuing more softirq work, whereas
with the patch, the ksoftirqd threads are below all of the 'netserver' threads
in terms of their cpu usage. So there appears to be some interaction between how
softirqs are serviced at the peak here and this patch. I think the test results
are still supportive of this approach, but I wanted to be clear on my findings.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 2403077d d1dd9119
...@@ -260,7 +260,7 @@ static void macvlan_broadcast(struct sk_buff *skb, ...@@ -260,7 +260,7 @@ static void macvlan_broadcast(struct sk_buff *skb,
mode == MACVLAN_MODE_BRIDGE) ?: mode == MACVLAN_MODE_BRIDGE) ?:
netif_rx_ni(nskb); netif_rx_ni(nskb);
macvlan_count_rx(vlan, skb->len + ETH_HLEN, macvlan_count_rx(vlan, skb->len + ETH_HLEN,
err == NET_RX_SUCCESS, 1); err == NET_RX_SUCCESS, true);
} }
} }
} }
...@@ -379,7 +379,7 @@ static void macvlan_forward_source_one(struct sk_buff *skb, ...@@ -379,7 +379,7 @@ static void macvlan_forward_source_one(struct sk_buff *skb,
nskb->pkt_type = PACKET_HOST; nskb->pkt_type = PACKET_HOST;
ret = netif_rx(nskb); ret = netif_rx(nskb);
macvlan_count_rx(vlan, len, ret == NET_RX_SUCCESS, 0); macvlan_count_rx(vlan, len, ret == NET_RX_SUCCESS, false);
} }
static void macvlan_forward_source(struct sk_buff *skb, static void macvlan_forward_source(struct sk_buff *skb,
...@@ -407,7 +407,8 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb) ...@@ -407,7 +407,8 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb)
const struct macvlan_dev *src; const struct macvlan_dev *src;
struct net_device *dev; struct net_device *dev;
unsigned int len = 0; unsigned int len = 0;
int ret = NET_RX_DROP; int ret;
rx_handler_result_t handle_res;
port = macvlan_port_get_rcu(skb->dev); port = macvlan_port_get_rcu(skb->dev);
if (is_multicast_ether_addr(eth->h_dest)) { if (is_multicast_ether_addr(eth->h_dest)) {
...@@ -423,6 +424,7 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb) ...@@ -423,6 +424,7 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb)
vlan = src; vlan = src;
ret = macvlan_broadcast_one(skb, vlan, eth, 0) ?: ret = macvlan_broadcast_one(skb, vlan, eth, 0) ?:
netif_rx(skb); netif_rx(skb);
handle_res = RX_HANDLER_CONSUMED;
goto out; goto out;
} }
...@@ -448,17 +450,20 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb) ...@@ -448,17 +450,20 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb)
} }
len = skb->len + ETH_HLEN; len = skb->len + ETH_HLEN;
skb = skb_share_check(skb, GFP_ATOMIC); skb = skb_share_check(skb, GFP_ATOMIC);
if (!skb) if (!skb) {
ret = NET_RX_DROP;
handle_res = RX_HANDLER_CONSUMED;
goto out; goto out;
}
skb->dev = dev; skb->dev = dev;
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
ret = netif_rx(skb); ret = NET_RX_SUCCESS;
handle_res = RX_HANDLER_ANOTHER;
out: out:
macvlan_count_rx(vlan, len, ret == NET_RX_SUCCESS, 0); macvlan_count_rx(vlan, len, ret == NET_RX_SUCCESS, false);
return RX_HANDLER_CONSUMED; return handle_res;
} }
static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev) static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment