summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErlang/OTP <otp@erlang.org>2020-01-16 16:41:47 +0100
committerErlang/OTP <otp@erlang.org>2020-01-16 16:41:47 +0100
commitccfaa499d9bd587296ca7dea2b10fa1cf6939661 (patch)
treed6cc5a5225d819917aa5278ddaaf2b8a13c9d69a
parentedc678d5add2c741bc6d63f9f434e43e9bb12dae (diff)
parent0109f91a76ea6873cf9851529d7c60b70f328f86 (diff)
downloaderlang-ccfaa499d9bd587296ca7dea2b10fa1cf6939661.tar.gz
Merge branch 'rickard/msb-fix-20/OTP-16379' into maint-20
* rickard/msb-fix-20/OTP-16379: 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 cd95ef1a8a..f78631abb8 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -8010,18 +8010,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) {
@@ -8733,9 +8746,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++)