<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From 8e758bb3fc5eee316843eeaad1601ee44ce1c899 Mon Sep 17 00:00:00 2001
From: Sam Shih &lt;sam.shih@mediatek.com&gt;
Date: Fri, 2 Jun 2023 13:06:30 +0800
Subject: [PATCH] 
 [networking][999-2710-net-make-napi-disable-symmetric-with-enable.patch]

---
 net/core/dev.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/net/core/dev.c b/net/core/dev.c
index 503af0034..cccd7b407 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -6389,18 +6389,25 @@ EXPORT_SYMBOL(netif_napi_add);
 
 void napi_disable(struct napi_struct *n)
 {
+	unsigned long val, new;
+
 	might_sleep();
 	set_bit(NAPI_STATE_DISABLE, &amp;n-&gt;state);
 
-	while (test_and_set_bit(NAPI_STATE_SCHED, &amp;n-&gt;state))
-		msleep(1);
-	while (test_and_set_bit(NAPI_STATE_NPSVC, &amp;n-&gt;state))
-		msleep(1);
+	do {
+		val = READ_ONCE(n-&gt;state);
+		if (val &amp; (NAPIF_STATE_SCHED | NAPIF_STATE_NPSVC)) {
+			usleep_range(20, 200);
+			continue;
+		}
+
+		new = val | NAPIF_STATE_SCHED | NAPIF_STATE_NPSVC;
+		new &amp;= ~(NAPIF_STATE_THREADED);
+	} while (cmpxchg(&amp;n-&gt;state, val, new) != val);
 
 	hrtimer_cancel(&amp;n-&gt;timer);
 
 	clear_bit(NAPI_STATE_DISABLE, &amp;n-&gt;state);
-	clear_bit(NAPI_STATE_THREADED, &amp;n-&gt;state);
 }
 EXPORT_SYMBOL(napi_disable);
 
-- 
2.34.1

</pre></body></html>