diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-04-19 01:07:33 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-04-19 16:20:34 -0400 |
commit | 88751275b8e867d756e4f86ae92afe0232de129f (patch) | |
tree | 011913d98eb65f5e90981da0275c2f5a07c2bee1 /include/linux/netdevice.h | |
parent | a03b1a5c95e8bcb07512122995bbf5bd3c39f2b9 (diff) |
rps: shortcut net_rps_action()
net_rps_action() is a bit expensive on NR_CPUS=64..4096 kernels, even if
RPS is not active.
Tom Herbert used two bitmasks to hold information needed to send IPI,
but a single LIFO list seems more appropriate.
Move all RPS logic into net_rps_action() to cleanup net_rx_action() code
(remove two ifdefs)
Move rps_remote_softirq_cpus into softnet_data to share its first cache
line, filling an existing hole.
In a future patch, we could call net_rps_action() from process_backlog()
to make sure we send IPI before handling this cpu backlog.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/netdevice.h')
-rw-r--r-- | include/linux/netdevice.h | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 649a0252686e..83ab3da149ad 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -1381,17 +1381,20 @@ static inline int unregister_gifconf(unsigned int family) | |||
1381 | } | 1381 | } |
1382 | 1382 | ||
1383 | /* | 1383 | /* |
1384 | * Incoming packets are placed on per-cpu queues so that | 1384 | * Incoming packets are placed on per-cpu queues |
1385 | * no locking is needed. | ||
1386 | */ | 1385 | */ |
1387 | struct softnet_data { | 1386 | struct softnet_data { |
1388 | struct Qdisc *output_queue; | 1387 | struct Qdisc *output_queue; |
1389 | struct list_head poll_list; | 1388 | struct list_head poll_list; |
1390 | struct sk_buff *completion_queue; | 1389 | struct sk_buff *completion_queue; |
1391 | 1390 | ||
1392 | /* Elements below can be accessed between CPUs for RPS */ | ||
1393 | #ifdef CONFIG_RPS | 1391 | #ifdef CONFIG_RPS |
1392 | struct softnet_data *rps_ipi_list; | ||
1393 | |||
1394 | /* Elements below can be accessed between CPUs for RPS */ | ||
1394 | struct call_single_data csd ____cacheline_aligned_in_smp; | 1395 | struct call_single_data csd ____cacheline_aligned_in_smp; |
1396 | struct softnet_data *rps_ipi_next; | ||
1397 | unsigned int cpu; | ||
1395 | unsigned int input_queue_head; | 1398 | unsigned int input_queue_head; |
1396 | #endif | 1399 | #endif |
1397 | struct sk_buff_head input_pkt_queue; | 1400 | struct sk_buff_head input_pkt_queue; |