This is an automated email from the ASF dual-hosted git repository. ligd pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 6a57c5692578ee9e33e6a0c81f89425f4e9db604 Author: guoshengyuan1 <[email protected]> AuthorDate: Tue Sep 23 10:24:02 2025 +0800 arch: replace all nxsched_suspend/resume_*** with nxsched_switch_context Complete the missing scheduling information in some architectures In these architectures (riscv, avr, tricor) context switching can occur in both up_switch_context and xx_doirq Co-authored-by: yinshengkai <[email protected]> Signed-off-by: guoshengyuan1 <[email protected]> --- arch/avr/src/avr/avr_doirq.c | 8 +++++++- arch/avr/src/avr/avr_switchcontext.c | 10 +--------- arch/avr/src/avr32/avr_doirq.c | 4 ++++ arch/avr/src/avr32/avr_switchcontext.c | 10 +--------- arch/ceva/src/common/ceva_doirq.c | 7 ++++--- arch/ceva/src/common/ceva_switchcontext.c | 4 ++++ arch/hc/src/common/hc_doirq.c | 4 ++++ arch/hc/src/common/hc_switchcontext.c | 10 +--------- arch/mips/src/mips32/mips_doirq.c | 6 +++++- arch/mips/src/mips32/mips_switchcontext.c | 10 +--------- arch/misoc/src/lm32/lm32_doirq.c | 4 ++++ arch/misoc/src/lm32/lm32_switchcontext.c | 10 +--------- arch/misoc/src/minerva/minerva_doirq.c | 6 +++++- arch/misoc/src/minerva/minerva_switchcontext.c | 10 +--------- arch/or1k/src/common/or1k_doirq.c | 4 ++++ arch/or1k/src/common/or1k_switchcontext.c | 10 +--------- arch/renesas/src/common/renesas_doirq.c | 4 ++++ arch/renesas/src/common/renesas_switchcontext.c | 10 +--------- arch/risc-v/src/common/riscv_doirq.c | 7 +------ arch/risc-v/src/common/riscv_switchcontext.c | 4 ++++ arch/risc-v/src/common/supervisor/riscv_perform_syscall.c | 4 +--- arch/sim/src/sim/sim_doirq.c | 8 +++++++- arch/sim/src/sim/sim_switchcontext.c | 10 +--------- arch/sparc/src/sparc_v8/sparc_v8_doirq.c | 6 +++++- arch/sparc/src/sparc_v8/sparc_v8_switchcontext.c | 10 +--------- arch/tricore/src/common/tricore_doirq.c | 4 ++++ arch/tricore/src/common/tricore_switchcontext.c | 10 +--------- arch/x86/src/common/x86_switchcontext.c | 10 +--------- arch/x86/src/qemu/qemu_handlers.c | 3 +-- arch/x86_64/src/common/x86_64_switchcontext.c | 8 +++++--- arch/x86_64/src/intel64/intel64_handlers.c | 3 +-- arch/xtensa/src/common/xtensa_irqdispatch.c | 3 +-- arch/z16/src/common/z16_doirq.c | 8 +++++++- arch/z16/src/common/z16_switchcontext.c | 10 +--------- arch/z80/src/common/z80_doirq.c | 4 ++++ arch/z80/src/common/z80_switchcontext.c | 11 ++--------- 36 files changed, 101 insertions(+), 153 deletions(-) diff --git a/arch/avr/src/avr/avr_doirq.c b/arch/avr/src/avr/avr_doirq.c index 7227fe8467e..20ad32d9079 100644 --- a/arch/avr/src/avr/avr_doirq.c +++ b/arch/avr/src/avr/avr_doirq.c @@ -96,12 +96,18 @@ uint8_t *avr_doirq(uint8_t irq, uint8_t *regs) if (regs != up_current_regs()) { + struct tcb_s *tcb = this_task(); + + /* Update scheduler parameters */ + + nxsched_switch_context(*running_task, tcb); + /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting * crashes. */ - *running_task = this_task(); + *running_task = tcb; } regs = up_current_regs(); /* Cast removes volatile attribute */ diff --git a/arch/avr/src/avr/avr_switchcontext.c b/arch/avr/src/avr/avr_switchcontext.c index 159601d7624..34512d0929e 100644 --- a/arch/avr/src/avr/avr_switchcontext.c +++ b/arch/avr/src/avr/avr_switchcontext.c @@ -56,10 +56,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { - /* Update scheduler parameters */ - - nxsched_suspend_scheduler(rtcb); - /* Are we in an interrupt handler? */ if (up_current_regs()) @@ -70,10 +66,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) avr_savestate(rtcb->xcp.regs); - /* Update scheduler parameters */ - - nxsched_resume_scheduler(tcb); - /* Then switch contexts */ avr_restorestate(tcb->xcp.regs); @@ -85,7 +77,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { /* Update scheduler parameters */ - nxsched_resume_scheduler(tcb); + nxsched_switch_context(rtcb, tcb); /* Record the new "running" task */ diff --git a/arch/avr/src/avr32/avr_doirq.c b/arch/avr/src/avr32/avr_doirq.c index 11776391271..ec34bd9871b 100644 --- a/arch/avr/src/avr32/avr_doirq.c +++ b/arch/avr/src/avr32/avr_doirq.c @@ -109,6 +109,10 @@ uint32_t *avr_doirq(int irq, uint32_t *regs) addrenv_switch(tcb); #endif + /* Update scheduler parameters. */ + + nxsched_switch_context(*running_task, tcb); + /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting * crashes. diff --git a/arch/avr/src/avr32/avr_switchcontext.c b/arch/avr/src/avr32/avr_switchcontext.c index c999b205274..7947762244a 100644 --- a/arch/avr/src/avr32/avr_switchcontext.c +++ b/arch/avr/src/avr32/avr_switchcontext.c @@ -58,10 +58,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { - /* Update scheduler parameters */ - - nxsched_suspend_scheduler(rtcb); - /* Are we in an interrupt handler? */ if (up_current_regs()) @@ -72,10 +68,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) avr_savestate(rtcb->xcp.regs); - /* Update scheduler parameters */ - - nxsched_resume_scheduler(tcb); - /* Then switch contexts. Any new address environment needed by * the new thread will be instantiated before the return from * interrupt. @@ -99,7 +91,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) #endif /* Update scheduler parameters */ - nxsched_resume_scheduler(tcb); + nxsched_switch_context(rtcb, tcb); /* Record the new "running" task */ diff --git a/arch/ceva/src/common/ceva_doirq.c b/arch/ceva/src/common/ceva_doirq.c index b5bf60ef942..cec144847ce 100644 --- a/arch/ceva/src/common/ceva_doirq.c +++ b/arch/ceva/src/common/ceva_doirq.c @@ -87,17 +87,18 @@ uint32_t *ceva_doirq(int irq, uint32_t *regs) if (regs != up_current_regs()) { + struct tcb_s *tcb = this_task(); + /* Update scheduler parameters */ - nxsched_suspend_scheduler(*running_task); - nxsched_resume_scheduler(this_task()); + nxsched_switch_context(*running_task, tcb); /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting * crashes. */ - g_running_tasks[this_cpu()] = this_task(); + *running_task = tcb; regs = up_current_regs(); } diff --git a/arch/ceva/src/common/ceva_switchcontext.c b/arch/ceva/src/common/ceva_switchcontext.c index a1d86136249..1c3a86b0b63 100644 --- a/arch/ceva/src/common/ceva_switchcontext.c +++ b/arch/ceva/src/common/ceva_switchcontext.c @@ -90,6 +90,10 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) else { + /* Update scheduler parameters */ + + nxsched_switch_context(rtcb, tcb); + /* Switch context to the context of the task at the head of the * ready to run list. */ diff --git a/arch/hc/src/common/hc_doirq.c b/arch/hc/src/common/hc_doirq.c index cfeba105bda..4df650fb39f 100644 --- a/arch/hc/src/common/hc_doirq.c +++ b/arch/hc/src/common/hc_doirq.c @@ -109,6 +109,10 @@ uint8_t *hc_doirq(int irq, uint8_t *regs) addrenv_switch(tcb); #endif + /* Update scheduler parameters. */ + + nxsched_switch_context(*running_task, tcb); + /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting * crashes. diff --git a/arch/hc/src/common/hc_switchcontext.c b/arch/hc/src/common/hc_switchcontext.c index 182b39998f3..61587fcf09e 100644 --- a/arch/hc/src/common/hc_switchcontext.c +++ b/arch/hc/src/common/hc_switchcontext.c @@ -58,10 +58,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { - /* Update scheduler parameters */ - - nxsched_suspend_scheduler(rtcb); - /* Are we in an interrupt handler? */ if (up_current_regs()) @@ -72,10 +68,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) hc_savestate(rtcb->xcp.regs); - /* Update scheduler parameters */ - - nxsched_resume_scheduler(tcb); - /* Then switch contexts. Any necessary address environment * changes will be made when the interrupt returns. */ @@ -102,7 +94,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) #endif /* Update scheduler parameters */ - nxsched_resume_scheduler(tcb); + nxsched_switch_context(rtcb, tcb); /* Record the new "running" task */ diff --git a/arch/mips/src/mips32/mips_doirq.c b/arch/mips/src/mips32/mips_doirq.c index 5141726f663..b059db0a18b 100644 --- a/arch/mips/src/mips32/mips_doirq.c +++ b/arch/mips/src/mips32/mips_doirq.c @@ -118,12 +118,16 @@ uint32_t *mips_doirq(int irq, uint32_t *regs) addrenv_switch(tcb); #endif + /* Update scheduler parameters. */ + + nxsched_switch_context(*running_task, tcb); + /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting * crashes. */ - g_running_tasks[this_cpu()] = tcb; + *running_task = tcb; } /* If a context switch occurred while processing the interrupt then diff --git a/arch/mips/src/mips32/mips_switchcontext.c b/arch/mips/src/mips32/mips_switchcontext.c index d58f2597f25..d9516fc084a 100644 --- a/arch/mips/src/mips32/mips_switchcontext.c +++ b/arch/mips/src/mips32/mips_switchcontext.c @@ -59,10 +59,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { - /* Update scheduler parameters */ - - nxsched_suspend_scheduler(rtcb); - /* Are we in an interrupt handler? */ if (up_current_regs()) @@ -73,10 +69,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) mips_savestate(rtcb->xcp.regs); - /* Update scheduler parameters */ - - nxsched_resume_scheduler(tcb); - /* Then switch contexts. Any necessary address environment * changes will be made when the interrupt returns. */ @@ -90,7 +82,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { /* Update scheduler parameters */ - nxsched_resume_scheduler(tcb); + nxsched_switch_context(rtcb, tcb); /* Then switch contexts */ diff --git a/arch/misoc/src/lm32/lm32_doirq.c b/arch/misoc/src/lm32/lm32_doirq.c index d41c419c451..6958c061526 100644 --- a/arch/misoc/src/lm32/lm32_doirq.c +++ b/arch/misoc/src/lm32/lm32_doirq.c @@ -103,6 +103,10 @@ uint32_t *lm32_doirq(int irq, uint32_t *regs) addrenv_switch(tcb); #endif + /* Update scheduler parameters. */ + + nxsched_switch_context(*running_task, tcb); + /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting * crashes. diff --git a/arch/misoc/src/lm32/lm32_switchcontext.c b/arch/misoc/src/lm32/lm32_switchcontext.c index fac735acb01..68f8d19b0a1 100644 --- a/arch/misoc/src/lm32/lm32_switchcontext.c +++ b/arch/misoc/src/lm32/lm32_switchcontext.c @@ -59,10 +59,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { - /* Update scheduler parameters */ - - nxsched_suspend_scheduler(rtcb); - /* Are we in an interrupt handler? */ if (up_current_regs()) @@ -73,10 +69,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) misoc_savestate(rtcb->xcp.regs); - /* Update scheduler parameters */ - - nxsched_resume_scheduler(tcb); - /* Then switch contexts. Any necessary address environment * changes will be made when the interrupt returns. */ @@ -90,7 +82,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { /* Update scheduler parameters */ - nxsched_resume_scheduler(tcb); + nxsched_switch_context(rtcb, tcb); /* Then switch contexts */ diff --git a/arch/misoc/src/minerva/minerva_doirq.c b/arch/misoc/src/minerva/minerva_doirq.c index 2a1d140ba21..8f4b316d297 100644 --- a/arch/misoc/src/minerva/minerva_doirq.c +++ b/arch/misoc/src/minerva/minerva_doirq.c @@ -102,12 +102,16 @@ uint32_t *minerva_doirq(int irq, uint32_t * regs) addrenv_switch(tcb); #endif + /* Update scheduler parameters. */ + + nxsched_switch_context(*running_task, tcb); + /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting * crashes. */ - g_running_tasks[this_cpu()] = tcb; + *running_task = tcb; } /* If a context switch occurred while processing the interrupt then diff --git a/arch/misoc/src/minerva/minerva_switchcontext.c b/arch/misoc/src/minerva/minerva_switchcontext.c index 981bb9f0388..f32190526e3 100644 --- a/arch/misoc/src/minerva/minerva_switchcontext.c +++ b/arch/misoc/src/minerva/minerva_switchcontext.c @@ -59,10 +59,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { - /* Update scheduler parameters */ - - nxsched_suspend_scheduler(rtcb); - /* Are we in an interrupt handler? */ if (up_current_regs()) @@ -73,10 +69,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) misoc_savestate(rtcb->xcp.regs); - /* Update scheduler parameters */ - - nxsched_resume_scheduler(tcb); - /* Then switch contexts. Any necessary address environment changes * will be made when the interrupt returns. */ @@ -90,7 +82,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { /* Update scheduler parameters */ - nxsched_resume_scheduler(tcb); + nxsched_switch_context(rtcb, tcb); /* Then switch contexts */ diff --git a/arch/or1k/src/common/or1k_doirq.c b/arch/or1k/src/common/or1k_doirq.c index ddb1a4ce746..ee925f4b22b 100644 --- a/arch/or1k/src/common/or1k_doirq.c +++ b/arch/or1k/src/common/or1k_doirq.c @@ -78,6 +78,10 @@ uint32_t *or1k_doirq(int irq, uint32_t *regs) if (regs != up_current_regs()) { + /* Update scheduler parameters. */ + + nxsched_switch_context(*running_task, tcb); + /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting * crashes. diff --git a/arch/or1k/src/common/or1k_switchcontext.c b/arch/or1k/src/common/or1k_switchcontext.c index a8e12a310af..1927d1a6ca5 100644 --- a/arch/or1k/src/common/or1k_switchcontext.c +++ b/arch/or1k/src/common/or1k_switchcontext.c @@ -58,10 +58,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { - /* Update scheduler parameters */ - - nxsched_suspend_scheduler(rtcb); - /* Are we in an interrupt handler? */ #if 0 /* REVISIT */ @@ -76,10 +72,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) or1k_savestate(rtcb->xcp.regs); - /* Update scheduler parameters */ - - nxsched_resume_scheduler(tcb); - /* Then switch contexts. Any necessary address environment * changes will be made when the interrupt returns. */ @@ -106,7 +98,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) #endif /* Update scheduler parameters */ - nxsched_resume_scheduler(tcb); + nxsched_switch_context(rtcb, tcb); /* Record the new "running" task */ diff --git a/arch/renesas/src/common/renesas_doirq.c b/arch/renesas/src/common/renesas_doirq.c index 2d69fa82664..5380e230268 100644 --- a/arch/renesas/src/common/renesas_doirq.c +++ b/arch/renesas/src/common/renesas_doirq.c @@ -112,6 +112,10 @@ uint32_t *renesas_doirq(int irq, uint32_t * regs) addrenv_switch(tcb); #endif + /* Update scheduler parameters. */ + + nxsched_switch_context(*running_task, tcb); + /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting * crashes. diff --git a/arch/renesas/src/common/renesas_switchcontext.c b/arch/renesas/src/common/renesas_switchcontext.c index b070c94db9a..96bdf4e4803 100644 --- a/arch/renesas/src/common/renesas_switchcontext.c +++ b/arch/renesas/src/common/renesas_switchcontext.c @@ -58,10 +58,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { - /* Update scheduler parameters */ - - nxsched_suspend_scheduler(rtcb); - /* Are we in an interrupt handler? */ if (up_current_regs()) @@ -72,10 +68,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) renesas_savestate(rtcb->xcp.regs); - /* Update scheduler parameters */ - - nxsched_resume_scheduler(tcb); - /* Then switch contexts. Any necessary address environment * changes will be made when the interrupt returns. */ @@ -102,7 +94,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) #endif /* Update scheduler parameters */ - nxsched_resume_scheduler(tcb); + nxsched_switch_context(rtcb, tcb); /* Record the new "running" task */ diff --git a/arch/risc-v/src/common/riscv_doirq.c b/arch/risc-v/src/common/riscv_doirq.c index 836aca620a6..1be918f906c 100644 --- a/arch/risc-v/src/common/riscv_doirq.c +++ b/arch/risc-v/src/common/riscv_doirq.c @@ -128,12 +128,7 @@ uintreg_t *riscv_doirq(int irq, uintreg_t *regs) /* Update scheduler parameters */ - if (!restore_context) - { - nxsched_suspend_scheduler(*running_task); - } - - nxsched_resume_scheduler(tcb); + nxsched_switch_context(*running_task, tcb); /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting diff --git a/arch/risc-v/src/common/riscv_switchcontext.c b/arch/risc-v/src/common/riscv_switchcontext.c index 3ec995bc2a5..ce0f39f8131 100644 --- a/arch/risc-v/src/common/riscv_switchcontext.c +++ b/arch/risc-v/src/common/riscv_switchcontext.c @@ -80,6 +80,10 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) else { + /* Update scheduler parameters */ + + nxsched_switch_context(rtcb, tcb); + /* Then switch contexts */ riscv_switchcontext(); diff --git a/arch/risc-v/src/common/supervisor/riscv_perform_syscall.c b/arch/risc-v/src/common/supervisor/riscv_perform_syscall.c index c1afb5cc086..31271ac5eb8 100644 --- a/arch/risc-v/src/common/supervisor/riscv_perform_syscall.c +++ b/arch/risc-v/src/common/supervisor/riscv_perform_syscall.c @@ -73,11 +73,9 @@ void *riscv_perform_syscall(uintreg_t *regs) if (!restore_context) { - nxsched_suspend_scheduler(*running_task); + nxsched_switch_context(*running_task, tcb); } - nxsched_resume_scheduler(tcb); - /* Record the new "running" task. g_running_tasks[] is only used by * assertion logic for reporting crashes. */ diff --git a/arch/sim/src/sim/sim_doirq.c b/arch/sim/src/sim/sim_doirq.c index a575d478053..4086530d82d 100644 --- a/arch/sim/src/sim/sim_doirq.c +++ b/arch/sim/src/sim/sim_doirq.c @@ -83,12 +83,18 @@ void *sim_doirq(int irq, void *context) if (regs != up_current_regs()) { + struct tcb_s *tcb = this_task(); + + /* Update scheduler parameters. */ + + nxsched_switch_context(*running_task, tcb); + /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting * crashes. */ - *running_task = this_task(); + *running_task = tcb; } regs = up_current_regs(); diff --git a/arch/sim/src/sim/sim_switchcontext.c b/arch/sim/src/sim/sim_switchcontext.c index 507dc456da0..5cfe3a8ed45 100644 --- a/arch/sim/src/sim/sim_switchcontext.c +++ b/arch/sim/src/sim/sim_switchcontext.c @@ -60,10 +60,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) sinfo("Unblocking TCB=%p\n", tcb); - /* Update scheduler parameters */ - - nxsched_suspend_scheduler(rtcb); - /* Are we in an interrupt handler? */ if (up_interrupt_context()) @@ -74,10 +70,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) sim_savestate(rtcb->xcp.regs); - /* Update scheduler parameters */ - - nxsched_resume_scheduler(tcb); - /* Restore the cpu lock */ restore_critical_section(tcb, this_cpu()); @@ -101,7 +93,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) /* Update scheduler parameters */ - nxsched_resume_scheduler(tcb); + nxsched_switch_context(rtcb, tcb); /* Restore the cpu lock */ diff --git a/arch/sparc/src/sparc_v8/sparc_v8_doirq.c b/arch/sparc/src/sparc_v8/sparc_v8_doirq.c index e58ed58c43a..f45dc30a7ed 100644 --- a/arch/sparc/src/sparc_v8/sparc_v8_doirq.c +++ b/arch/sparc/src/sparc_v8/sparc_v8_doirq.c @@ -113,12 +113,16 @@ uint32_t *sparc_doirq(int irq, uint32_t *regs) addrenv_switch(tcb); #endif + /* Update scheduler parameters. */ + + nxsched_switch_context(*running_task, tcb); + /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting * crashes. */ - g_running_tasks[this_cpu()] = tcb; + *running_task = tcb; } /* If a context switch occurred while processing the interrupt then diff --git a/arch/sparc/src/sparc_v8/sparc_v8_switchcontext.c b/arch/sparc/src/sparc_v8/sparc_v8_switchcontext.c index 3262e7da069..03832aea919 100644 --- a/arch/sparc/src/sparc_v8/sparc_v8_switchcontext.c +++ b/arch/sparc/src/sparc_v8/sparc_v8_switchcontext.c @@ -59,10 +59,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { - /* Update scheduler parameters */ - - nxsched_suspend_scheduler(rtcb); - /* Are we in an interrupt handler? */ if (up_current_regs()) @@ -73,10 +69,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) sparc_savestate(rtcb->xcp.regs); - /* Update scheduler parameters */ - - nxsched_resume_scheduler(tcb); - /* Then switch contexts. Any necessary address environment * changes will be made when the interrupt returns. */ @@ -90,7 +82,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { /* Update scheduler parameters */ - nxsched_resume_scheduler(tcb); + nxsched_switch_context(rtcb, tcb); /* Then switch contexts */ diff --git a/arch/tricore/src/common/tricore_doirq.c b/arch/tricore/src/common/tricore_doirq.c index d4bd94b973b..ebb2e49d938 100644 --- a/arch/tricore/src/common/tricore_doirq.c +++ b/arch/tricore/src/common/tricore_doirq.c @@ -99,6 +99,10 @@ IFX_INTERRUPT_INTERNAL(tricore_doirq, 0, 255) addrenv_switch(tcb); #endif + /* Update scheduler parameters */ + + nxsched_switch_context(*running_task, tcb); + /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting * crashes. diff --git a/arch/tricore/src/common/tricore_switchcontext.c b/arch/tricore/src/common/tricore_switchcontext.c index 7b0d773e13d..47aefd036eb 100644 --- a/arch/tricore/src/common/tricore_switchcontext.c +++ b/arch/tricore/src/common/tricore_switchcontext.c @@ -59,10 +59,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { - /* Update scheduler parameters */ - - nxsched_suspend_scheduler(rtcb); - /* Are we in an interrupt handler? */ if (up_current_regs()) @@ -73,10 +69,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) tricore_savestate(rtcb->xcp.regs); - /* Update scheduler parameters */ - - nxsched_resume_scheduler(tcb); - /* Then switch contexts. Any necessary address environment * changes will be made when the interrupt returns. */ @@ -90,7 +82,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { /* Update scheduler parameters */ - nxsched_resume_scheduler(tcb); + nxsched_switch_context(rtcb, tcb); /* Then switch contexts */ diff --git a/arch/x86/src/common/x86_switchcontext.c b/arch/x86/src/common/x86_switchcontext.c index 61c8d88e80e..e604a0b685a 100644 --- a/arch/x86/src/common/x86_switchcontext.c +++ b/arch/x86/src/common/x86_switchcontext.c @@ -58,10 +58,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) { - /* Update scheduler parameters */ - - nxsched_suspend_scheduler(rtcb); - /* Are we in an interrupt handler? */ if (up_current_regs()) @@ -72,10 +68,6 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) x86_savestate(rtcb->xcp.regs); - /* Update scheduler parameters */ - - nxsched_resume_scheduler(tcb); - /* Then switch contexts. Any necessary address environment * changes will be made when the interrupt returns. */ @@ -102,7 +94,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) #endif /* Update scheduler parameters */ - nxsched_resume_scheduler(tcb); + nxsched_switch_context(rtcb, tcb); /* Record the new "running" task */ diff --git a/arch/x86/src/qemu/qemu_handlers.c b/arch/x86/src/qemu/qemu_handlers.c index a66267aecb9..a15c25b4a80 100644 --- a/arch/x86/src/qemu/qemu_handlers.c +++ b/arch/x86/src/qemu/qemu_handlers.c @@ -125,8 +125,7 @@ static uint32_t *common_handler(int irq, uint32_t *regs) /* Update scheduler parameters */ - nxsched_suspend_scheduler(*running_task); - nxsched_resume_scheduler(tcb); + nxsched_switch_context(*running_task, tcb); /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting diff --git a/arch/x86_64/src/common/x86_64_switchcontext.c b/arch/x86_64/src/common/x86_64_switchcontext.c index 6b13ba6e75d..a72c94b724b 100644 --- a/arch/x86_64/src/common/x86_64_switchcontext.c +++ b/arch/x86_64/src/common/x86_64_switchcontext.c @@ -84,6 +84,7 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) else if (!up_saveusercontext(rtcb->xcp.regs)) { + struct tcb_s **running_task; cpu = this_cpu(); x86_64_restore_auxstate(tcb); @@ -104,14 +105,15 @@ void up_switch_context(struct tcb_s *tcb, struct tcb_s *rtcb) /* Update scheduler parameters */ - nxsched_suspend_scheduler(g_running_tasks[cpu]); - nxsched_resume_scheduler(current_task(cpu)); + running_task = &g_running_tasks[cpu]; + tcb = current_task(cpu); + nxsched_switch_context(*running_task, tcb); /* Record the new "running" task. g_running_tasks[] is only used by * assertion logic for reporting crashes. */ - g_running_tasks[cpu] = current_task(cpu); + *running_task = tcb; /* Then switch contexts */ diff --git a/arch/x86_64/src/intel64/intel64_handlers.c b/arch/x86_64/src/intel64/intel64_handlers.c index af30b1a1df9..a19e8ce9331 100644 --- a/arch/x86_64/src/intel64/intel64_handlers.c +++ b/arch/x86_64/src/intel64/intel64_handlers.c @@ -106,8 +106,7 @@ static uint64_t *common_handler(int irq, uint64_t *regs) /* Update scheduler parameters */ - nxsched_suspend_scheduler(*running_task); - nxsched_resume_scheduler(tcb); + nxsched_switch_context(*running_task, tcb); /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting diff --git a/arch/xtensa/src/common/xtensa_irqdispatch.c b/arch/xtensa/src/common/xtensa_irqdispatch.c index 54a8ebb2ce3..ee8c3a735b7 100644 --- a/arch/xtensa/src/common/xtensa_irqdispatch.c +++ b/arch/xtensa/src/common/xtensa_irqdispatch.c @@ -97,8 +97,7 @@ uint32_t *xtensa_irq_dispatch(int irq, uint32_t *regs) /* Update scheduler parameters */ - nxsched_suspend_scheduler(*running_task); - nxsched_resume_scheduler(tcb); + nxsched_switch_context(*running_task, tcb); /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting diff --git a/arch/z16/src/common/z16_doirq.c b/arch/z16/src/common/z16_doirq.c index 068833ed18c..0da1b6e26df 100644 --- a/arch/z16/src/common/z16_doirq.c +++ b/arch/z16/src/common/z16_doirq.c @@ -92,12 +92,18 @@ FAR chipreg_t *z16_doirq(int irq, FAR chipreg_t *regs) if (regs != up_current_regs()) { + struct tcb_s *tcb = this_task(); + + /* Update scheduler parameters. */ + + nxsched_switch_context(*running_task, tcb); + /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting * crashes. */ - *running_task = this_task(); + *running_task = tcb; } /* Restore the previous value of g_current_regs. NULL would indicate diff --git a/arch/z16/src/common/z16_switchcontext.c b/arch/z16/src/common/z16_switchcontext.c index 5be35f03f38..3a2e22592b1 100644 --- a/arch/z16/src/common/z16_switchcontext.c +++ b/arch/z16/src/common/z16_switchcontext.c @@ -58,10 +58,6 @@ void up_switch_context(FAR struct tcb_s *tcb, FAR struct tcb_s *rtcb) { - /* Update scheduler parameters */ - - nxsched_suspend_scheduler(rtcb); - /* Are we in an interrupt handler? */ if (IN_INTERRUPT) @@ -72,10 +68,6 @@ void up_switch_context(FAR struct tcb_s *tcb, FAR struct tcb_s *rtcb) SAVE_IRQCONTEXT(rtcb); - /* Update scheduler parameters */ - - nxsched_resume_scheduler(tcb); - /* Then setup so that the context will be performed on exit * from the interrupt. */ @@ -93,7 +85,7 @@ void up_switch_context(FAR struct tcb_s *tcb, FAR struct tcb_s *rtcb) { /* Update scheduler parameters */ - nxsched_resume_scheduler(tcb); + nxsched_switch_context(rtcb, tcb); /* Record the new "running" task */ diff --git a/arch/z80/src/common/z80_doirq.c b/arch/z80/src/common/z80_doirq.c index 06ed0323fbf..2956c19f0ab 100644 --- a/arch/z80/src/common/z80_doirq.c +++ b/arch/z80/src/common/z80_doirq.c @@ -95,6 +95,10 @@ FAR chipreg_t *z80_doirq(uint8_t irq, FAR chipreg_t *regs) addrenv_switch(tcb); #endif + /* Update scheduler parameters */ + + nxsched_switch_context(*running_task, tcb); + /* Record the new "running" task when context switch occurred. * g_running_tasks[] is only used by assertion logic for reporting * crashes. diff --git a/arch/z80/src/common/z80_switchcontext.c b/arch/z80/src/common/z80_switchcontext.c index 959dbc279c5..42370fca64a 100644 --- a/arch/z80/src/common/z80_switchcontext.c +++ b/arch/z80/src/common/z80_switchcontext.c @@ -60,10 +60,6 @@ void up_switch_context(FAR struct tcb_s *tcb, FAR struct tcb_s *rtcb) { - /* Update scheduler parameters */ - - nxsched_suspend_scheduler(rtcb); - /* Are we in an interrupt handler? */ if (IN_INTERRUPT()) @@ -74,10 +70,6 @@ void up_switch_context(FAR struct tcb_s *tcb, FAR struct tcb_s *rtcb) SAVE_IRQCONTEXT(rtcb); - /* Update scheduler parameters */ - - nxsched_resume_scheduler(tcb); - /* Then setup so that the context will be performed on exit * from the interrupt. Any necessary address environment * changes will be made when the interrupt returns. @@ -103,9 +95,10 @@ void up_switch_context(FAR struct tcb_s *tcb, FAR struct tcb_s *rtcb) addrenv_switch(tcb); #endif + /* Update scheduler parameters */ - nxsched_resume_scheduler(tcb); + nxsched_switch_context(rtcb, tcb); /* Record the new "running" task */
