From 3c9e0969840d47a812f5e65fa43f694f2e7f3ff3 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Thu, 17 Jul 2025 17:44:05 -0400 Subject: kernel: sched: Add support for CPU pinning This commit introduces support for pinning processes to specific cores which can be useful for things like, keeping core-specific workthreads running on their respective processors as well as mitigating very specific cases of false-sharing and performance degradation caused by a thread jumping between cores which requires cache-line entries to be thrashed around between them. Threads pinned to a specific core will always see their cached data in the same L1, L2, etc. Signed-off-by: Ian Moffett --- sys/include/arch/amd64/cpu.h | 1 + sys/include/sys/proc.h | 13 +++++++++++++ 2 files changed, 14 insertions(+) (limited to 'sys/include') diff --git a/sys/include/arch/amd64/cpu.h b/sys/include/arch/amd64/cpu.h index a047cef..046b621 100644 --- a/sys/include/arch/amd64/cpu.h +++ b/sys/include/arch/amd64/cpu.h @@ -46,6 +46,7 @@ struct cpu_info { uint32_t apicid; uint32_t feat; + uint8_t id; /* MI Logical ID */ uint8_t model : 4; /* CPU model number */ uint8_t family : 4; /* CPU family ID */ uint8_t has_x2apic : 1; diff --git a/sys/include/sys/proc.h b/sys/include/sys/proc.h index 972d3c4..9cc9238 100644 --- a/sys/include/sys/proc.h +++ b/sys/include/sys/proc.h @@ -74,6 +74,14 @@ struct __packed coredump { uint32_t checksum; }; +/* + * Sometimes we may need to pin a process + * to a specific CPU. This type represents + * the (machine independent) logical processor + * ID for a process to be pinned to. + */ +typedef int16_t affinity_t; + struct proc { pid_t pid; struct exec_prog exec; @@ -86,6 +94,7 @@ struct proc { struct trapframe tf; struct pcb pcb; struct proc *parent; + affinity_t affinity; void *data; size_t priority; int exit_status; @@ -107,10 +116,14 @@ struct proc { #define PROC_WAITED BIT(4) /* Being waited on by parent */ #define PROC_KTD BIT(5) /* Kernel thread */ #define PROC_SLEEP BIT(6) /* Thread execution paused */ +#define PROC_PINNED BIT(7) /* Pinned to CPU */ struct proc *this_td(void); struct proc *get_child(struct proc *cur, pid_t pid); +void proc_pin(struct proc *td, affinity_t cpu); +void proc_unpin(struct proc *td); + void proc_reap(struct proc *td); void proc_coredump(struct proc *td, uintptr_t fault_addr); -- cgit v1.2.3