-
Notifications
You must be signed in to change notification settings - Fork 350
schedule: add support for user-space LL scheduler #10508
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
The telemetry infra is calling privileged timer functions, so if the Low-Latency tasks are run in user-space, telemetry must be disabled. Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
The load tracking for Low-Latency tasks depends on low-overhead access to cycle counter (e.g. CCOUNT on xtensa), which is not currently available from user-space tasks. Add a dependency to ensure the LL stats can only be enabled if LL tasks are run in kernel mode. Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Add option to build SOF with support for running LL scheduler in user-space. This commit adds initial support in the scheduler and does not yet allow to run full SOF application using the new scheduler configuration, but has enough functionality to run scheduler level tests. No functional change to default build configuration where LL scheduler is run in kernel mode, or to platforms with no userspace support. Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Add a test case to run tasks with low-latency (LL) scheduler in user-space. The test does not yet use any audio pipeline functionality, but uses similar interfaces towards the SOF scheduler interface. Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
There are multiple style variants used in SOF for CMakeLists.txt, but this file now contains multiple variants in the same file. Fix this and align style to Zephyr style (2 space for indent, no tabs, no space before opening brackets). Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This PR adds initial support for running SOF Low-Latency (LL) scheduler tasks in Zephyr user-space, providing memory protection and isolation between audio code and kernel resources.
Changes:
- Adds user-space LL scheduler support with dedicated memory domains and heap management
- Replaces spinlocks with mutexes for user-space compatibility
- Introduces test case to validate LL task creation and execution in user-space mode
Reviewed changes
Copilot reviewed 11 out of 11 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| zephyr/test/userspace/test_ll_task.c | New test case validating user-space LL scheduler functionality with task lifecycle management |
| zephyr/test/userspace/README.md | Documentation update describing new LL scheduler test |
| zephyr/test/CMakeLists.txt | Build configuration to include LL task test when CONFIG_SOF_USERSPACE_LL is enabled |
| zephyr/Kconfig | New CONFIG_SOF_USERSPACE_LL option for enabling user-space LL pipelines |
| src/schedule/zephyr_ll.c | Core LL scheduler implementation modified to support user-space execution with dynamic memory allocation |
| src/schedule/zephyr_domain.c | Domain thread management updated for user-space with mutex-based synchronization |
| src/schedule/Kconfig | Statistics logging disabled for user-space LL scheduler |
| src/init/init.c | Initialization hook for user-space LL resources |
| src/include/sof/schedule/ll_schedule_domain.h | Header updates exposing user-space LL APIs and mutex-based locking |
| src/include/sof/schedule/ll_schedule.h | API declarations for user-space LL heap and memory domain management |
| src/debug/telemetry/Kconfig | Telemetry disabled when user-space LL is enabled |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| - Test Zephyr DAI interface, together with SOF DMA | ||
| wrapper from a user thread. Mimics the call flows done in | ||
| sof/src/audio/dai-zephyr.c. Use cavstool.py as host runner. | ||
| - test_ll_test.c |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Corrected spelling of 'test_ll_test.c' to 'test_ll_task.c'.
| - test_ll_test.c | |
| - test_ll_task.c |
| sch->lock = k_object_alloc(K_OBJ_MUTEX); | ||
| if (!sch->lock) { | ||
| tr_err(&ll_tr, "mutex allocation failed"); | ||
| sof_heap_free(sch->heap, sch); |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Using sch->heap after it should be initialized but may not be. The heap field is only set in the CONFIG_SOF_USERSPACE_LL branch, but this error path is also within that branch before heap assignment at line 611. Use the local heap variable instead.
| sof_heap_free(sch->heap, sch); | |
| sof_heap_free(heap, sch); |
| ll_sch_domain_set_pdata(domain, zephyr_domain); | ||
|
|
||
| struct zephyr_domain_thread *dt = zephyr_domain->domain_thread + cpu_get_id(); |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Variable declaration should be at the beginning of the function or block. Move this declaration to the top of the function for consistency with C89/C90 style if required by the project, or to improve readability.
| ll_sch_domain_set_pdata(domain, zephyr_domain); | |
| struct zephyr_domain_thread *dt = zephyr_domain->domain_thread + cpu_get_id(); | |
| struct zephyr_domain_thread *dt; | |
| ll_sch_domain_set_pdata(domain, zephyr_domain); | |
| dt = zephyr_domain->domain_thread + cpu_get_id(); |
| #define timer_domain_init(timer, clk) zephyr_domain_init(clk) | ||
| k_tid_t zephyr_domain_thread_tid(struct ll_schedule_domain *domain); | ||
| #endif |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Declaration of zephyr_domain_thread_tid is placed outside the CONFIG_SOF_USERSPACE_LL guard (lines 103-109) where it logically belongs based on its implementation. This function is only implemented when CONFIG_SOF_USERSPACE_LL is enabled, so its declaration should be within the same conditional block to prevent link errors.
| #define timer_domain_init(timer, clk) zephyr_domain_init(clk) | |
| k_tid_t zephyr_domain_thread_tid(struct ll_schedule_domain *domain); | |
| #endif | |
| #define timer_domain_init(timer, clk) zephyr_domain_init(clk) | |
| #if CONFIG_SOF_USERSPACE_LL | |
| k_tid_t zephyr_domain_thread_tid(struct ll_schedule_domain *domain); | |
| #endif | |
| #endif |
|
Example test run (on Intel PTL): |
Series that starts building up support for running SOF LL tasks in user-space (on platforms supporting Zephyr user-space). We already have support for DP tasks, so with both LL and DP supported, in theory all audio can be moved to user-space and run in separate memory space. This will isolate audio code from direct hardware access, protect kernel memory and device driver state.
This PR contains initial support for LL scheduler and adds a separate test case to mimic usage of SOF audio pipeline, without yet bringing in any audio dependencies.