Commit b3579c09 authored by Austin Clements's avatar Austin Clements

[dev.garbage] runtime: revive sweep fast path

sweep used to skip mcental.freeSpan (and its locking) if it didn't
find any new free objects. We lost that optimization when the
freed-object counting changed in dad83f7 to count total free objects
instead of newly freed objects.

The previous commit brings back counting of newly freed objects, so we
can easily revive this optimization by checking that count (like we
used to) instead of the total free objects count.

Change-Id: I43658707a1c61674d0366124d5976b00d98741a9
Reviewed-on: https://go-review.googlesource.com/22596
Run-TryBot: Austin Clements <austin@google.com>
Reviewed-by: default avatarRick Hudson <rlh@golang.org>
parent d97625ae
...@@ -296,7 +296,7 @@ func (s *mspan) sweep(preserve bool) bool { ...@@ -296,7 +296,7 @@ func (s *mspan) sweep(preserve bool) bool {
// But we need to set it before we make the span available for allocation // But we need to set it before we make the span available for allocation
// (return it to heap or mcentral), because allocation code assumes that a // (return it to heap or mcentral), because allocation code assumes that a
// span is already swept if available for allocation. // span is already swept if available for allocation.
if freeToHeap || nfree == 0 { if freeToHeap || nfreed == 0 {
// The span must be in our exclusive ownership until we update sweepgen, // The span must be in our exclusive ownership until we update sweepgen,
// check for potential races. // check for potential races.
if s.state != mSpanInUse || s.sweepgen != sweepgen-1 { if s.state != mSpanInUse || s.sweepgen != sweepgen-1 {
...@@ -309,7 +309,7 @@ func (s *mspan) sweep(preserve bool) bool { ...@@ -309,7 +309,7 @@ func (s *mspan) sweep(preserve bool) bool {
atomic.Store(&s.sweepgen, sweepgen) atomic.Store(&s.sweepgen, sweepgen)
} }
if nfree > 0 && cl != 0 { if nfreed > 0 && cl != 0 {
c.local_nsmallfree[cl] += uintptr(nfreed) c.local_nsmallfree[cl] += uintptr(nfreed)
res = mheap_.central[cl].mcentral.freeSpan(s, preserve, wasempty) res = mheap_.central[cl].mcentral.freeSpan(s, preserve, wasempty)
// MCentral_FreeSpan updates sweepgen // MCentral_FreeSpan updates sweepgen
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment