]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/pprof: skip profiling tests on mips if highres timers not available
authorBrad Fitzpatrick <bradfitz@golang.org>
Wed, 16 Nov 2016 16:27:27 +0000 (16:27 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 16 Nov 2016 20:07:47 +0000 (20:07 +0000)
Fixes #17936

Change-Id: I20d09712b7d7303257994356904052ba64bc5bf2
Reviewed-on: https://go-review.googlesource.com/33306
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/pprof/pprof_test.go

index eb8fcc90dbd8dfbafb45a42e65b535b47687e75e..b0b15f3d1c20d45bb721bdddf58316fe6462dfe1 100644 (file)
@@ -8,9 +8,12 @@ package pprof_test
 
 import (
        "bytes"
+       "compress/gzip"
        "fmt"
        "internal/pprof/profile"
        "internal/testenv"
+       "io"
+       "io/ioutil"
        "math/big"
        "os"
        "os/exec"
@@ -343,8 +346,49 @@ func TestMathBigDivide(t *testing.T) {
        })
 }
 
+func slurpString(r io.Reader) string {
+       slurp, _ := ioutil.ReadAll(r)
+       return string(slurp)
+}
+
+func getLinuxKernelConfig() string {
+       if f, err := os.Open("/proc/config"); err == nil {
+               defer f.Close()
+               return slurpString(f)
+       }
+       if f, err := os.Open("/proc/config.gz"); err == nil {
+               defer f.Close()
+               r, err := gzip.NewReader(f)
+               if err != nil {
+                       return ""
+               }
+               return slurpString(r)
+       }
+       if f, err := os.Open("/boot/config"); err == nil {
+               defer f.Close()
+               return slurpString(f)
+       }
+       uname, _ := exec.Command("uname, -r").Output()
+       if len(uname) > 0 {
+               if f, err := os.Open("/boot/config-" + string(uname)); err == nil {
+                       defer f.Close()
+                       return slurpString(f)
+               }
+       }
+       return ""
+}
+
+func haveLinuxHiresTimers() bool {
+       config := getLinuxKernelConfig()
+       return strings.Contains(config, "CONFIG_HIGH_RES_TIMERS=y")
+}
+
 func TestStackBarrierProfiling(t *testing.T) {
-       if (runtime.GOOS == "linux" && runtime.GOARCH == "arm") || runtime.GOOS == "openbsd" || runtime.GOOS == "solaris" || runtime.GOOS == "dragonfly" || runtime.GOOS == "freebsd" {
+       if (runtime.GOOS == "linux" && runtime.GOARCH == "arm") ||
+               runtime.GOOS == "openbsd" ||
+               runtime.GOOS == "solaris" ||
+               runtime.GOOS == "dragonfly" ||
+               runtime.GOOS == "freebsd" {
                // This test currently triggers a large number of
                // usleep(100)s. These kernels/arches have poor
                // resolution timers, so this gives up a whole
@@ -357,6 +401,12 @@ func TestStackBarrierProfiling(t *testing.T) {
                return
        }
 
+       if runtime.GOOS == "linux" && strings.HasPrefix(runtime.GOARCH, "mips") {
+               if !haveLinuxHiresTimers() {
+                       t.Skipf("low resolution timers inhibit profiling signals (golang.org/issue/13405, golang.org/issue/17936)")
+               }
+       }
+
        if !strings.Contains(os.Getenv("GODEBUG"), "gcstackbarrierall=1") {
                // Re-execute this test with constant GC and stack
                // barriers at every frame.