gro_flush_timeout and napi_defer_hard_irqs can be read
from napi_complete_done() while other cpus write the value,
whithout explicit synchronization.
Use READ_ONCE()/WRITE_ONCE() to annotate the races.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
if (work_done) {
if (n->gro_bitmask)
- timeout = n->dev->gro_flush_timeout;
- n->defer_hard_irqs_count = n->dev->napi_defer_hard_irqs;
+ timeout = READ_ONCE(n->dev->gro_flush_timeout);
+ n->defer_hard_irqs_count = READ_ONCE(n->dev->napi_defer_hard_irqs);
}
if (n->defer_hard_irqs_count > 0) {
n->defer_hard_irqs_count--;
- timeout = n->dev->gro_flush_timeout;
+ timeout = READ_ONCE(n->dev->gro_flush_timeout);
if (timeout)
ret = false;
}
static int change_gro_flush_timeout(struct net_device *dev, unsigned long val)
{
- dev->gro_flush_timeout = val;
+ WRITE_ONCE(dev->gro_flush_timeout, val);
return 0;
}
static int change_napi_defer_hard_irqs(struct net_device *dev, unsigned long val)
{
- dev->napi_defer_hard_irqs = val;
+ WRITE_ONCE(dev->napi_defer_hard_irqs, val);
return 0;
}