net: adopt try_cmpxchg() in napi_{enable|disable}()
authorEric Dumazet <edumazet@google.com>
Tue, 15 Nov 2022 09:11:00 +0000 (09:11 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 16 Nov 2022 12:42:01 +0000 (12:42 +0000)
This makes code a bit cleaner.

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

index 0c12c7a..fb943da 100644 (file)
@@ -6397,8 +6397,8 @@ void napi_disable(struct napi_struct *n)
        might_sleep();
        set_bit(NAPI_STATE_DISABLE, &n->state);
 
-       for ( ; ; ) {
-               val = READ_ONCE(n->state);
+       val = READ_ONCE(n->state);
+       do {
                if (val & (NAPIF_STATE_SCHED | NAPIF_STATE_NPSVC)) {
                        usleep_range(20, 200);
                        continue;
@@ -6406,10 +6406,7 @@ void napi_disable(struct napi_struct *n)
 
                new = val | NAPIF_STATE_SCHED | NAPIF_STATE_NPSVC;
                new &= ~(NAPIF_STATE_THREADED | NAPIF_STATE_PREFER_BUSY_POLL);
-
-               if (cmpxchg(&n->state, val, new) == val)
-                       break;
-       }
+       } while (!try_cmpxchg(&n->state, &val, new));
 
        hrtimer_cancel(&n->timer);
 
@@ -6426,16 +6423,15 @@ EXPORT_SYMBOL(napi_disable);
  */
 void napi_enable(struct napi_struct *n)
 {
-       unsigned long val, new;
+       unsigned long new, val = READ_ONCE(n->state);
 
        do {
-               val = READ_ONCE(n->state);
                BUG_ON(!test_bit(NAPI_STATE_SCHED, &val));
 
                new = val & ~(NAPIF_STATE_SCHED | NAPIF_STATE_NPSVC);
                if (n->dev->threaded && n->thread)
                        new |= NAPIF_STATE_THREADED;
-       } while (cmpxchg(&n->state, val, new) != val);
+       } while (!try_cmpxchg(&n->state, &val, new));
 }
 EXPORT_SYMBOL(napi_enable);