From d0573e3e497337e13f4685de4b455817dfb601b7 Mon Sep 17 00:00:00 2001
From: Rickard Green <rickard@erlang.org>
Date: Mon, 12 Mar 2018 15:41:16 +0100
Subject: Reschedule on ordinary scheduler if dirty work is gone

---
 erts/emulator/beam/erl_process.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

(limited to 'erts')

diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index 63e9275ac1..bcf68e80ba 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -10816,6 +10816,10 @@ Process *erts_schedule(ErtsSchedulerData *esdp, Process *p, int calls)
 	    p->scheduler_data = esdp;
 	}
 	else {
+            if (!(state & ERTS_PSFLGS_DIRTY_WORK)) {
+                /* Dirty work completed... */
+		goto sunlock_sched_out_proc;
+            }
 	    if (state & (ERTS_PSFLG_ACTIVE_SYS
 			 | ERTS_PSFLG_PENDING_EXIT
 			 | ERTS_PSFLG_EXITING)) {
@@ -10966,6 +10970,23 @@ Process *erts_schedule(ErtsSchedulerData *esdp, Process *p, int calls)
 	    ERTS_PTMR_CLEAR(p);
 	}
 
+#ifdef DEBUG
+        if (is_normal_sched) {
+	    if (state & ERTS_PSFLGS_DIRTY_WORK)
+                ERTS_INTERNAL_ERROR("Executing dirty code on normal scheduler");
+        }
+        else {
+	    if (!(state & ERTS_PSFLGS_DIRTY_WORK)) {
+                if (esdp->type == ERTS_SCHED_DIRTY_CPU)
+                    ERTS_INTERNAL_ERROR("Executing normal code on dirty CPU scheduler");
+                else if (esdp->type == ERTS_SCHED_DIRTY_IO)
+                    ERTS_INTERNAL_ERROR("Executing normal code on dirty IO scheduler");
+                else
+                    ERTS_INTERNAL_ERROR("Executing normal code on dirty UNKNOWN scheduler");
+            }
+        }
+#endif
+
 	return p;
     }
 }
-- 
cgit v1.2.3