Use build tags to conditionally enable vfs.checkInvariants.

We don't want these checks in the production binary at all. Even though the
hardware branch predictor will do away with any runtime costs of the if
condition, the code under the "if checkInvariants {...}" could force escapes
to the heap. It could also increase function complexity, making it no longer
inlinable. And these invariant checks lie on hot code paths.

PiperOrigin-RevId: 513398208
This commit is contained in:
Ayush Ranjan
2023-03-01 18:32:51 -08:00
committed by gVisor bot
parent 9b4a7aa00f
commit a625ba1d0a
4 changed files with 32 additions and 4 deletions
+1
View File
@@ -115,6 +115,7 @@ go_library(
"anonfs.go",
"context.go",
"debug.go",
"debug_testonly.go",
"dentry.go",
"device.go",
"epoll.go",
+5 -2
View File
@@ -12,11 +12,14 @@
// See the License for the specific language governing permissions and
// limitations under the License.
//go:build !check_invariants
// +build !check_invariants
package vfs
const (
// If checkInvariants is true, perform runtime checks for invariants
// expected by the vfs package. This is normally disabled since VFS is
// often a hot path.
// expected by the vfs package. This is disabled for non-test binaries since
// VFS is often a hot path.
checkInvariants = false
)
+23
View File
@@ -0,0 +1,23 @@
// Copyright 2019 The gVisor Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//go:build check_invariants
// +build check_invariants
package vfs
const (
// Set checkInvariants to true for tests.
checkInvariants = true
)
+3 -2
View File
@@ -49,12 +49,13 @@ generic = [
"_norace",
"_unsafe",
"_opts",
"_testonly",
]
# State explosion? Sure. This is approximately:
# len(archs) * (1 + 2 * len(oses) * (1 + 2 * len(generic))
# len(archs) * (1 + 2 * len(oses)) * (1 + 2 * len(generic))
#
# This evaluates to 495 at the time of writing. So it's a lot of different
# This evaluates to 663 at the time of writing. So it's a lot of different
# combinations, but not so much that it will cause issues. We can probably add
# quite a few more variants before this becomes a genuine problem.
go_suffixes = explode(explode(archs, oses), generic)