net: adopt try_cmpxchg() in napi_schedule_prep() and napi_complete_done()
authorEric Dumazet <edumazet@google.com>
Tue, 15 Nov 2022 09:10:59 +0000 (09:10 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 16 Nov 2022 12:42:01 +0000 (12:42 +0000)
This makes the code slightly more efficient.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c

index 10b5664..0c12c7a 100644 (file)
@@ -5979,10 +5979,9 @@ EXPORT_SYMBOL(__napi_schedule);
  */
 bool napi_schedule_prep(struct napi_struct *n)
 {
-       unsigned long val, new;
+       unsigned long new, val = READ_ONCE(n->state);
 
        do {
-               val = READ_ONCE(n->state);
                if (unlikely(val & NAPIF_STATE_DISABLE))
                        return false;
                new = val | NAPIF_STATE_SCHED;
@@ -5995,7 +5994,7 @@ bool napi_schedule_prep(struct napi_struct *n)
                 */
                new |= (val & NAPIF_STATE_SCHED) / NAPIF_STATE_SCHED *
                                                   NAPIF_STATE_MISSED;
-       } while (cmpxchg(&n->state, val, new) != val);
+       } while (!try_cmpxchg(&n->state, &val, new));
 
        return !(val & NAPIF_STATE_SCHED);
 }
@@ -6063,9 +6062,8 @@ bool napi_complete_done(struct napi_struct *n, int work_done)
                local_irq_restore(flags);
        }
 
+       val = READ_ONCE(n->state);
        do {
-               val = READ_ONCE(n->state);
-
                WARN_ON_ONCE(!(val & 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)
                 */
                new |= (val & NAPIF_STATE_MISSED) / NAPIF_STATE_MISSED *
                                                    NAPIF_STATE_SCHED;
-       } while (cmpxchg(&n->state, val, new) != val);
+       } while (!try_cmpxchg(&n->state, &val, new));
 
        if (unlikely(val & NAPIF_STATE_MISSED)) {
                __napi_schedule(n);