CPU_NEED_RESCHED(9)

CPU_NEED_RESCHED(9) | Kernel Developer's Manual | CPU_NEED_RESCHED(9)

# NAME

`cpu_need_resched` —
context switch notification

# SYNOPSIS

`#include <sys/cpu.h>`

void
`cpu_need_resched`(struct cpu_info *ci, struct lwp *l, int flags);

# DESCRIPTION

The `cpu_need_resched`() function is the machine-independent interface for the scheduler to notify machine-dependent code that a context switch from the current LWP l, on the cpu ci, is required. This event may occur if a higher priority LWP appears on the run queue or if the current LWP has exceeded its time slice. l is the last LWP observed running on the CPU. It may no longer be running, as `cpu_need_resched`() can be called without holding scheduler locks.

If the `RESCHED_KPREEMPT` flag is specified in flags and `__HAVE_PREEMPTION` C pre-processor macro is defined in `<machine/intr.h>`, machine-dependent code should make a context switch happen as soon as possible even if the CPU is running in kernel mode. If the `RESCHED_KPREEMPT` flag is not specified, then `RESCHED_UPREEMPT` is specified instead.

If the `RESCHED_IDLE` flag is specified in flags, the last thread observed running on the CPU was the idle LWP.

If `RESCHED_REMOTE` flag is specified in flags, the request is not for the current CPU. The opposite also holds true. If ci is not the current processor, `cpu_need_resched`() typically issues an inter processor call to the processor to make it notice the need of a context switch as soon as possible.

`cpu_need_resched`() is always called with kernel preemption disabled.

Typically, the `cpu_need_resched`() function will perform the following operations:

- Set a per-processor flag which is checked by userret(9) when returning to user-mode execution.
- Post an asynchronous software trap (AST).
- Send an inter processor interrupt to wake up cpu_idle(9) and/or force an user process across the user/kernel boundary, thus making a trip through `userret`().

# SEE ALSO

sched_4bsd(9), userret(9)

November 17, 2019 | NetBSD 10.1