diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2011-11-17 07:13:26 +0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-11-18 02:06:08 +0400 |
commit | adc9300e78e6091a7eaa1821213836379d4dbaa8 (patch) | |
tree | b2d075990b32e8c21129851bf1b1adf4cdc441f1 /net/core/net-sysfs.c | |
parent | d6f144830bdfa5fcf116e9ab8fc6a60d23fa623d (diff) | |
download | linux-adc9300e78e6091a7eaa1821213836379d4dbaa8.tar.xz |
net: use jump_label to shortcut RPS if not setup
Most machines dont use RPS/RFS, and pay a fair amount of instructions in
netif_receive_skb() / netif_rx() / get_rps_cpu() just to discover
RPS/RFS is not setup.
Add a jump_label named rps_needed.
If no device rps_map or global rps_sock_flow_table is setup,
netif_receive_skb() / netif_rx() do a single instruction instead of many
ones, including conditional jumps.
jmp +0 (if CONFIG_JUMP_LABEL=y)
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Tom Herbert <therbert@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/net-sysfs.c')
-rw-r--r-- | net/core/net-sysfs.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 602b1419998c..db6c2f83633f 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c @@ -606,9 +606,12 @@ static ssize_t store_rps_map(struct netdev_rx_queue *queue, rcu_assign_pointer(queue->rps_map, map); spin_unlock(&rps_map_lock); - if (old_map) + if (map) + jump_label_inc(&rps_needed); + if (old_map) { kfree_rcu(old_map, rcu); - + jump_label_dec(&rps_needed); + } free_cpumask_var(mask); return len; } |