| From bc7ced87a4283a64e5565e395974fe3e669e4a6a Mon Sep 17 00:00:00 2001 |
| From: Peter Oskolkov <posk@google.com> |
| Date: Wed, 22 Jul 2020 16:45:36 -0700 |
| Subject: [PATCH] FROMLIST: futex: introduce FUTEX_SWAP operation |
| |
| As Paul Turner presented at LPC in 2013 ... |
| - pdf: http://pdxplumbers.osuosl.org/2013/ocw//system/presentations/1653/original/LPC%20-%20User%20Threading.pdf |
| - video: https://www.youtube.com/watch?v=KXuZi9aeGTw |
| |
| ... Google has developed an M:N userspace threading subsystem backed |
| by Google-private SwitchTo Linux Kernel API (page 17 in the pdf referenced |
| above). This subsystem provides latency-sensitive services at Google with |
| fine-grained user-space control/scheduling over what is running when, |
| and this subsystem is used widely internally (called schedulers or fibers). |
| |
| This patchset is the first step to open-source this work. As explained |
| in the linked pdf and video, SwitchTo API has three core operations: wait, |
| resume, and swap (=switch). So this patchset adds a FUTEX_SWAP operation |
| that, in addition to FUTEX_WAIT and FUTEX_WAKE, will provide a foundation |
| on top of which user-space threading libraries can be built. |
| |
| Another common use case for FUTEX_SWAP is message passing a-la RPC |
| between tasks: task/thread T1 prepares a message, |
| wakes T2 to work on it, and waits for the results; when T2 is done, it |
| wakes T1 and waits for more work to arrive. Currently the simplest |
| way to implement this is |
| |
| a. T1: futex-wake T2, futex-wait |
| b. T2: wakes, does what it has been woken to do |
| c. T2: futex-wake T1, futex-wait |
| |
| With FUTEX_SWAP, steps a and c above can be reduced to one futex operation |
| that runs 5-10 times faster. |
| |
| Patches in this patchset: |
| |
| Patch 1: (this patch) introduce FUTEX_SWAP futex operation that, |
| internally, does wake + wait. The purpose of this patch is |
| to work out the API. |
| Patch 2: a first rough attempt to make FUTEX_SWAP faster than |
| what wake + wait can do. |
| Patch 3: a selftest that can also be used to benchmark FUTEX_SWAP vs |
| FUTEX_WAKE + FUTEX_WAIT. |
| |
| Tested: see patch 3 in this patchset. |
| |
| Signed-off-by: Peter Oskolkov <posk@google.com> |
| (am from https://lore.kernel.org/patchwork/patch/1277905/) |
| (also found at https://lore.kernel.org/r/20200722234538.166697-2-posk@posk.io) |
| |
| BUG=b:170967073 |
| TEST=eve-kernelnext and manually verification with selftests |
| |
| Change-Id: I0f693816689477a5f7252ff361df4dd96ef4af88 |
| Signed-off-by: Guenter Roeck <groeck@chromium.org> |
| --- |
| include/uapi/linux/futex.h | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| diff --git a/include/uapi/linux/futex.h b/include/uapi/linux/futex.h |
| --- a/include/uapi/linux/futex.h |
| +++ b/include/uapi/linux/futex.h |
| @@ -22,6 +22,7 @@ |
| #define FUTEX_WAIT_REQUEUE_PI 11 |
| #define FUTEX_CMP_REQUEUE_PI 12 |
| #define FUTEX_LOCK_PI2 13 |
| +#define FUTEX_SWAP 14 |
| |
| #define FUTEX_PRIVATE_FLAG 128 |
| #define FUTEX_CLOCK_REALTIME 256 |
| @@ -42,6 +43,7 @@ |
| FUTEX_PRIVATE_FLAG) |
| #define FUTEX_CMP_REQUEUE_PI_PRIVATE (FUTEX_CMP_REQUEUE_PI | \ |
| FUTEX_PRIVATE_FLAG) |
| +#define FUTEX_SWAP_PRIVATE (FUTEX_SWAP | FUTEX_PRIVATE_FLAG) |
| |
| /* |
| * Flags to specify the bit length of the futex word for futex2 syscalls. |
| -- |
| 2.34.0.rc2.393.gf8c9666880-goog |
| |