File 6704-Track-waiting-schedulers.patch of Package erlang

From 09c6a67976d036e0c4524879cc3d70c823901395 Mon Sep 17 00:00:00 2001
From: Rickard Green <rickard@erlang.org>
Date: Tue, 22 Jul 2025 14:11:09 +0200
Subject: [PATCH 4/4] Track waiting schedulers

---
 erts/emulator/beam/erl_process.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index 9bfbc8bd4b..081a9ca6d0 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -339,6 +339,7 @@ static erts_atomic32_t function_calls;
 static erts_atomic32_t doing_sys_schedule;
 #endif
 static erts_atomic32_t no_empty_run_queues;
+static erts_atomic32_t no_waiting_scheds;
 long erts_runq_supervision_interval = 0;
 static ethr_event runq_supervision_event;
 static erts_tid_t runq_supervisor_tid;
@@ -2934,6 +2935,7 @@ sched_waiting(Uint no, ErtsRunQueue *rq)
     ERTS_LC_ASSERT(erts_lc_runq_is_locked(rq));
     (void) ERTS_RUNQ_FLGS_SET(rq, (ERTS_RUNQ_FLG_OUT_OF_WORK
 				   | ERTS_RUNQ_FLG_HALFTIME_OUT_OF_WORK));
+    erts_atomic32_inc_nob(&no_waiting_scheds);
     rq->waiting++;
     rq->woken = 0;
     if (!ERTS_RUNQ_IX_IS_DIRTY(rq->ix) && erts_system_profile_flags.scheduler)
@@ -2944,6 +2946,7 @@ static ERTS_INLINE void
 sched_active(Uint no, ErtsRunQueue *rq)
 {
     ERTS_LC_ASSERT(erts_lc_runq_is_locked(rq));
+    erts_atomic32_dec_nob(&no_waiting_scheds);
     rq->waiting--;
     if (!ERTS_RUNQ_IX_IS_DIRTY(rq->ix) && erts_system_profile_flags.scheduler)
 	profile_scheduler(make_small(no), am_active);
@@ -5626,11 +5629,9 @@ wakeup_other_check(ErtsRunQueue *rq, Uint32 flags)
 		    if (rq->waiting) {
 			wake_dirty_scheduler(rq);
 		    }
-		} else
-		{
-		    int empty_rqs =
-			erts_atomic32_read_acqb(&no_empty_run_queues);
-		    if (empty_rqs != 0)
+		}
+                else {
+		    if (erts_atomic32_read_nob(&no_waiting_scheds))
 			wake_scheduler_on_empty_runq(rq);
 		    rq->wakeup_other = 0;
 		}
@@ -6128,6 +6129,7 @@ erts_init_scheduling(int no_schedulers, int no_schedulers_online, int no_poll_th
     erts_atomic32_init_nob(&function_calls, 0);
 #endif
     erts_atomic32_init_nob(&no_empty_run_queues, 0);
+    erts_atomic32_init_nob(&no_waiting_scheds, 0);
 
     erts_no_run_queues = n;
 
@@ -9822,7 +9824,6 @@ Process *erts_schedule(ErtsSchedulerData *esdp, Process *p, int calls)
     continue_check_activities_to_run:
 	flags = ERTS_RUNQ_FLGS_GET_NOB(rq);
     continue_check_activities_to_run_known_flags:
-	ASSERT(!is_normal_sched || (flags & ERTS_RUNQ_FLG_NONEMPTY));
 
 	if (!is_normal_sched) {
 	    if (erts_atomic32_read_acqb(&esdp->ssi->flags)
-- 
2.51.0

openSUSE Build Service is sponsored by