[kernel] Add an IPI to tell a CPU to run the scheduler
When waking another thread, if that thread has a more urgent priority than the current thread on the same CPU, send that CPU an IPI to tell it to run its scheduler. Related changes in this commit: - Addition of the ipiSchedule isr (vector 0xe4) and its handler in isr_handler(). - Change the APIC's send_ipi* functions to take an isr enum and not an int for their vector parameter - Thread TCBs now contain a pointer to their current CPU's cpu_data structure - Add the maybe_schedule() call to the scheduler, which sends the schedule IPI to the given thread's CPU only when that CPU is running a less-urgent thread. - Move the locking of a run queue lock earlier in schedule() instead of taking the lock in steal_work() and again in schedule().
This commit is contained in:
@@ -5,6 +5,8 @@
|
||||
#include <stdint.h>
|
||||
#include <util/enum_bitfields.h>
|
||||
|
||||
#include "interrupts.h"
|
||||
|
||||
enum class isr : uint8_t;
|
||||
|
||||
/// Base class for other APIC types
|
||||
@@ -51,13 +53,13 @@ public:
|
||||
/// \arg mode The sending mode
|
||||
/// \arg vector The interrupt vector
|
||||
/// \arg dest The APIC ID of the destination
|
||||
void send_ipi(ipi mode, uint8_t vector, uint8_t dest);
|
||||
void send_ipi(ipi mode, isr vector, uint8_t dest);
|
||||
|
||||
/// Send an inter-processor broadcast interrupt to all other CPUs
|
||||
/// \arg mode The sending mode
|
||||
/// \arg self If true, include this CPU in the broadcast
|
||||
/// \arg vector The interrupt vector
|
||||
void send_ipi_broadcast(ipi mode, bool self, uint8_t vector);
|
||||
void send_ipi_broadcast(ipi mode, bool self, isr vector);
|
||||
|
||||
/// Wait for an IPI to finish sending. This is done automatically
|
||||
/// before sending another IPI with send_ipi().
|
||||
|
||||
Reference in New Issue
Block a user