runtime: look for idle p to run current goroutine when switching to GC or traceReader
runtime: look for idle p to run current goroutine when switching to GC or traceReader

This repairs one of the several causes of pauses uncovered
by a GC microbenchmark.  A pause can occur when a goroutine's
quantum expires "at the same time" a GC is needed.  The
current M switches to running a GC worker, which means that
the amount of available work has expanded by one.  The GC
worker, however, does not call ready, and does not itself
conditionally wake a P (a "normal" thread would do this).

This is also true if M switches to a traceReader.

This is problem 4 in this list:
https://github.com/golang/go/issues/27732#issuecomment-423301252

Updates #27732.

Change-Id: I6905365cac8504cde6faab2420f4421536551f0b
Reviewed-on: https://go-review.googlesource.com/c/go/+/146817
Run-TryBot: David Chase <ae171625adc8645b8b79b7e405a6da5aba5341e0@google.com>
TryBot-Result: Gobot Gobot <66cb808b70d30c07676d5e946fee83fd561249e5@golang.org>
Reviewed-by: Austin Clements <7ea35d812706d9213868749011af1ed4fa2f6aa0@google.com>

nawawi/go,josharian/go,akutz/go,cloudflare/go,CAFxX/go,CAFxX/go,akutz/go,CAFxX/go,CAFxX/go,cloudflare/go,akutz/go,josharian/go,golang/go,josharian/go,nawawi/go,akutz/go,golang/go,akutz/go,nawawi/go,golang/go,josharian/go,CAFxX/go,josharian/go,nawawi/go,akutz/go,CAFxX/go,golang/go,nawawi/go,josharian/go,CAFxX/go,golang/go,cloudflare/go,josharian/go,nawawi/go,golang/go,cloudflare/go,cloudflare/go,golang/go,CAFxX/go,cloudflare/go,golang/go,cloudflare/go,cloudflare/go,akutz/go,josharian/go,akutz/go,nawawi/go,nawawi/go