net: page_pool: avoid false positive warning if NAPI was never added
authorJakub Kicinski <kuba@kernel.org>
Thu, 6 Feb 2025 22:56:37 +0000 (14:56 -0800)
committerJakub Kicinski <kuba@kernel.org>
Sat, 8 Feb 2025 01:21:03 +0000 (17:21 -0800)
We expect NAPI to be in disabled state when page pool is torn down.
But it is also legal if the NAPI is completely uninitialized.

Reviewed-by: Mina Almasry <almasrymina@google.com>
Link: https://patch.msgid.link/20250206225638.1387810-4-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/dev.h
net/core/page_pool.c

index a5b166bbd169a0aea925dd794db25f26418de87d..caa13e431a6bcfdc4aad1cbcaa4a9487e34e2fa6 100644 (file)
@@ -299,6 +299,18 @@ void xdp_do_check_flushed(struct napi_struct *napi);
 static inline void xdp_do_check_flushed(struct napi_struct *napi) { }
 #endif
 
+/* Best effort check that NAPI is not idle (can't be scheduled to run) */
+static inline void napi_assert_will_not_race(const struct napi_struct *napi)
+{
+       /* uninitialized instance, can't race */
+       if (!napi->poll_list.next)
+               return;
+
+       /* SCHED bit is set on disabled instances */
+       WARN_ON(!test_bit(NAPI_STATE_SCHED, &napi->state));
+       WARN_ON(READ_ONCE(napi->list_owner) != -1);
+}
+
 void kick_defer_list_purge(struct softnet_data *sd, unsigned int cpu);
 
 #define XMIT_RECURSION_LIMIT   8
index 686bd4a117d93d86c71da2fdfffc32fcfd7b9e40..1c6fec08bc43498c443b4278de0f910b793901db 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <trace/events/page_pool.h>
 
+#include "dev.h"
 #include "mp_dmabuf_devmem.h"
 #include "netmem_priv.h"
 #include "page_pool_priv.h"
@@ -1147,11 +1148,7 @@ void page_pool_disable_direct_recycling(struct page_pool *pool)
        if (!pool->p.napi)
                return;
 
-       /* To avoid races with recycling and additional barriers make sure
-        * pool and NAPI are unlinked when NAPI is disabled.
-        */
-       WARN_ON(!test_bit(NAPI_STATE_SCHED, &pool->p.napi->state));
-       WARN_ON(READ_ONCE(pool->p.napi->list_owner) != -1);
+       napi_assert_will_not_race(pool->p.napi);
 
        mutex_lock(&page_pools_lock);
        WRITE_ONCE(pool->p.napi, NULL);