summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRickard Green <rickard@erlang.org>2020-01-09 15:33:20 +0100
committerRickard Green <rickard@erlang.org>2020-01-09 17:56:58 +0100
commit0109f91a76ea6873cf9851529d7c60b70f328f86 (patch)
tree9034b2e54a7a0cbacd6d2c870ff25bfb08c065ec
parentdb6059a9217767a6e42e93cec05089c0ec977d20 (diff)
downloaderlang-0109f91a76ea6873cf9851529d7c60b70f328f86.tar.gz
Fix multi-scheduling block
-rw-r--r--erts/emulator/beam/erl_process.c38
1 files changed, 24 insertions, 14 deletions
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index 9f6adb03d0..d27bd54deb 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -7944,18 +7944,31 @@ suspend_scheduler(ErtsSchedulerData *esdp)
for (i = 0; msb[i]; i++) {
erts_aint32_t clr_flg = 0;
- if (msb[i] == &schdlr_sspnd.nmsb
- && schdlr_sspnd_get_nscheds(&schdlr_sspnd.active,
- ERTS_SCHED_NORMAL) == 1) {
- clr_flg = ERTS_SCHDLR_SSPND_CHNG_NMSB;
+ if (!msb[i]->ongoing)
+ continue;
+
+ if (msb[i] == &schdlr_sspnd.nmsb) {
+ if (schdlr_sspnd_get_nscheds(&schdlr_sspnd.active,
+ ERTS_SCHED_NORMAL) == 1) {
+ clr_flg = ERTS_SCHDLR_SSPND_CHNG_NMSB;
+ }
}
- else if (schdlr_sspnd_get_nscheds(&schdlr_sspnd.active,
- ERTS_SCHED_NORMAL) == 1
- && schdlr_sspnd_get_nscheds(&schdlr_sspnd.active,
- ERTS_SCHED_DIRTY_CPU) == 0
- && schdlr_sspnd_get_nscheds(&schdlr_sspnd.active,
- ERTS_SCHED_DIRTY_IO) == 0) {
- clr_flg = ERTS_SCHDLR_SSPND_CHNG_MSB;
+ else {
+ ASSERT(msb[i] == &schdlr_sspnd.msb);
+ if (schdlr_sspnd_get_nscheds(&schdlr_sspnd.active,
+ ERTS_SCHED_NORMAL) == 1
+ && schdlr_sspnd_get_nscheds(&schdlr_sspnd.active,
+ ERTS_SCHED_DIRTY_CPU) == 0
+ && schdlr_sspnd_get_nscheds(&schdlr_sspnd.active,
+ ERTS_SCHED_DIRTY_IO) == 0) {
+
+ clr_flg = ERTS_SCHDLR_SSPND_CHNG_MSB;
+
+ /* Begin switching between scheduler types executing... */
+ ERTS_RUNQ_FLGS_SET_NOB(ERTS_RUNQ_IX(0), ERTS_RUNQ_FLG_MSB_EXEC);
+ erts_smp_atomic32_read_bor_nob(&ERTS_RUNQ_IX(0)->scheduler->ssi->flags,
+ ERTS_SSI_FLG_MSB_EXEC);
+ }
}
if (clr_flg) {
@@ -8667,9 +8680,6 @@ erts_block_multi_scheduling(Process *p, ErtsProcLocks plocks, int on, int normal
#ifdef ERTS_DIRTY_SCHEDULERS
if (!normal) {
- ERTS_RUNQ_FLGS_SET_NOB(ERTS_RUNQ_IX(0), ERTS_RUNQ_FLG_MSB_EXEC);
- erts_smp_atomic32_read_bor_nob(&ERTS_RUNQ_IX(0)->scheduler->ssi->flags,
- ERTS_SSI_FLG_MSB_EXEC);
for (ix = 0; ix < erts_no_dirty_cpu_schedulers; ix++)
dcpu_sched_ix_suspend_wake(ix);
for (ix = 0; ix < erts_no_dirty_io_schedulers; ix++)