  
  	if debugChan {
  		print("makechan: chan=", c, "; elemsize=", elem.size, "; elemalg=", elem.alg, "; dataqsiz=", size, "\n")
-@@ -168,6 +177,11 @@ func chansend(t *chantype, c *hchan, ep unsafe.Pointer, block bool, callerpc uin
+@@ -168,6 +177,8 @@ func chansend(t *chantype, c *hchan, ep unsafe.Pointer, block bool, callerpc uin
  	}
  
  	if sg := c.recvq.dequeue(); sg != nil {
 +		sg.cid = c.id
-+		evID = atomic.Xadd64(&evID, 1)
-+		sg.eventid = atomic.Load64(&evID)
-+		traceGoSend(sg.eventid, c.id, elem2int(ep))
 +
  		// Found a waiting receiver. We pass the value we want to send
  		// directly to the receiver, bypassing the channel buffer (if any).
  		send(c, sg, ep, func() { unlock(&c.lock) })
-@@ -209,6 +223,12 @@ func chansend(t *chantype, c *hchan, ep unsafe.Pointer, block bool, callerpc uin
+@@ -181,6 +192,10 @@ func chansend(t *chantype, c *hchan, ep unsafe.Pointer, block bool, callerpc uin
+ 			raceacquire(qp)
+ 			racerelease(qp)
+ 		}
++
++		evID = atomic.Xadd64(&evID, 1)
++		traceGoSend(evID, c.id, elem2int(ep))
++
+ 		typedmemmove(c.elemtype, qp, ep)
+ 		c.sendx++
+ 		if c.sendx == c.dataqsiz {
+@@ -209,6 +224,12 @@ func chansend(t *chantype, c *hchan, ep unsafe.Pointer, block bool, callerpc uin
  	mysg.selectdone = nil
  	gp.waiting = mysg
  	gp.param = nil

 	// someone woke us up
 	if mysg != gp.waiting {
 		throw("G waiting list is corrupted")
@@ -687,3 +709,10 @@ func racesync(c *hchan, sg *sudog) {
 	racereleaseg(sg.g, chanbuf(c, 0))
 	raceacquire(chanbuf(c, 0))
 }

+	EvGoRecv:         {"GoRecv", true, []string{}},
 }
diff --git a/src/runtime/chan.go b/src/runtime/chan.go
index 5be18be..4966723 100644
--- a/src/runtime/chan.go
+++ b/src/runtime/chan.go
@@ -23,6 +23,7 @@ const (
