freeSpan currently takes a mysterious "acct int32" argument. This is
really just a boolean and actually just needs to match the "large"
argument to alloc in order to balance out accounting.
To make this clearer, replace acct with a "large bool" argument that
must match the call to mheap.alloc.
Change-Id: Ibc81faefdf9f0583114e1953fcfb362e9c3c76de
Reviewed-on: https://go-review.googlesource.com/c/138655
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
 
        c.nonempty.remove(s)
        unlock(&c.lock)
-       mheap_.freeSpan(s, 0)
+       mheap_.freeSpan(s, false)
        return true
 }
 
 
                        s.limit = 0 // prevent mlookup from finding this span
                        sysFault(unsafe.Pointer(s.base()), size)
                } else {
-                       mheap_.freeSpan(s, 1)
+                       mheap_.freeSpan(s, true)
                }
                c.local_nlargefree++
                c.local_largefree += size
 
 }
 
 // Free the span back into the heap.
-func (h *mheap) freeSpan(s *mspan, acct int32) {
+//
+// large must match the value of large passed to mheap.alloc. This is
+// used for accounting.
+func (h *mheap) freeSpan(s *mspan, large bool) {
        systemstack(func() {
                mp := getg().m
                lock(&h.lock)
                        bytes := s.npages << _PageShift
                        msanfree(base, bytes)
                }
-               if acct != 0 {
+               if large {
+                       // Match accounting done in mheap.alloc.
                        memstats.heap_objects--
                }
                if gcBlackenEnabled != 0 {