diff options
author | Erlang/OTP <otp@erlang.org> | 2020-01-16 16:41:47 +0100 |
---|---|---|
committer | Erlang/OTP <otp@erlang.org> | 2020-01-16 16:41:47 +0100 |
commit | ccfaa499d9bd587296ca7dea2b10fa1cf6939661 (patch) | |
tree | d6cc5a5225d819917aa5278ddaaf2b8a13c9d69a | |
parent | edc678d5add2c741bc6d63f9f434e43e9bb12dae (diff) | |
parent | 0109f91a76ea6873cf9851529d7c60b70f328f86 (diff) | |
download | erlang-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.c | 38 |
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++) |