Commit 1462160c authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

net: adopt try_cmpxchg() in napi_schedule_prep() and napi_complete_done()

This makes the code slightly more efficient.
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6af645a5
...@@ -5979,10 +5979,9 @@ EXPORT_SYMBOL(__napi_schedule); ...@@ -5979,10 +5979,9 @@ EXPORT_SYMBOL(__napi_schedule);
*/ */
bool napi_schedule_prep(struct napi_struct *n) bool napi_schedule_prep(struct napi_struct *n)
{ {
unsigned long val, new; unsigned long new, val = READ_ONCE(n->state);
do { do {
val = READ_ONCE(n->state);
if (unlikely(val & NAPIF_STATE_DISABLE)) if (unlikely(val & NAPIF_STATE_DISABLE))
return false; return false;
new = val | NAPIF_STATE_SCHED; new = val | NAPIF_STATE_SCHED;
...@@ -5995,7 +5994,7 @@ bool napi_schedule_prep(struct napi_struct *n) ...@@ -5995,7 +5994,7 @@ bool napi_schedule_prep(struct napi_struct *n)
*/ */
new |= (val & NAPIF_STATE_SCHED) / NAPIF_STATE_SCHED * new |= (val & NAPIF_STATE_SCHED) / NAPIF_STATE_SCHED *
NAPIF_STATE_MISSED; NAPIF_STATE_MISSED;
} while (cmpxchg(&n->state, val, new) != val); } while (!try_cmpxchg(&n->state, &val, new));
return !(val & NAPIF_STATE_SCHED); return !(val & NAPIF_STATE_SCHED);
} }
...@@ -6063,9 +6062,8 @@ bool napi_complete_done(struct napi_struct *n, int work_done) ...@@ -6063,9 +6062,8 @@ bool napi_complete_done(struct napi_struct *n, int work_done)
local_irq_restore(flags); local_irq_restore(flags);
} }
do {
val = READ_ONCE(n->state); val = READ_ONCE(n->state);
do {
WARN_ON_ONCE(!(val & NAPIF_STATE_SCHED)); WARN_ON_ONCE(!(val & NAPIF_STATE_SCHED));
new = val & ~(NAPIF_STATE_MISSED | NAPIF_STATE_SCHED | new = val & ~(NAPIF_STATE_MISSED | NAPIF_STATE_SCHED |
...@@ -6078,7 +6076,7 @@ bool napi_complete_done(struct napi_struct *n, int work_done) ...@@ -6078,7 +6076,7 @@ bool napi_complete_done(struct napi_struct *n, int work_done)
*/ */
new |= (val & NAPIF_STATE_MISSED) / NAPIF_STATE_MISSED * new |= (val & NAPIF_STATE_MISSED) / NAPIF_STATE_MISSED *
NAPIF_STATE_SCHED; NAPIF_STATE_SCHED;
} while (cmpxchg(&n->state, val, new) != val); } while (!try_cmpxchg(&n->state, &val, new));
if (unlikely(val & NAPIF_STATE_MISSED)) { if (unlikely(val & NAPIF_STATE_MISSED)) {
__napi_schedule(n); __napi_schedule(n);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment