Revert "runtime: bound defer pools"

This reverts commit 805907115352801a54f987fc9079251b478cce3f.

Conflicts:
	src/runtime/proc1.go (resolved by hand)

Change-Id: Ic62e3e802f0007ff9012b37bc5fd41fcafc153d0
Reviewed-on: https://go-review.googlesource.com/3885
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
diff --git a/src/runtime/mgc0.go b/src/runtime/mgc0.go
index 91c3d58..bbd786d 100644
--- a/src/runtime/mgc0.go
+++ b/src/runtime/mgc0.go
@@ -25,21 +25,6 @@
 		poolcleanup()
 	}
 
-	// Clear central defer pools.
-	// Leave per-P pools alone, they have strictly bounded size.
-	lock(&sched.deferlock)
-	for i := range sched.deferpool {
-		// disconnect cached list before dropping it on the floor,
-		// so that a dangling ref to one entry does not pin all of them.
-		var d, dlink *_defer
-		for d = sched.deferpool[i]; d != nil; d = dlink {
-			dlink = d.link
-			d.link = nil
-		}
-		sched.deferpool[i] = nil
-	}
-	unlock(&sched.deferlock)
-
 	for _, p := range &allp {
 		if p == nil {
 			break
@@ -58,6 +43,18 @@
 			}
 			c.sudogcache = nil
 		}
+
+		// clear defer pools
+		for i := range p.deferpool {
+			// disconnect cached list before dropping it on the floor,
+			// so that a dangling ref to one entry does not pin all of them.
+			var d, dlink *_defer
+			for d = p.deferpool[i]; d != nil; d = dlink {
+				dlink = d.link
+				d.link = nil
+			}
+			p.deferpool[i] = nil
+		}
 	}
 }
 
diff --git a/src/runtime/panic.go b/src/runtime/panic.go
index c8cfd9f..e2a5c62 100644
--- a/src/runtime/panic.go
+++ b/src/runtime/panic.go
@@ -166,20 +166,9 @@
 	mp := acquirem()
 	if sc < uintptr(len(p{}.deferpool)) {
 		pp := mp.p
-		if len(pp.deferpool[sc]) == 0 {
-			lock(&sched.deferlock)
-			for len(pp.deferpool[sc]) < cap(pp.deferpool[sc])/2 && sched.deferpool[sc] != nil {
-				d := sched.deferpool[sc]
-				sched.deferpool[sc] = d.link
-				d.link = nil
-				pp.deferpool[sc] = append(pp.deferpool[sc], d)
-			}
-			unlock(&sched.deferlock)
-		}
-		if ln := len(pp.deferpool[sc]); ln > 0 {
-			d = pp.deferpool[sc][ln-1]
-			pp.deferpool[sc][ln-1] = nil
-			pp.deferpool[sc] = pp.deferpool[sc][:ln-1]
+		d = pp.deferpool[sc]
+		if d != nil {
+			pp.deferpool[sc] = d.link
 		}
 	}
 	if d == nil {
@@ -225,28 +214,9 @@
 	if sc < uintptr(len(p{}.deferpool)) {
 		mp := acquirem()
 		pp := mp.p
-		if len(pp.deferpool[sc]) == cap(pp.deferpool[sc]) {
-			// Transfer half of local cache to the central cache.
-			var first, last *_defer
-			for len(pp.deferpool[sc]) > cap(pp.deferpool[sc])/2 {
-				ln := len(pp.deferpool[sc])
-				d := pp.deferpool[sc][ln-1]
-				pp.deferpool[sc][ln-1] = nil
-				pp.deferpool[sc] = pp.deferpool[sc][:ln-1]
-				if first == nil {
-					first = d
-				} else {
-					last.link = d
-				}
-				last = d
-			}
-			lock(&sched.deferlock)
-			last.link = sched.deferpool[sc]
-			sched.deferpool[sc] = first
-			unlock(&sched.deferlock)
-		}
 		*d = _defer{}
-		pp.deferpool[sc] = append(pp.deferpool[sc], d)
+		d.link = pp.deferpool[sc]
+		pp.deferpool[sc] = d
 		releasem(mp)
 	}
 }
diff --git a/src/runtime/proc1.go b/src/runtime/proc1.go
index 2dc3a97..70addbf 100644
--- a/src/runtime/proc1.go
+++ b/src/runtime/proc1.go
@@ -2470,9 +2470,6 @@
 			pp = new(p)
 			pp.id = i
 			pp.status = _Pgcstop
-			for i := range pp.deferpool {
-				pp.deferpool[i] = pp.deferpoolbuf[i][:0]
-			}
 			atomicstorep(unsafe.Pointer(&allp[i]), unsafe.Pointer(pp))
 		}
 		if pp.mcache == nil {
@@ -2511,13 +2508,6 @@
 			}
 			sched.runqsize++
 		}
-		for i := range p.deferpool {
-			for j := range p.deferpoolbuf[i] {
-				p.deferpoolbuf[i][j] = nil
-			}
-			p.deferpool[i] = p.deferpoolbuf[i][:0]
-		}
-
 		freemcache(p.mcache)
 		p.mcache = nil
 		gfpurge(p)
diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go
index 52817c0..e38d11a 100644
--- a/src/runtime/runtime2.go
+++ b/src/runtime/runtime2.go
@@ -314,9 +314,7 @@
 	syscalltick uint32 // incremented on every system call
 	m           *m     // back-link to associated m (nil if idle)
 	mcache      *mcache
-
-	deferpool    [5][]*_defer // pool of available defer structs of different sizes (see panic.go)
-	deferpoolbuf [5][32]*_defer
+	deferpool   [5]*_defer // pool of available defer structs of different sizes (see panic.c)
 
 	// Cache of goroutine ids, amortizes accesses to runtime·sched.goidgen.
 	goidcache    uint64
@@ -367,9 +365,6 @@
 	gfree  *g
 	ngfree int32
 
-	deferlock mutex
-	deferpool [5]*_defer // central pool of available defer structs of different sizes
-
 	gcwaiting  uint32 // gc is waiting to run
 	stopwait   int32
 	stopnote   note