diff options
author | Tom Rini <trini@konsulko.com> | 2025-04-23 13:21:39 -0600 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2025-04-23 13:21:39 -0600 |
commit | 233fda6af674736dbc6ff37a9ef003b9fa4b8074 (patch) | |
tree | 2765c8660d4134c3b7fceff325410b4846f6761a /doc/api | |
parent | 6e325df4891cb9be954f1e62f16cd3096b267bdb (diff) | |
parent | 1717f46a1da7f15e749405da2178944c3a76fac0 (diff) |
Merge patch series "Uthreads"
Jerome Forissier <jerome.forissier@linaro.org> says:
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 [2]. 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.
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".
[1] https://patchwork.ozlabs.org/project/uboot/list/?series=446674
[2] https://github.com/barebox/barebox/blob/master/common/bthread.c
Link: https://lore.kernel.org/r/20250418141114.2056981-1-jerome.forissier@linaro.org
Diffstat (limited to 'doc/api')
-rw-r--r-- | doc/api/index.rst | 2 | ||||
-rw-r--r-- | doc/api/setjmp.rst | 20 | ||||
-rw-r--r-- | doc/api/uthread.rst | 19 |
3 files changed, 41 insertions, 0 deletions
diff --git a/doc/api/index.rst b/doc/api/index.rst index a108718ea99..506843ed74a 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -25,6 +25,8 @@ U-Boot API documentation rng sandbox serial + setjmp sysreset timer unicode + uthread diff --git a/doc/api/setjmp.rst b/doc/api/setjmp.rst new file mode 100644 index 00000000000..c30e51c2b55 --- /dev/null +++ b/doc/api/setjmp.rst @@ -0,0 +1,20 @@ +.. SPDX-License-Identifier: GPL-2.0-or-later + +Long jump API +============= + +.. kernel-doc:: include/setjmp.h + :doc: Overview + +.. kernel-doc:: include/setjmp.h + :internal: + +Example +------- + +Here is an example showing how to use the a long jump functions and +initjmp() in particular: + +.. literalinclude:: ../../test/lib/initjmp.c + :language: c + :linenos: diff --git a/doc/api/uthread.rst b/doc/api/uthread.rst new file mode 100644 index 00000000000..8b25cc1ff80 --- /dev/null +++ b/doc/api/uthread.rst @@ -0,0 +1,19 @@ +.. SPDX-License-Identifier: GPL-2.0-or-later + +Uthread API +=========== + +.. kernel-doc:: include/uthread.h + :doc: Overview + +.. kernel-doc:: include/uthread.h + :internal: + +Example +------- + +Here is an example of how to use this API: + +.. literalinclude:: ../../test/lib/uthread.c + :language: c + :linenos: |