From b4eb08ffd60857fdceb03f0c11f8d52baeb36085 Mon Sep 17 00:00:00 2001 From: pangzhen1 Date: Thu, 12 Feb 2026 16:24:39 +0800 Subject: [PATCH] sched/wqueue: Align hp_work_stack/lp_work_stack Ensure each stack is properly aligned by rounding up the stack size. This is critical when CONFIG_SCHED_HPNTHREADS > 1 or CONFIG_SCHED_LPNTHREADS > 1 to ensure all thread stacks start at properly aligned addresses. Without proper alignment, subsequent threads' stacks may start at misaligned addresses, which can cause: - Hard faults on architectures with strict alignment requirements - Performance degradation due to unaligned memory access - TLS corruption when CONFIG_TLS_ALIGNED is enabled Signed-off-by: pangzhen1 --- sched/wqueue/kwork_thread.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/sched/wqueue/kwork_thread.c b/sched/wqueue/kwork_thread.c index 7461ccdc8d75e..fd12594136f13 100644 --- a/sched/wqueue/kwork_thread.c +++ b/sched/wqueue/kwork_thread.c @@ -559,14 +559,21 @@ int work_start_highpri(void) sinfo("Starting high-priority kernel worker thread(s)\n"); #ifdef SCHED_HPWORKSTACKSECTION - static uint8_t hp_work_stack[CONFIG_SCHED_HPNTHREADS] - [CONFIG_SCHED_HPWORKSTACKSIZE] + /* Ensure each stack is properly aligned by rounding up the stack size. + * This is critical when CONFIG_SCHED_HPNTHREADS > 1 to ensure all + * thread stacks start at properly aligned addresses. + */ + +#define HP_WORK_STACK_SIZE STACK_ALIGN_UP(CONFIG_SCHED_HPWORKSTACKSIZE) + + static aligned_data(STACK_ALIGNMENT) uint8_t + hp_work_stack[CONFIG_SCHED_HPNTHREADS][HP_WORK_STACK_SIZE] locate_data(CONFIG_SCHED_HPWORKSTACKSECTION); return work_thread_create(HPWORKNAME, CONFIG_SCHED_HPWORKPRIORITY, hp_work_stack, - CONFIG_SCHED_HPWORKSTACKSIZE, + HP_WORK_STACK_SIZE, (FAR struct kwork_wqueue_s *)&g_hpwork); #else return work_thread_create(HPWORKNAME, CONFIG_SCHED_HPWORKPRIORITY, NULL, @@ -599,14 +606,21 @@ int work_start_lowpri(void) sinfo("Starting low-priority kernel worker thread(s)\n"); #ifdef SCHED_LPWORKSTACKSECTION - static uint8_t lp_work_stack[CONFIG_SCHED_LPNTHREADS] - [CONFIG_SCHED_LPWORKSTACKSIZE] + /* Ensure each stack is properly aligned by rounding up the stack size. + * This is critical when CONFIG_SCHED_LPNTHREADS > 1 to ensure all + * thread stacks start at properly aligned addresses. + */ + +#define LP_WORK_STACK_SIZE STACK_ALIGN_UP(CONFIG_SCHED_LPWORKSTACKSIZE) + + static aligned_data(STACK_ALIGNMENT) uint8_t + lp_work_stack[CONFIG_SCHED_LPNTHREADS][LP_WORK_STACK_SIZE] locate_data(CONFIG_SCHED_LPWORKSTACKSECTION); return work_thread_create(LPWORKNAME, CONFIG_SCHED_LPWORKPRIORITY, lp_work_stack, - CONFIG_SCHED_LPWORKSTACKSIZE, + LP_WORK_STACK_SIZE, (FAR struct kwork_wqueue_s *)&g_lpwork); #else return work_thread_create(LPWORKNAME,