gvisor/pkg/sync
Adin Scannell 9afac716b1 Support synchronous AssertAndFetch for sleep package.
Some synchronization patterns require the ability to simultaneously wake and
sleep a goroutine. For the sleep package, this is the case when a waker must be
asserted when a subsequent fetch is imminent.

Currently, this operation results in significant P churn in the runtime, which
ping-pongs execution between multiple system threads and cores and consumes a
significant amount of host CPU (and because of the context switches, this can
be significant worse with mitigations for side channel vulnerabilities).

The solution is to introduce a dedicated mechanism for a synchronous switch
which does not wake another runtime P (see golang/go#32113). This can be used
by the `AssertAndFetch` API in the sleep package.

The benchmark results for this package are very similiar to raw channel
operations for all cases, with the exception of operations that do not wait.
The primary advantage is more precise control over scheduling. This will be
used in a subsequent change.

```
BenchmarkGoAssertNonWaiting
BenchmarkGoAssertNonWaiting-8                   261364384                4.976 ns/op
BenchmarkGoSingleSelect
BenchmarkGoSingleSelect-8                       20946358                57.77 ns/op
BenchmarkGoMultiSelect
BenchmarkGoMultiSelect-8                         6071697               197.0 ns/op
BenchmarkGoWaitOnSingleSelect
BenchmarkGoWaitOnSingleSelect-8                  4978051               235.4 ns/op
BenchmarkGoWaitOnMultiSelect
BenchmarkGoWaitOnMultiSelect-8                   2309224               520.2 ns/op

BenchmarkSleeperAssertNonWaiting
BenchmarkSleeperAssertNonWaiting-8              447325033                2.657 ns/op
BenchmarkSleeperSingleSelect
BenchmarkSleeperSingleSelect-8                  21488844                55.19 ns/op
BenchmarkSleeperMultiSelect
BenchmarkSleeperMultiSelect-8                   21851674                54.89 ns/op
BenchmarkSleeperWaitOnSingleSelect
BenchmarkSleeperWaitOnSingleSelect-8             2860327               416.4 ns/op
BenchmarkSleeperWaitOnSingleSelectSync
BenchmarkSleeperWaitOnSingleSelectSync-8         2741733               427.1 ns/op
BenchmarkSleeperWaitOnMultiSelect
BenchmarkSleeperWaitOnMultiSelect-8              2867484               418.1 ns/op
BenchmarkSleeperWaitOnMultiSelectSync
BenchmarkSleeperWaitOnMultiSelectSync-8          2789158               427.9 ns/op
```

PiperOrigin-RevId: 415581417
2021-12-10 12:25:25 -08:00
..
atomicptr kvm: trap mmap syscalls to map new regions to the guest 2021-09-22 14:39:36 -07:00
atomicptrmap
seqatomic Move sync generics to their own packages 2021-06-01 17:47:32 -07:00
BUILD Support synchronous AssertAndFetch for sleep package. 2021-12-10 12:25:25 -08:00
LICENSE
README.md
aliases.go
checklocks_off_unsafe.go
checklocks_on_unsafe.go
gate_test.go
gate_unsafe.go
goyield_go113_unsafe.go Add go:build directives as required by Go 1.17's gofmt. 2021-07-20 16:28:45 -07:00
goyield_unsafe.go
mutex_test.go
mutex_unsafe.go
nocopy.go
norace_unsafe.go Add go:build directives as required by Go 1.17's gofmt. 2021-07-20 16:28:45 -07:00
race_amd64.s Add go:build directives as required by Go 1.17's gofmt. 2021-07-20 16:28:45 -07:00
race_arm64.s Add go:build directives as required by Go 1.17's gofmt. 2021-07-20 16:28:45 -07:00
race_unsafe.go
runtime_amd64.go Support synchronous AssertAndFetch for sleep package. 2021-12-10 12:25:25 -08:00
runtime_amd64.s Support synchronous AssertAndFetch for sleep package. 2021-12-10 12:25:25 -08:00
runtime_other.go Support synchronous AssertAndFetch for sleep package. 2021-12-10 12:25:25 -08:00
runtime_unsafe.go Support synchronous AssertAndFetch for sleep package. 2021-12-10 12:25:25 -08:00
rwmutex_test.go
rwmutex_unsafe.go Mix checklocks and atomic analyzers. 2021-07-01 15:07:56 -07:00
seqcount.go
seqcount_test.go Allow use of SeqAtomic with pointer-containing types. 2020-12-04 19:07:17 -08:00
sync.go

README.md

sync

This package provides additional synchronization primitives not provided by the Go stdlib 'sync' package. It is partially derived from the upstream 'sync' package from go1.10.