[PATCH v2 00/14] Uthreads
Jerome Forissier
jerome.forissier at linaro.org
Tue Feb 25 17:34:26 CET 2025
This series introduces threads and uses them to improve the performance
of the USB bus scanning code and to implement background jobs in the
shell via two new commands: 'spawn' and 'wait'.
The threading framework is called 'uthread' and is inspired from the
barebox threads [1]. setjmp() and longjmp() are used to save and
restore contexts, as well as a non-standard extension called initjmp().
This new function is added in several patches, one for each
architecture that supports HAVE_SETJMP. A new symbol is defined:
HAVE_INITJMP. Two tests, one for initjmp() and one for the uthread
scheduling, are added to the lib suite. NOTE: the SANDBOX version of
initjmp() appears to have problems and needs to be worked on.
[1] https://github.com/barebox/barebox/blob/master/common/bthread.c
After introducing threads and making schedule() and udelay() a thread
re-scheduling point, the USB stack initialization is modified to benefit
from concurrency when UTHREAD is enabled, where uthreads are used in
usb_init() to initialize and scan multiple busses at the same time.
The code was tested on arm64 and arm QEMU with 4 simulated XHCI buses
and some devices. On this platform the USB scan takes 2.2 s instead of
5.6 s. Tested on i.MX93 EVK with two USB hubs, one ethernet adapter and
one webcam on each, "usb start" takes 2.4 s instead of 4.6 s.
Finally, the spawn and wait commands are introduced, allowing the use of
threads from the shell. Tested on the i.MX93 EVK with a spinning HDD
connected to USB1 and the network connected to ENET1. The USB plus DHCP
init sequence "spawn usb start; spawn dhcp; wait" takes 4.5 seconds
instead of 8 seconds for "usb start; dhcp".
Changes in v2:
- Rewrite the cover letter, do not mention the older coroutines series
- Rebased onto next
- UTHREAD_STACK_SIZE is set to 32768 (32 KiB) instead of 32178
- Remove uthread_free_all() and let threads be freed as they terminate
by uthread_schedule()
- Add function descriptions
- Add documentation (doc/develop/uthread.rst)
- Explain initjmp() in the description of "arch: introduce symbol
HAVE_INITJMP".
- Add thread groups (uthread_grp_new_id() and uthread_grp_done())
- Add the spawn and wait commands
Jerome Forissier (14):
arch: introduce symbol HAVE_INITJMP
arm: add initjmp()
riscv: add initjmp()
sandbox: add initjmp()
test: lib: add initjmp() test
uthread: add cooperative multi-tasking interface
cyclic: invoke uthread_schedule() from schedule()
lib: time: hook uthread_schedule() into udelay()
doc: develop: add documentation for uthreads
test: lib: add uthread test
dm: usb: move bus initialization into new static function
usb_init_bus()
dm: usb: initialize and scan multiple buses simultaneously with
uthread
cmd: add spawn and wait commands
test: dm: add test for spawn and wait commands
arch/Kconfig | 8 ++
arch/arm/include/asm/setjmp.h | 1 +
arch/arm/lib/setjmp.S | 11 ++
arch/arm/lib/setjmp_aarch64.S | 9 ++
arch/riscv/include/asm/setjmp.h | 1 +
arch/riscv/lib/setjmp.S | 10 ++
arch/sandbox/cpu/Makefile | 11 +-
arch/sandbox/cpu/initjmp.c | 172 +++++++++++++++++++++++++++++
arch/sandbox/include/asm/setjmp.h | 5 +
cmd/Kconfig | 17 +++
cmd/Makefile | 2 +
cmd/spawn.c | 176 +++++++++++++++++++++++++++++
common/console.c | 2 +
common/cyclic.c | 3 +
doc/develop/index.rst | 1 +
doc/develop/uthread.rst | 136 +++++++++++++++++++++++
drivers/usb/host/usb-uclass.c | 168 +++++++++++++++++++---------
include/u-boot/schedule.h | 3 +
include/uthread.h | 44 ++++++++
lib/Kconfig | 21 ++++
lib/Makefile | 2 +
lib/time.c | 10 +-
lib/uthread.c | 178 ++++++++++++++++++++++++++++++
test/boot/bootdev.c | 14 +--
test/boot/bootflow.c | 2 +-
test/cmd/Makefile | 1 +
test/cmd/spawn.c | 33 ++++++
test/lib/Makefile | 2 +
test/lib/initjmp.c | 72 ++++++++++++
test/lib/uthread.c | 68 ++++++++++++
30 files changed, 1122 insertions(+), 61 deletions(-)
create mode 100644 arch/sandbox/cpu/initjmp.c
create mode 100644 cmd/spawn.c
create mode 100644 doc/develop/uthread.rst
create mode 100644 include/uthread.h
create mode 100644 lib/uthread.c
create mode 100644 test/cmd/spawn.c
create mode 100644 test/lib/initjmp.c
create mode 100644 test/lib/uthread.c
--
2.43.0
More information about the U-Boot
mailing list