diff options
author | Rickard Green <rickard@erlang.org> | 2020-01-09 15:33:20 +0100 |
---|---|---|
committer | Rickard Green <rickard@erlang.org> | 2020-01-09 17:56:58 +0100 |
commit | 0109f91a76ea6873cf9851529d7c60b70f328f86 (patch) | |
tree | 9034b2e54a7a0cbacd6d2c870ff25bfb08c065ec | |
parent | db6059a9217767a6e42e93cec05089c0ec977d20 (diff) | |
download | erlang-0109f91a76ea6873cf9851529d7c60b70f328f86.tar.gz |
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 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++) |