RFC [PATCH net-2.6 3/6] net: softRSS net changes
Subsystems (2)
This patch adds support for software RSS in the networking layer.
Signed-off-by Tom Herbert <[email protected]>
---
include/linux/netdevice.h +41 -3
@@ -308,10 +308,15 @@ struct napi_struct {unsigned long state;int weight;int (*poll)(struct napi_struct *,int ); +#ifdef CONFIG_NET_NAPI_RSS +int last_rx_cpu; +#endif +#if defined(CONFIG_NETPOLL ) || defined(CONFIG_NET_NAPI_RSS ) +struct net_device *dev; +#endif #ifdef CONFIG_NETPOLL spinlock_t poll_lock;int poll_owner; -struct net_device *dev;struct list_head dev_list;#endif };
@@ -607,6 +612,12 @@ struct net_device/* ingress path synchronizer */ spinlock_t ingress_lock;struct Qdisc *qdisc_ingress; +#ifdef CONFIG_NET_SOFTRSS +cpumask_t soft_rss_cpus; +#endif +#ifdef CONFIG_NET_NAPI_RSS +cpumask_t napi_rss_cpus; +#endif /* * Cache line mostly used on queue transmit path (qdisc)
@@ -767,8 +778,10 @@ static inline void netif_napi_add(structINIT_LIST_HEAD (&napi->poll_list); napi->poll = poll; napi->weight = weight; -#ifdef CONFIG_NETPOLL +#if defined(CONFIG_NETPOLL ) || defined(CONFIG_NET_NAPI_RSS ) napi->dev = dev; +#endif +#ifdef CONFIG_NETPOLL list_add (&napi->dev_list, &dev->napi_list);spin_lock_init (&napi->poll_lock); napi->poll_owner =-1 ;
@@ -888,6 +901,10 @@ struct softnet_datastruct net_device *output_queue;struct sk_buff_head input_pkt_queue;struct list_head poll_list; +#if defined(CONFIG_NET_NAPI_RSS ) || defined(CONFIG_NET_SOFTRSS ) +struct list_head rss_poll_list; +spinlock_t rss_poll_list_lock; +#endif struct sk_buff *completion_queue;struct napi_struct backlog;
@@ -1085,7 +1102,28 @@ extern void dev_kfree_skb_any(struct sk_extern int netif_rx (struct sk_buff *skb);extern int netif_rx_ni (struct sk_buff *skb);#define HAVE_NETIF_RECEIVE_SKB 1 -extern int netif_receive_skb (struct sk_buff *skb); +extern int __netif_receive_skb (struct sk_buff *skb); + +#ifdef CONFIG_NET_NAPI_RSS +extern int sysctl_napi_rss; +#endif + +#ifdef CONFIG_NET_SOFTRSS +extern int sysctl_soft_rss; +static inline int netif_receive_skb (struct sk_buff *skb) +{ +if (sysctl_soft_rss) +return (netif_rx (skb)); +else +return (__netif_receive_skb (skb)); +} +#else +static inline int netif_receive_skb (struct sk_buff *skb) +{ +return (__netif_receive_skb (skb)); +} +#endif +extern int dev_valid_name (const char *name);extern int dev_ioctl (struct net *net,unsigned int cmd,void __user *);extern int dev_ethtool (struct net *net,struct ifreq *);
net/Kconfig +32 -0
@@ -35,6 +35,38 @@ config NET_NS Allow user space to create what appear to be multiple instances of the network stack. +config NET_NAPI_RSS + bool "NAPI RSS" + help + Say Y here to enable NAPI RSS. In this mode the execution of the + NAPI poll function for each device is spread across CPUs in a + round robin fashion. Each time the poll function runs it gets + scheduled on the next CPU in the round robin. + + A mask of CPUs that can be used is set on a per device basis + in the sysfs variable /sys/class/net/<device>/napi_rss_cpus. This + feature needs to be enabled at run-time by setting the + net.core.napi_rss sysctl to "1". + +config NET_SOFTRSS + bool "Software RSS" + help + Say Y here to enable a software implementation of receive side + scaling (RSS). RSS distributes the load of received + packet processing across multiple CPUs. In this software + implementation of RSS, stack processing for each packet can be + scheduled on a different CPU from that which handles the device + interrupt or NAPI poll. The scheduling is done by the netif_rx + function which uses a hash over fields in the packet header into + a CPU identifier. For example, in the case of a TCP packet, the + four tuple is hashed to choose a CPU for processing all packets of + that connection. + + A mask of CPUs that can be used is set on a per device basis + in the sysfs variable /sys/class/net/<device>/soft_rss_cpus. This + feature needs to be enabled at run-time by setting the + net.core.soft_rss sysctl to "1". + source "net/packet/Kconfig" source "net/unix/Kconfig" source "net/xfrm/Kconfig"
net/core/dev.c +188 -12
308 lines not on this page · raw message