diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c index 3b43bfd..cf17238 100644 --- a/drivers/net/loopback.c +++ b/drivers/net/loopback.c @@ -85,7 +85,7 @@ static int loopback_xmit(struct sk_buff *skb, struct net_device *dev) return 0; } #endif - dev->last_rx = jiffies; + netif_set_last_rx(dev); /* it's OK to use per_cpu_ptr() because BHs are off */ pcpu_lstats = dev->ml_priv; diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index c8bcb59..6729865 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -849,6 +849,22 @@ static inline void *netdev_priv(const struct net_device *dev) #define SET_NETDEV_DEV(net, pdev) ((net)->dev.parent = (pdev)) /** + * netif_set_last_rx - Set last_rx field of a device + * @dev: network device + * + * Instead of setting net->last_rx to jiffies, drivers should call this helper + * to avoid dirtying a cache line if last_rx already has the current jiffies + */ +static inline void netif_set_last_rx(struct net_device *dev) +{ +#ifdef CONFIG_SMP + if (dev->last_rx == jiffies) + return; +#endif + dev->last_rx = jiffies; +} + +/** * netif_napi_add - initialize a napi context * @dev: network device * @napi: napi context