123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- From 56364c910691f6d10ba88c964c9041b9ab777bd6 Mon Sep 17 00:00:00 2001
- From: Sebastian Andrzej Siewior <[email protected]>
- Date: Mon, 25 Mar 2024 08:40:28 +0100
- Subject: [PATCH 1/4] net: Remove conditional threaded-NAPI wakeup based on
- task state.
- A NAPI thread is scheduled by first setting NAPI_STATE_SCHED bit. If
- successful (the bit was not yet set) then the NAPI_STATE_SCHED_THREADED
- is set but only if thread's state is not TASK_INTERRUPTIBLE (is
- TASK_RUNNING) followed by task wakeup.
- If the task is idle (TASK_INTERRUPTIBLE) then the
- NAPI_STATE_SCHED_THREADED bit is not set. The thread is no relying on
- the bit but always leaving the wait-loop after returning from schedule()
- because there must have been a wakeup.
- The smpboot-threads implementation for per-CPU threads requires an
- explicit condition and does not support "if we get out of schedule()
- then there must be something to do".
- Removing this optimisation simplifies the following integration.
- Set NAPI_STATE_SCHED_THREADED unconditionally on wakeup and rely on it
- in the wait path by removing the `woken' condition.
- Acked-by: Jakub Kicinski <[email protected]>
- Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
- Signed-off-by: Paolo Abeni <[email protected]>
- ---
- net/core/dev.c | 14 ++------------
- 1 file changed, 2 insertions(+), 12 deletions(-)
- --- a/net/core/dev.c
- +++ b/net/core/dev.c
- @@ -4483,13 +4483,7 @@ static inline void ____napi_schedule(str
- */
- thread = READ_ONCE(napi->thread);
- if (thread) {
- - /* Avoid doing set_bit() if the thread is in
- - * INTERRUPTIBLE state, cause napi_thread_wait()
- - * makes sure to proceed with napi polling
- - * if the thread is explicitly woken from here.
- - */
- - if (READ_ONCE(thread->__state) != TASK_INTERRUPTIBLE)
- - set_bit(NAPI_STATE_SCHED_THREADED, &napi->state);
- + set_bit(NAPI_STATE_SCHED_THREADED, &napi->state);
- wake_up_process(thread);
- return;
- }
- @@ -6645,8 +6639,6 @@ static int napi_poll(struct napi_struct
-
- static int napi_thread_wait(struct napi_struct *napi)
- {
- - bool woken = false;
- -
- set_current_state(TASK_INTERRUPTIBLE);
-
- while (!kthread_should_stop()) {
- @@ -6655,15 +6647,13 @@ static int napi_thread_wait(struct napi_
- * Testing SCHED bit is not enough because SCHED bit might be
- * set by some other busy poll thread or by napi_disable().
- */
- - if (test_bit(NAPI_STATE_SCHED_THREADED, &napi->state) || woken) {
- + if (test_bit(NAPI_STATE_SCHED_THREADED, &napi->state)) {
- WARN_ON(!list_empty(&napi->poll_list));
- __set_current_state(TASK_RUNNING);
- return 0;
- }
-
- schedule();
- - /* woken being true indicates this thread owns this napi. */
- - woken = true;
- set_current_state(TASK_INTERRUPTIBLE);
- }
- __set_current_state(TASK_RUNNING);
|