aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/host/host_linux.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-10-10 15:38:06 +0200
committerDmitry Vyukov <dvyukov@google.com>2018-10-10 15:38:06 +0200
commita9495352a0c4fe83ff788edd6460def6508ea636 (patch)
tree501b3bdebe79e30c31f99fc4aaa675a614cbbbe2 /pkg/host/host_linux.go
parentfefd83bf0b0fd1c471be79b86259c011e4e76b92 (diff)
pkg/host: improve KMEMLEAK detection
EBUSY is returned when KMEMLEAK is in fact turned off, not when scanning is already turned off. That can't be recovered. So instead check that we can write to the file in the check function and give useful diagnostics.
Diffstat (limited to 'pkg/host/host_linux.go')
-rw-r--r--pkg/host/host_linux.go16
1 files changed, 9 insertions, 7 deletions
diff --git a/pkg/host/host_linux.go b/pkg/host/host_linux.go
index 5c5db793b..3523605c7 100644
--- a/pkg/host/host_linux.go
+++ b/pkg/host/host_linux.go
@@ -437,9 +437,17 @@ func checkLeakChecking() string {
if reason := checkDebugFS(); reason != "" {
return reason
}
- if err := osutil.IsAccessible("/sys/kernel/debug/kmemleak"); err != nil {
+ fd, err := syscall.Open("/sys/kernel/debug/kmemleak", syscall.O_RDWR, 0)
+ if err != nil {
return "CONFIG_DEBUG_KMEMLEAK is not enabled"
}
+ defer syscall.Close(fd)
+ if _, err := syscall.Write(fd, []byte("scan=off")); err != nil {
+ if err == syscall.EBUSY {
+ return "KMEMLEAK disabled: increase CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE or unset CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF"
+ }
+ return fmt.Sprintf("/sys/kernel/debug/kmemleak write failed: %v", err)
+ }
return ""
}
@@ -449,12 +457,6 @@ func setupLeakChecking() error {
return fmt.Errorf("failed to open /sys/kernel/debug/kmemleak: %v", err)
}
defer syscall.Close(fd)
- if _, err := syscall.Write(fd, []byte("scan=off")); err != nil {
- // kmemleak returns EBUSY when kmemleak is already turned off.
- if err != syscall.EBUSY {
- return fmt.Errorf("write(kmemleak, scan=off) failed: %v", err)
- }
- }
// Flush boot leaks.
if _, err := syscall.Write(fd, []byte("scan")); err != nil {
return fmt.Errorf("write(kmemleak, scan) failed: %v", err)