summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2020-04-22 09:13:28 -0700
committerDavid S. Miller <davem@davemloft.net>2020-04-23 12:43:20 -0700
commit7e417a66b86c110f4b282945dac82e21e0b08328 (patch)
treeb927ae6c6296d1ca3037554c98e6b1d2165455a3
parent6f8b12d661d09b488b9ac879b8eafbd2cc4a1450 (diff)
net: napi: use READ_ONCE()/WRITE_ONCE()
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>
-rw-r--r--net/core/dev.c6
-rw-r--r--net/core/net-sysfs.c4
2 files changed, 5 insertions, 5 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index 67585484ad32..afff16849c26 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -6242,12 +6242,12 @@ bool napi_complete_done(struct napi_struct *n, int work_done)
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;
}
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index f3b650cd0923..880e89c894f6 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -367,7 +367,7 @@ NETDEVICE_SHOW_RW(tx_queue_len, fmt_dec);
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;
}
@@ -384,7 +384,7 @@ NETDEVICE_SHOW_RW(gro_flush_timeout, fmt_ulong);
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;
}