Skip to content
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

Klibs (x86_64): add User-Managed Concurrency Groups #1996

Merged
merged 4 commits into from
Feb 16, 2024

Conversation

francescolavra
Copy link
Member

This changeset adds a new klib that implements UMCG (the Linux kernel feature proposed by Google in order to support user-mode threading).
The implementation in Nanos is compatible with the Linux kernel code at https://www.spinics.net/lists/kernel/msg4740112.html.

A new runtime test has been added to exercise this feature. Beside various test cases, this program can be run in demo mode (with the -d command line option), which is inspired by the code at https://lore.kernel.org/lkml/20220120155517.066795336@infradead.org/.
In addition, it contains a set of performance tests with which the performance of thread switching with UMCG can be evaluated and compared with traditional threading implementations:

  • -u option: UMCG-based performance test
  • -f option: futex-based performance test
  • -c option: condition variable-based performance test

The performance test creates a worker thread and continuously switches between the main thread and the worker thread, measuring how many main->worker->main thread switching cycles can be executed per unit of time. The test by default runs for 10 seconds, but the duration can be modified with the -t command line option.
Performance tests run in a KVM instance with a single vCPU showed the following figures:

  • UMCG: 209995 cycles/sec
  • futex: 154419 cycles/sec
  • condition variable: 100965 cycles/sec

The first 2 commits refactor existing code in order to allow defining arch-specific klibs and runtime tests, and to remove code duplication in the test suite.

This change moves the initialization of global Make variables from
rules.mk to a new vars.mk file. This allows specifying that a klib
or a test should be built or run only in certain environments or
configurations (for example, only for a given architecture).
The RUNTIME_TESTS target in the main Makefile has been modified by
adding the missing symlink program and making the vsyscall program
conditional to the x86_64 architecture.
The existing code in thread_wakeup() assumes that this function is
only called from the syscall context associated to the thread to be
woken up.
This change allows this function to be called from any context;
this will allow implementing kernel features that can be used for
user-mode threading.
This new header file contains various utilities for running test
cases. Duplicated code across the test suite has been removed in
favor of using the code in this header file.
This changeset adds a new klib that implements UMCG (the Linux
kernel feature proposed by Google in order to support user-mode
threading).
The implementation in Nanos is compatible with the Linux kernel
code at https://www.spinics.net/lists/kernel/msg4740112.html.

A new runtime test has been added to exercise this feature. Beside
various test cases, this program can be run in demo mode (with the
`-d` command line option), which is inspired by the code at
https://lore.kernel.org/lkml/20220120155517.066795336@infradead.org/.
In addition, it contains a set of performance tests with which the
performance of thread switching with UMCG can be evaluated and
compared with traditional threading implementations:
- '-u' option: UMCG-based performance test
- '-f' option: futex-based performance test
- '-c' option: condition variable-based performance test
The performance test creates a worker thread and continuously
switches between the main thread and the worker thread, measuring
how many main->worker->main thread switching cycles can be
executed per unit of time. The test by default runs for 10 seconds,
but the duration can be modified with the `-t` command line option.
Performance tests run in a KVM instance with a single vCPU showed
the following figures:
- UMCG: 209995 cycles/sec
- futex: 154419 cycles/sec
- condition variable: 100965 cycles/sec

In the generic Unix code, a new blockq_init() function has been
added in order to be able to use blockq structs embedded in other
structs.
@francescolavra francescolavra merged commit 11ce06b into master Feb 16, 2024
5 checks passed
@francescolavra francescolavra deleted the feature/umcg branch February 16, 2024 20:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant