1. 14 Jan, 2015 6 commits
  2. 12 Dec, 2014 1 commit
  3. 11 Dec, 2014 2 commits
  4. 10 Dec, 2014 5 commits
  5. 09 Dec, 2014 3 commits
  6. 06 Dec, 2014 1 commit
  7. 05 Dec, 2014 5 commits
  8. 04 Dec, 2014 2 commits
  9. 03 Dec, 2014 1 commit
  10. 02 Dec, 2014 2 commits
  11. 01 Dec, 2014 2 commits
    • Russ Cox's avatar
      [release-branch.go1.4] runtime: fix hang in GC due to shrinkstack vs netpoll race · 28208eb8
      Russ Cox authored
      ««« CL 179680043 / 752cd9199639
      runtime: fix hang in GC due to shrinkstack vs netpoll race
      
      During garbage collection, after scanning a stack, we think about
      shrinking it to reclaim some memory. The shrinking code (called
      while the world is stopped) checked that the status was Gwaiting
      or Grunnable and then changed the state to Gcopystack, to essentially
      lock the stack so that no other GC thread is scanning it.
      The same locking happens for stack growth (and is more necessary there).
      
              oldstatus = runtime·readgstatus(gp);
              oldstatus &= ~Gscan;
              if(oldstatus == Gwaiting || oldstatus == Grunnable)
                      runtime·casgstatus(gp, oldstatus, Gcopystack); // oldstatus is Gwaiting or Grunnable
              else
                      runtime·throw("copystack: bad status, not Gwaiting or Grunnable");
      
      Unfortunately, "stop the world" doesn't stop everything. It stops all
      normal goroutine execution, but the network polling thread is still
      blocked in epoll and may wake up. If it does, and it chooses a goroutine
      to mark runnable, and that goroutine is the one whose stack is shrinking,
      then it can happen that between readgstatus and casgstatus, the status
      changes from Gwaiting to Grunnable.
      
      casgstatus assumes that if the status is not what is expected, it is a
      transient change (like from Gwaiting to Gscanwaiting and back, or like
      from Gwaiting to Gcopystack and back), and it loops until the status
      has been restored to the expected value. In this case, the status has
      changed semi-permanently from Gwaiting to Grunnable - it won't
      change again until the GC is done and the world can continue, but the
      GC is waiting for the status to change back. This wedges the program.
      
      To fix, call a special variant of casgstatus that accepts either Gwaiting
      or Grunnable as valid statuses.
      
      Without the fix bug with the extra check+throw in casgstatus, the
      program below dies in a few seconds (2-10) with GOMAXPROCS=8
      on a 2012 Retina MacBook Pro. With the fix, it runs for minutes
      and minutes.
      
      package main
      
      import (
              "io"
              "log"
              "net"
              "runtime"
      )
      
      func main() {
              const N = 100
              for i := 0; i < N; i++ {
                      l, err := net.Listen("tcp", "127.0.0.1:0")
                      if err != nil {
                              log.Fatal(err)
                      }
                      ch := make(chan net.Conn, 1)
                      go func() {
                              var err error
                              c1, err := net.Dial("tcp", l.Addr().String())
                              if err != nil {
                                      log.Fatal(err)
                              }
                              ch <- c1
                      }()
                      c2, err := l.Accept()
                      if err != nil {
                              log.Fatal(err)
                      }
                      c1 := <-ch
                      l.Close()
                      go netguy(c1, c2)
                      go netguy(c2, c1)
                      c1.Write(make([]byte, 100))
              }
              for {
                      runtime.GC()
              }
      }
      
      func netguy(r, w net.Conn) {
              buf := make([]byte, 100)
              for {
                      bigstack(1000)
                      _, err := io.ReadFull(r, buf)
                      if err != nil {
                              log.Fatal(err)
                      }
                      w.Write(buf)
              }
      }
      
      var g int
      
      func bigstack(n int) {
              var buf [100]byte
              if n > 0 {
                      bigstack(n - 1)
              }
              g = int(buf[0]) + int(buf[99])
      }
      
      Fixes #9186.
      
      LGTM=rlh
      R=austin, rlh
      CC=dvyukov, golang-codereviews, iant, khr, r
      https://golang.org/cl/179680043
      »»»
      
      TBR=rlh
      CC=golang-codereviews
      https://golang.org/cl/184030043
      28208eb8
    • Russ Cox's avatar
      [release-branch.go1.4] reflect: Fix reflect.funcLayout. The GC bitmap has two bits per · 95e92ac4
      Russ Cox authored
      ««« CL 182160043 / 321d04dea9d6
      reflect: Fix reflect.funcLayout.  The GC bitmap has two bits per
      pointer, not one.
      
      Fixes #9179
      
      LGTM=iant, rsc
      R=golang-codereviews, iant, rsc
      CC=golang-codereviews
      https://golang.org/cl/182160043
      »»»
      
      TBR=khr
      CC=golang-codereviews
      https://golang.org/cl/180440044
      95e92ac4
  12. 25 Nov, 2014 2 commits
  13. 23 Nov, 2014 1 commit
  14. 22 Nov, 2014 1 commit
  15. 20 Nov, 2014 2 commits
  16. 19 Nov, 2014 2 commits
    • Russ Cox's avatar
      [release-branch.go1.4] runtime: remove assumption that noptrdata data bss... · 427ee804
      Russ Cox authored
      [release-branch.go1.4] runtime: remove assumption that noptrdata data bss noptrbss are ordered and contiguous
      
      ««« CL 179980043 / d71cc7e8a0e0
      runtime: remove assumption that noptrdata data bss noptrbss are ordered and contiguous
      
      The assumption can be violated by external linkers reordering them or
      inserting non-Go sections in between them. I looked briefly at trying
      to write out the _go_.o in external linking mode in a way that forced
      the ordering, but no matter what there's no way to force Go's data
      and Go's bss to be next to each other. If there is any data or bss from
      non-Go objects, it's very likely to get stuck in between them.
      
      Instead, rewrite the two places we know about that make the assumption.
      I grepped for noptrdata to look for more and didn't find any.
      
      The added race test (os/exec in external linking mode) fails without
      the changes in the runtime. It crashes with an invalid pointer dereference.
      
      Fixes #9133.
      
      LGTM=dneil
      R=dneil
      CC=dvyukov, golang-codereviews, iant
      https://golang.org/cl/179980043
      »»»
      
      LGTM=dneil
      R=dneil
      CC=golang-codereviews
      https://golang.org/cl/173510043
      427ee804
    • Russ Cox's avatar
      [release-branch.go1.4] undo CL 131750044 / 2d6d44ceb80e · b4df0154
      Russ Cox authored
      ««« CL 174450043 / 699cc091a16d
      undo CL 131750044 / 2d6d44ceb80e
      
      Breaks reading from stdin in parent after exec with SysProcAttr{Setpgid: true}.
      
      package main
      
      import (
              "fmt"
              "os"
              "os/exec"
              "syscall"
      )
      
      func main() {
              cmd := exec.Command("true")
              cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
              cmd.Run()
      
              fmt.Printf("Hit enter:")
              os.Stdin.Read(make([]byte, 100))
              fmt.Printf("Bye\n")
      }
      
      In go1.3, I type enter at the prompt and the program exits.
      With the CL being rolled back, the program wedges at the
      prompt.
      
      ««« original CL description
      syscall: SysProcAttr job control changes
      
      Making the child's process group the foreground process group and
      placing the child in a specific process group involves co-ordination
      between the parent and child that must be done post-fork but pre-exec.
      
      LGTM=iant
      R=golang-codereviews, gobot, iant, mikioh.mikioh
      CC=golang-codereviews
      https://golang.org/cl/131750044
      
      »»»
      
      LGTM=minux, dneil
      R=dneil, minux
      CC=golang-codereviews, iant, michael.p.macinnis
      https://golang.org/cl/174450043
      »»»
      
      LGTM=minux
      R=dneil, minux
      CC=golang-codereviews
      https://golang.org/cl/179970043
      b4df0154
  17. 18 Nov, 2014 1 commit
  18. 17 Nov, 2014 1 commit