mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: add packed bitmap summaries
This change adds the concept of summaries and of summarizing a set of pallocBits, a core concept in the new page allocator. These summaries are really just three integers packed into a uint64. This change also adds tests and a benchmark for generating these summaries. Updates #35112. Change-Id: I69686316086c820c792b7a54235859c2105e5fee Reviewed-on: https://go-review.googlesource.com/c/go/+/190621 Run-TryBot: Michael Knyszek <mknyszek@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
b3a361337c
commit
cec01395c5
4 changed files with 293 additions and 0 deletions
|
|
@ -735,6 +735,14 @@ const (
|
|||
PallocChunkPages = pallocChunkPages
|
||||
)
|
||||
|
||||
// Expose pallocSum for testing.
|
||||
type PallocSum pallocSum
|
||||
|
||||
func PackPallocSum(start, max, end uint) PallocSum { return PallocSum(packPallocSum(start, max, end)) }
|
||||
func (m PallocSum) Start() uint { return pallocSum(m).start() }
|
||||
func (m PallocSum) Max() uint { return pallocSum(m).max() }
|
||||
func (m PallocSum) End() uint { return pallocSum(m).end() }
|
||||
|
||||
// Expose pallocBits for testing.
|
||||
type PallocBits pallocBits
|
||||
|
||||
|
|
@ -743,6 +751,33 @@ func (b *PallocBits) Find(npages uintptr, searchIdx uint) (uint, uint) {
|
|||
}
|
||||
func (b *PallocBits) AllocRange(i, n uint) { (*pallocBits)(b).allocRange(i, n) }
|
||||
func (b *PallocBits) Free(i, n uint) { (*pallocBits)(b).free(i, n) }
|
||||
func (b *PallocBits) Summarize() PallocSum { return PallocSum((*pallocBits)(b).summarize()) }
|
||||
|
||||
// SummarizeSlow is a slow but more obviously correct implementation
|
||||
// of (*pallocBits).summarize. Used for testing.
|
||||
func SummarizeSlow(b *PallocBits) PallocSum {
|
||||
var start, max, end uint
|
||||
|
||||
const N = uint(len(b)) * 64
|
||||
for start < N && (*pageBits)(b).get(start) == 0 {
|
||||
start++
|
||||
}
|
||||
for end < N && (*pageBits)(b).get(N-end-1) == 0 {
|
||||
end++
|
||||
}
|
||||
run := uint(0)
|
||||
for i := uint(0); i < N; i++ {
|
||||
if (*pageBits)(b).get(i) == 0 {
|
||||
run++
|
||||
} else {
|
||||
run = 0
|
||||
}
|
||||
if run > max {
|
||||
max = run
|
||||
}
|
||||
}
|
||||
return PackPallocSum(start, max, end)
|
||||
}
|
||||
|
||||
// Expose non-trivial helpers for testing.
|
||||
func FindBitRange64(c uint64, n uint) uint { return findBitRange64(c, n) }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue