Variables which are changed only infrequently should be annotated
with __read_mostly, which will group them together in a special
linker section. This prevents them from sharing cache lines with
data on the hot path.
Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
int (*dp_ioctl_hook)(struct net_device *dev, struct ifreq *rq, int cmd);
EXPORT_SYMBOL(dp_ioctl_hook);
int (*dp_ioctl_hook)(struct net_device *dev, struct ifreq *rq, int cmd);
EXPORT_SYMBOL(dp_ioctl_hook);
#include "compat.h"
struct kmem_cache *flow_cache;
#include "compat.h"
struct kmem_cache *flow_cache;
-static unsigned int hash_seed;
+static unsigned int hash_seed __read_mostly;
static inline bool arphdr_ok(struct sk_buff *skb)
{
static inline bool arphdr_ok(struct sk_buff *skb)
{
#define CACHE_DATA_ALIGN 16
/* Protected by RCU. */
#define CACHE_DATA_ALIGN 16
/* Protected by RCU. */
-static struct tbl *port_table;
+static struct tbl *port_table __read_mostly;
static void cache_cleaner(struct work_struct *work);
DECLARE_DELAYED_WORK(cache_cleaner_wq, cache_cleaner);
static void cache_cleaner(struct work_struct *work);
DECLARE_DELAYED_WORK(cache_cleaner_wq, cache_cleaner);
* synchronization because we could have just as easily read the value before
* the port change happened.
*/
* synchronization because we could have just as easily read the value before
* the port change happened.
*/
-static unsigned int key_local_remote_ports;
-static unsigned int key_remote_ports;
-static unsigned int local_remote_ports;
-static unsigned int remote_ports;
+static unsigned int key_local_remote_ports __read_mostly;
+static unsigned int key_remote_ports __read_mostly;
+static unsigned int local_remote_ports __read_mostly;
+static unsigned int remote_ports __read_mostly;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
#define rt_dst(rt) (rt->dst)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
#define rt_dst(rt) (rt->dst)