forked from Minki/linux
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: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
3ab52c6928
@ -260,7 +260,7 @@ static void macvlan_broadcast(struct sk_buff *skb,
|
||||
mode == MACVLAN_MODE_BRIDGE) ?:
|
||||
netif_rx_ni(nskb);
|
||||
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,
|
||||
nskb->pkt_type = PACKET_HOST;
|
||||
|
||||
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,
|
||||
@ -407,7 +407,8 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb)
|
||||
const struct macvlan_dev *src;
|
||||
struct net_device *dev;
|
||||
unsigned int len = 0;
|
||||
int ret = NET_RX_DROP;
|
||||
int ret;
|
||||
rx_handler_result_t handle_res;
|
||||
|
||||
port = macvlan_port_get_rcu(skb->dev);
|
||||
if (is_multicast_ether_addr(eth->h_dest)) {
|
||||
@ -423,6 +424,7 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb)
|
||||
vlan = src;
|
||||
ret = macvlan_broadcast_one(skb, vlan, eth, 0) ?:
|
||||
netif_rx(skb);
|
||||
handle_res = RX_HANDLER_CONSUMED;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -448,17 +450,20 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb)
|
||||
}
|
||||
len = skb->len + ETH_HLEN;
|
||||
skb = skb_share_check(skb, GFP_ATOMIC);
|
||||
if (!skb)
|
||||
if (!skb) {
|
||||
ret = NET_RX_DROP;
|
||||
handle_res = RX_HANDLER_CONSUMED;
|
||||
goto out;
|
||||
}
|
||||
|
||||
skb->dev = dev;
|
||||
skb->pkt_type = PACKET_HOST;
|
||||
|
||||
ret = netif_rx(skb);
|
||||
|
||||
ret = NET_RX_SUCCESS;
|
||||
handle_res = RX_HANDLER_ANOTHER;
|
||||
out:
|
||||
macvlan_count_rx(vlan, len, ret == NET_RX_SUCCESS, 0);
|
||||
return RX_HANDLER_CONSUMED;
|
||||
macvlan_count_rx(vlan, len, ret == NET_RX_SUCCESS, false);
|
||||
return handle_res;
|
||||
}
|
||||
|
||||
static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
|
Loading…
Reference in New Issue
Block a user