summaryrefslogtreecommitdiffhomepage
path: root/pkg
diff options
context:
space:
mode:
authorMichael Pratt <mpratt@google.com>2018-08-01 19:56:12 -0700
committerShentubot <shentubot@google.com>2018-08-01 19:57:32 -0700
commit60add78980737a7330100d98bf6a214892dee3c0 (patch)
tree14433da4615d2010a5d34ade91ff94b938c5a9b5 /pkg
parentb9e1cf8404ce1263176643dee1a1cc835c9d1448 (diff)
Automated rollback of changelist 207007153
PiperOrigin-RevId: 207037226 Change-Id: I8b5f1a056d4f3eab17846f2e0193bb737ecb5428
Diffstat (limited to 'pkg')
-rw-r--r--pkg/abi/BUILD13
-rw-r--r--pkg/abi/linux/BUILD16
-rw-r--r--pkg/abi/linux/bpf.go2
-rw-r--r--pkg/abi/linux/tty.go2
-rw-r--r--pkg/bpf/BUILD17
-rw-r--r--pkg/bpf/interpreter.go2
-rw-r--r--pkg/cpuid/BUILD15
-rw-r--r--pkg/cpuid/cpuid.go2
-rw-r--r--pkg/ilist/BUILD15
-rw-r--r--pkg/ilist/list.go4
-rw-r--r--pkg/segment/range.go2
-rw-r--r--pkg/segment/set.go5
-rw-r--r--pkg/sentry/arch/BUILD18
-rw-r--r--pkg/sentry/arch/arch.go2
-rw-r--r--pkg/sentry/arch/arch_amd64.go2
-rw-r--r--pkg/sentry/arch/arch_state_x86.go1
-rw-r--r--pkg/sentry/arch/arch_x86.go2
-rw-r--r--pkg/sentry/arch/auxv.go2
-rw-r--r--pkg/sentry/arch/signal_amd64.go6
-rw-r--r--pkg/sentry/context/contexttest/BUILD17
-rw-r--r--pkg/sentry/fs/BUILD36
-rw-r--r--pkg/sentry/fs/ashmem/BUILD17
-rw-r--r--pkg/sentry/fs/ashmem/area.go8
-rw-r--r--pkg/sentry/fs/ashmem/device.go22
-rw-r--r--pkg/sentry/fs/ashmem/pin_board.go2
-rw-r--r--pkg/sentry/fs/attr.go12
-rw-r--r--pkg/sentry/fs/binder/BUILD13
-rw-r--r--pkg/sentry/fs/binder/binder.go26
-rw-r--r--pkg/sentry/fs/dentry.go4
-rw-r--r--pkg/sentry/fs/dev/BUILD20
-rw-r--r--pkg/sentry/fs/dev/dev.go2
-rw-r--r--pkg/sentry/fs/dev/fs.go2
-rw-r--r--pkg/sentry/fs/dev/full.go2
-rw-r--r--pkg/sentry/fs/dev/null.go3
-rw-r--r--pkg/sentry/fs/dev/random.go1
-rw-r--r--pkg/sentry/fs/dirent.go2
-rw-r--r--pkg/sentry/fs/dirent_cache.go2
-rw-r--r--pkg/sentry/fs/fdpipe/BUILD31
-rw-r--r--pkg/sentry/fs/fdpipe/pipe.go2
-rw-r--r--pkg/sentry/fs/file.go2
-rw-r--r--pkg/sentry/fs/file_overlay.go4
-rw-r--r--pkg/sentry/fs/filesystems.go2
-rw-r--r--pkg/sentry/fs/filetest/BUILD18
-rw-r--r--pkg/sentry/fs/flags.go2
-rw-r--r--pkg/sentry/fs/fsutil/BUILD20
-rw-r--r--pkg/sentry/fs/fsutil/dirty_set.go2
-rw-r--r--pkg/sentry/fs/fsutil/handle.go2
-rw-r--r--pkg/sentry/fs/fsutil/host_file_mapper.go2
-rw-r--r--pkg/sentry/fs/fsutil/inode.go6
-rw-r--r--pkg/sentry/fs/fsutil/inode_cached.go2
-rw-r--r--pkg/sentry/fs/gofer/BUILD23
-rw-r--r--pkg/sentry/fs/gofer/file.go2
-rw-r--r--pkg/sentry/fs/gofer/fs.go2
-rw-r--r--pkg/sentry/fs/gofer/inode.go4
-rw-r--r--pkg/sentry/fs/gofer/session.go3
-rw-r--r--pkg/sentry/fs/host/BUILD27
-rw-r--r--pkg/sentry/fs/host/descriptor.go2
-rw-r--r--pkg/sentry/fs/host/file.go2
-rw-r--r--pkg/sentry/fs/host/fs.go6
-rw-r--r--pkg/sentry/fs/host/inode.go4
-rw-r--r--pkg/sentry/fs/inode.go4
-rw-r--r--pkg/sentry/fs/inode_inotify.go2
-rw-r--r--pkg/sentry/fs/inotify.go2
-rw-r--r--pkg/sentry/fs/inotify_event.go2
-rw-r--r--pkg/sentry/fs/inotify_watch.go2
-rw-r--r--pkg/sentry/fs/lock/BUILD15
-rw-r--r--pkg/sentry/fs/lock/lock.go6
-rw-r--r--pkg/sentry/fs/mount.go4
-rw-r--r--pkg/sentry/fs/mount_overlay.go4
-rw-r--r--pkg/sentry/fs/mounts.go2
-rw-r--r--pkg/sentry/fs/overlay.go2
-rw-r--r--pkg/sentry/fs/proc/BUILD34
-rw-r--r--pkg/sentry/fs/proc/cpuinfo.go2
-rw-r--r--pkg/sentry/fs/proc/exec_args.go2
-rw-r--r--pkg/sentry/fs/proc/fds.go6
-rw-r--r--pkg/sentry/fs/proc/file.go1
-rw-r--r--pkg/sentry/fs/proc/filesystems.go2
-rw-r--r--pkg/sentry/fs/proc/fs.go2
-rw-r--r--pkg/sentry/fs/proc/loadavg.go2
-rw-r--r--pkg/sentry/fs/proc/meminfo.go2
-rw-r--r--pkg/sentry/fs/proc/mounts.go4
-rw-r--r--pkg/sentry/fs/proc/proc.go4
-rw-r--r--pkg/sentry/fs/proc/seqfile/BUILD30
-rw-r--r--pkg/sentry/fs/proc/seqfile/seqfile.go4
-rw-r--r--pkg/sentry/fs/proc/stat.go2
-rw-r--r--pkg/sentry/fs/proc/sys.go5
-rw-r--r--pkg/sentry/fs/proc/sys_net.go2
-rw-r--r--pkg/sentry/fs/proc/task.go20
-rw-r--r--pkg/sentry/fs/proc/uid_gid_map.go3
-rw-r--r--pkg/sentry/fs/proc/uptime.go2
-rw-r--r--pkg/sentry/fs/proc/version.go2
-rw-r--r--pkg/sentry/fs/ramfs/BUILD21
-rw-r--r--pkg/sentry/fs/ramfs/dir.go2
-rw-r--r--pkg/sentry/fs/ramfs/ramfs.go2
-rw-r--r--pkg/sentry/fs/ramfs/socket.go2
-rw-r--r--pkg/sentry/fs/ramfs/symlink.go2
-rw-r--r--pkg/sentry/fs/ramfs/test/BUILD18
-rw-r--r--pkg/sentry/fs/sys/BUILD14
-rw-r--r--pkg/sentry/fs/sys/fs.go2
-rw-r--r--pkg/sentry/fs/sys/sys.go5
-rw-r--r--pkg/sentry/fs/timerfd/BUILD18
-rw-r--r--pkg/sentry/fs/timerfd/timerfd.go4
-rw-r--r--pkg/sentry/fs/tmpfs/BUILD17
-rw-r--r--pkg/sentry/fs/tmpfs/file_regular.go2
-rw-r--r--pkg/sentry/fs/tmpfs/fs.go2
-rw-r--r--pkg/sentry/fs/tmpfs/inode_file.go2
-rw-r--r--pkg/sentry/fs/tmpfs/tmpfs.go8
-rw-r--r--pkg/sentry/fs/tty/BUILD20
-rw-r--r--pkg/sentry/fs/tty/dir.go18
-rw-r--r--pkg/sentry/fs/tty/fs.go4
-rw-r--r--pkg/sentry/fs/tty/inode.go2
-rw-r--r--pkg/sentry/fs/tty/line_discipline.go6
-rw-r--r--pkg/sentry/fs/tty/master.go4
-rw-r--r--pkg/sentry/fs/tty/queue.go4
-rw-r--r--pkg/sentry/fs/tty/slave.go4
-rw-r--r--pkg/sentry/fs/tty/terminal.go2
-rw-r--r--pkg/sentry/inet/BUILD15
-rw-r--r--pkg/sentry/inet/inet.go2
-rw-r--r--pkg/sentry/kernel/BUILD59
-rw-r--r--pkg/sentry/kernel/abstract_socket_namespace.go3
-rw-r--r--pkg/sentry/kernel/auth/BUILD17
-rw-r--r--pkg/sentry/kernel/auth/credentials.go2
-rw-r--r--pkg/sentry/kernel/auth/id_map.go2
-rw-r--r--pkg/sentry/kernel/auth/user_namespace.go2
-rw-r--r--pkg/sentry/kernel/epoll/BUILD15
-rw-r--r--pkg/sentry/kernel/epoll/epoll.go8
-rw-r--r--pkg/sentry/kernel/eventfd/BUILD18
-rw-r--r--pkg/sentry/kernel/eventfd/eventfd.go4
-rw-r--r--pkg/sentry/kernel/fd_map.go6
-rw-r--r--pkg/sentry/kernel/fs_context.go2
-rw-r--r--pkg/sentry/kernel/futex/BUILD18
-rw-r--r--pkg/sentry/kernel/futex/futex.go2
-rw-r--r--pkg/sentry/kernel/ipc_namespace.go2
-rw-r--r--pkg/sentry/kernel/kernel.go4
-rw-r--r--pkg/sentry/kernel/pending_signals.go5
-rw-r--r--pkg/sentry/kernel/pipe/BUILD20
-rw-r--r--pkg/sentry/kernel/pipe/buffers.go2
-rw-r--r--pkg/sentry/kernel/pipe/node.go2
-rw-r--r--pkg/sentry/kernel/pipe/pipe.go2
-rw-r--r--pkg/sentry/kernel/pipe/reader.go2
-rw-r--r--pkg/sentry/kernel/pipe/reader_writer.go2
-rw-r--r--pkg/sentry/kernel/pipe/writer.go2
-rw-r--r--pkg/sentry/kernel/ptrace.go4
-rw-r--r--pkg/sentry/kernel/rseq.go2
-rw-r--r--pkg/sentry/kernel/semaphore/BUILD15
-rw-r--r--pkg/sentry/kernel/semaphore/semaphore.go8
-rw-r--r--pkg/sentry/kernel/sessions.go4
-rw-r--r--pkg/sentry/kernel/shm/BUILD13
-rw-r--r--pkg/sentry/kernel/shm/shm.go4
-rw-r--r--pkg/sentry/kernel/signal_handlers.go2
-rw-r--r--pkg/sentry/kernel/syscalls.go2
-rw-r--r--pkg/sentry/kernel/syslog.go2
-rw-r--r--pkg/sentry/kernel/task.go2
-rw-r--r--pkg/sentry/kernel/task_clone.go4
-rw-r--r--pkg/sentry/kernel/task_context.go2
-rw-r--r--pkg/sentry/kernel/task_exec.go4
-rw-r--r--pkg/sentry/kernel/task_exit.go6
-rw-r--r--pkg/sentry/kernel/task_resources.go2
-rw-r--r--pkg/sentry/kernel/task_run.go2
-rw-r--r--pkg/sentry/kernel/task_sched.go2
-rw-r--r--pkg/sentry/kernel/task_signals.go5
-rw-r--r--pkg/sentry/kernel/task_syscall.go4
-rw-r--r--pkg/sentry/kernel/thread_group.go2
-rw-r--r--pkg/sentry/kernel/threads.go8
-rw-r--r--pkg/sentry/kernel/time/BUILD14
-rw-r--r--pkg/sentry/kernel/time/time.go6
-rw-r--r--pkg/sentry/kernel/timekeeper.go2
-rw-r--r--pkg/sentry/kernel/timer.go8
-rw-r--r--pkg/sentry/kernel/uts_namespace.go2
-rw-r--r--pkg/sentry/kernel/vdso.go2
-rw-r--r--pkg/sentry/limits/BUILD13
-rw-r--r--pkg/sentry/limits/limits.go4
-rw-r--r--pkg/sentry/loader/BUILD15
-rw-r--r--pkg/sentry/loader/vdso.go2
-rw-r--r--pkg/sentry/loader/vdso_state.go1
-rw-r--r--pkg/sentry/memmap/BUILD15
-rw-r--r--pkg/sentry/memmap/mapping_set.go2
-rw-r--r--pkg/sentry/mm/BUILD21
-rw-r--r--pkg/sentry/mm/aio_context.go8
-rw-r--r--pkg/sentry/mm/mm.go7
-rw-r--r--pkg/sentry/mm/special_mappable.go2
-rw-r--r--pkg/sentry/platform/BUILD13
-rw-r--r--pkg/sentry/platform/filemem/BUILD14
-rw-r--r--pkg/sentry/platform/filemem/filemem.go2
-rw-r--r--pkg/sentry/socket/BUILD17
-rw-r--r--pkg/sentry/socket/control/BUILD23
-rw-r--r--pkg/sentry/socket/control/control.go4
-rw-r--r--pkg/sentry/socket/epsocket/BUILD16
-rw-r--r--pkg/sentry/socket/epsocket/epsocket.go2
-rw-r--r--pkg/sentry/socket/epsocket/stack.go2
-rw-r--r--pkg/sentry/socket/hostinet/BUILD15
-rw-r--r--pkg/sentry/socket/netlink/BUILD13
-rw-r--r--pkg/sentry/socket/netlink/port/BUILD15
-rw-r--r--pkg/sentry/socket/netlink/port/port.go2
-rw-r--r--pkg/sentry/socket/netlink/route/BUILD17
-rw-r--r--pkg/sentry/socket/netlink/route/protocol.go2
-rw-r--r--pkg/sentry/socket/netlink/socket.go2
-rw-r--r--pkg/sentry/socket/socket.go2
-rw-r--r--pkg/sentry/socket/unix/BUILD13
-rw-r--r--pkg/sentry/socket/unix/unix.go2
-rw-r--r--pkg/sentry/syscalls/linux/BUILD20
-rw-r--r--pkg/sentry/syscalls/linux/sys_aio.go2
-rw-r--r--pkg/sentry/syscalls/linux/sys_futex.go2
-rw-r--r--pkg/sentry/syscalls/linux/sys_poll.go2
-rw-r--r--pkg/sentry/syscalls/linux/sys_time.go2
-rw-r--r--pkg/sentry/usage/BUILD17
-rw-r--r--pkg/sentry/usage/cpu.go2
-rw-r--r--pkg/sentry/usage/io.go2
-rw-r--r--pkg/sentry/usermem/BUILD16
-rw-r--r--pkg/sentry/usermem/access_type.go2
-rw-r--r--pkg/sentry/usermem/addr.go2
-rw-r--r--pkg/tcpip/BUILD17
-rw-r--r--pkg/tcpip/buffer/BUILD13
-rw-r--r--pkg/tcpip/buffer/view.go2
-rw-r--r--pkg/tcpip/header/BUILD13
-rw-r--r--pkg/tcpip/header/tcp.go4
-rw-r--r--pkg/tcpip/network/fragmentation/BUILD11
-rw-r--r--pkg/tcpip/seqnum/BUILD17
-rw-r--r--pkg/tcpip/tcpip.go4
-rw-r--r--pkg/tcpip/transport/ping/BUILD17
-rw-r--r--pkg/tcpip/transport/ping/endpoint.go1
-rw-r--r--pkg/tcpip/transport/queue/BUILD17
-rw-r--r--pkg/tcpip/transport/queue/queue.go2
-rw-r--r--pkg/tcpip/transport/tcp/BUILD25
-rw-r--r--pkg/tcpip/transport/tcp/endpoint.go4
-rw-r--r--pkg/tcpip/transport/tcp/rcv.go2
-rw-r--r--pkg/tcpip/transport/tcp/reno.go2
-rw-r--r--pkg/tcpip/transport/tcp/segment.go2
-rw-r--r--pkg/tcpip/transport/tcp/segment_queue.go2
-rw-r--r--pkg/tcpip/transport/tcp/snd.go4
-rw-r--r--pkg/tcpip/transport/tcp/snd_state.go1
-rw-r--r--pkg/tcpip/transport/udp/BUILD17
-rw-r--r--pkg/tcpip/transport/udp/endpoint.go3
-rw-r--r--pkg/tcpip/transport/unix/BUILD16
-rw-r--r--pkg/tcpip/transport/unix/connectioned.go2
-rw-r--r--pkg/tcpip/transport/unix/connectionless.go2
-rw-r--r--pkg/tcpip/transport/unix/unix.go11
-rw-r--r--pkg/waiter/BUILD21
-rw-r--r--pkg/waiter/waiter.go2
239 files changed, 1108 insertions, 662 deletions
diff --git a/pkg/abi/BUILD b/pkg/abi/BUILD
index c014d2c4b..f1e6bac67 100644
--- a/pkg/abi/BUILD
+++ b/pkg/abi/BUILD
@@ -1,13 +1,24 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "abi_state",
+ srcs = [
+ "abi.go",
+ ],
+ out = "abi_state.go",
+ package = "abi",
+)
go_library(
name = "abi",
srcs = [
"abi.go",
+ "abi_state.go",
"flag.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/abi",
visibility = ["//:sandbox"],
+ deps = ["//pkg/state"],
)
diff --git a/pkg/abi/linux/BUILD b/pkg/abi/linux/BUILD
index ac4ceefbc..38b4829c9 100644
--- a/pkg/abi/linux/BUILD
+++ b/pkg/abi/linux/BUILD
@@ -4,7 +4,19 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "linux_state",
+ srcs = [
+ "binder.go",
+ "bpf.go",
+ "time.go",
+ "tty.go",
+ ],
+ out = "linux_state.go",
+ package = "linux",
+)
go_library(
name = "linux",
@@ -29,6 +41,7 @@ go_library(
"ipc.go",
"limits.go",
"linux.go",
+ "linux_state.go",
"mm.go",
"netdevice.go",
"netlink.go",
@@ -54,5 +67,6 @@ go_library(
"//pkg/abi",
"//pkg/binary",
"//pkg/bits",
+ "//pkg/state",
],
)
diff --git a/pkg/abi/linux/bpf.go b/pkg/abi/linux/bpf.go
index 80e5b1af1..f597ef4f5 100644
--- a/pkg/abi/linux/bpf.go
+++ b/pkg/abi/linux/bpf.go
@@ -15,8 +15,6 @@
package linux
// BPFInstruction is a raw BPF virtual machine instruction.
-//
-// +stateify savable
type BPFInstruction struct {
// OpCode is the operation to execute.
OpCode uint16
diff --git a/pkg/abi/linux/tty.go b/pkg/abi/linux/tty.go
index b640f7627..84b6ccc87 100644
--- a/pkg/abi/linux/tty.go
+++ b/pkg/abi/linux/tty.go
@@ -38,8 +38,6 @@ type Termios struct {
// KernelTermios is struct ktermios/struct termios2, defined in
// uapi/asm-generic/termbits.h.
-//
-// +stateify savable
type KernelTermios struct {
InputFlags uint32
OutputFlags uint32
diff --git a/pkg/bpf/BUILD b/pkg/bpf/BUILD
index 564df3af5..403270049 100644
--- a/pkg/bpf/BUILD
+++ b/pkg/bpf/BUILD
@@ -1,11 +1,21 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "bpf_state",
+ srcs = [
+ "interpreter.go",
+ ],
+ out = "bpf_state.go",
+ package = "bpf",
+)
go_library(
name = "bpf",
srcs = [
"bpf.go",
+ "bpf_state.go",
"decoder.go",
"input_bytes.go",
"interpreter.go",
@@ -13,7 +23,10 @@ go_library(
],
importpath = "gvisor.googlesource.com/gvisor/pkg/bpf",
visibility = ["//visibility:public"],
- deps = ["//pkg/abi/linux"],
+ deps = [
+ "//pkg/abi/linux",
+ "//pkg/state",
+ ],
)
go_test(
diff --git a/pkg/bpf/interpreter.go b/pkg/bpf/interpreter.go
index 111ada9d1..b7dee86a8 100644
--- a/pkg/bpf/interpreter.go
+++ b/pkg/bpf/interpreter.go
@@ -88,8 +88,6 @@ func (e Error) Error() string {
}
// Program is a BPF program that has been validated for consistency.
-//
-// +stateify savable
type Program struct {
instructions []linux.BPFInstruction
}
diff --git a/pkg/cpuid/BUILD b/pkg/cpuid/BUILD
index 46fc4703b..9a0ca1b33 100644
--- a/pkg/cpuid/BUILD
+++ b/pkg/cpuid/BUILD
@@ -1,16 +1,27 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "cpuid_state",
+ srcs = ["cpuid.go"],
+ out = "cpuid_state.go",
+ package = "cpuid",
+)
go_library(
name = "cpuid",
srcs = [
"cpu_amd64.s",
"cpuid.go",
+ "cpuid_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/cpuid",
visibility = ["//:sandbox"],
- deps = ["//pkg/log"],
+ deps = [
+ "//pkg/log",
+ "//pkg/state",
+ ],
)
go_test(
diff --git a/pkg/cpuid/cpuid.go b/pkg/cpuid/cpuid.go
index e91e34dc7..b486ab037 100644
--- a/pkg/cpuid/cpuid.go
+++ b/pkg/cpuid/cpuid.go
@@ -409,8 +409,6 @@ func (f Feature) flagString(cpuinfoOnly bool) string {
}
// FeatureSet is a set of Features for a cpu.
-//
-// +stateify savable
type FeatureSet struct {
// Set is the set of features that are enabled in this FeatureSet.
Set map[Feature]bool
diff --git a/pkg/ilist/BUILD b/pkg/ilist/BUILD
index b26a39132..e32f26ffa 100644
--- a/pkg/ilist/BUILD
+++ b/pkg/ilist/BUILD
@@ -1,15 +1,28 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "list_state",
+ srcs = [
+ "interface_list.go",
+ ],
+ out = "interface_list_state.go",
+ package = "ilist",
+)
go_library(
name = "ilist",
srcs = [
"interface_list.go",
+ "interface_list_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/ilist",
visibility = ["//visibility:public"],
+ deps = [
+ "//pkg/state",
+ ],
)
go_template_instance(
diff --git a/pkg/ilist/list.go b/pkg/ilist/list.go
index a88b82196..5efb6c072 100644
--- a/pkg/ilist/list.go
+++ b/pkg/ilist/list.go
@@ -36,8 +36,6 @@ type Linker interface {
// for e := l.Front(); e != nil; e = e.Next() {
// // do something with e.
// }
-//
-// +stateify savable
type List struct {
head Linker
tail Linker
@@ -157,8 +155,6 @@ func (l *List) Remove(e Linker) {
// Entry is a default implementation of Linker. Users can add anonymous fields
// of this type to their structs to make them automatically implement the
// methods needed by List.
-//
-// +stateify savable
type Entry struct {
next Linker
prev Linker
diff --git a/pkg/segment/range.go b/pkg/segment/range.go
index 34c067265..5ff30d489 100644
--- a/pkg/segment/range.go
+++ b/pkg/segment/range.go
@@ -18,8 +18,6 @@ package segment
type T uint64
// A Range represents a contiguous range of T.
-//
-// +stateify savable
type Range struct {
// Start is the inclusive start of the range.
Start T
diff --git a/pkg/segment/set.go b/pkg/segment/set.go
index cffec2a2c..6eed1d930 100644
--- a/pkg/segment/set.go
+++ b/pkg/segment/set.go
@@ -88,8 +88,6 @@ const (
// A Set is a mapping of segments with non-overlapping Range keys. The zero
// value for a Set is an empty set. Set values are not safely movable nor
// copyable. Set is thread-compatible.
-//
-// +stateify savable
type Set struct {
root node `state:".(*SegmentDataSlices)"`
}
@@ -598,7 +596,6 @@ func (s *Set) ApplyContiguous(r Range, fn func(seg Iterator)) GapIterator {
}
}
-// +stateify savable
type node struct {
// An internal binary tree node looks like:
//
@@ -1320,8 +1317,6 @@ func (n *node) writeDebugString(buf *bytes.Buffer, prefix string) {
// SegmentDataSlices represents segments from a set as slices of start, end, and
// values. SegmentDataSlices is primarily used as an intermediate representation
// for save/restore and the layout here is optimized for that.
-//
-// +stateify savable
type SegmentDataSlices struct {
Start []Key
End []Key
diff --git a/pkg/sentry/arch/BUILD b/pkg/sentry/arch/BUILD
index 314b3e962..0a2a35400 100644
--- a/pkg/sentry/arch/BUILD
+++ b/pkg/sentry/arch/BUILD
@@ -1,7 +1,21 @@
package(licenses = ["notice"]) # Apache 2.0
load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "arch_state",
+ srcs = [
+ "arch.go",
+ "arch_amd64.go",
+ "arch_state_x86.go",
+ "arch_x86.go",
+ "auxv.go",
+ "signal_amd64.go",
+ ],
+ out = "arch_state.go",
+ package = "arch",
+)
go_library(
name = "arch",
@@ -10,6 +24,7 @@ go_library(
"arch.go",
"arch_amd64.go",
"arch_amd64.s",
+ "arch_state.go",
"arch_state_x86.go",
"arch_x86.go",
"auxv.go",
@@ -31,6 +46,7 @@ go_library(
"//pkg/sentry/context",
"//pkg/sentry/limits",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
],
)
diff --git a/pkg/sentry/arch/arch.go b/pkg/sentry/arch/arch.go
index 21cb84502..0189e958d 100644
--- a/pkg/sentry/arch/arch.go
+++ b/pkg/sentry/arch/arch.go
@@ -254,8 +254,6 @@ const (
// MemoryManager.
//
// Note that "highest address" below is always exclusive.
-//
-// +stateify savable
type MmapLayout struct {
// MinAddr is the lowest mappable address.
MinAddr usermem.Addr
diff --git a/pkg/sentry/arch/arch_amd64.go b/pkg/sentry/arch/arch_amd64.go
index f1e408af9..23526fe8e 100644
--- a/pkg/sentry/arch/arch_amd64.go
+++ b/pkg/sentry/arch/arch_amd64.go
@@ -95,8 +95,6 @@ const (
)
// context64 represents an AMD64 context.
-//
-// +stateify savable
type context64 struct {
State
sigFPState []x86FPState // fpstate to be restored on sigreturn.
diff --git a/pkg/sentry/arch/arch_state_x86.go b/pkg/sentry/arch/arch_state_x86.go
index e9c23a06b..cb38d098a 100644
--- a/pkg/sentry/arch/arch_state_x86.go
+++ b/pkg/sentry/arch/arch_state_x86.go
@@ -56,7 +56,6 @@ func (s *State) afterLoad() {
copy(s.x86FPState, old)
}
-// +stateify savable
type syscallPtraceRegs struct {
R15 uint64
R14 uint64
diff --git a/pkg/sentry/arch/arch_x86.go b/pkg/sentry/arch/arch_x86.go
index b35eec53c..5cc4f8377 100644
--- a/pkg/sentry/arch/arch_x86.go
+++ b/pkg/sentry/arch/arch_x86.go
@@ -153,8 +153,6 @@ func NewFloatingPointData() *FloatingPointData {
// State contains the common architecture bits for X86 (the build tag of this
// file ensures it's only built on x86).
-//
-// +stateify savable
type State struct {
// The system registers.
Regs syscall.PtraceRegs `state:".(syscallPtraceRegs)"`
diff --git a/pkg/sentry/arch/auxv.go b/pkg/sentry/arch/auxv.go
index 81cfb4a01..70e0e35b7 100644
--- a/pkg/sentry/arch/auxv.go
+++ b/pkg/sentry/arch/auxv.go
@@ -19,8 +19,6 @@ import (
)
// An AuxEntry represents an entry in an ELF auxiliary vector.
-//
-// +stateify savable
type AuxEntry struct {
Key uint64
Value usermem.Addr
diff --git a/pkg/sentry/arch/signal_amd64.go b/pkg/sentry/arch/signal_amd64.go
index e81717e8b..c1d743f38 100644
--- a/pkg/sentry/arch/signal_amd64.go
+++ b/pkg/sentry/arch/signal_amd64.go
@@ -28,8 +28,6 @@ import (
// SignalAct represents the action that should be taken when a signal is
// delivered, and is equivalent to struct sigaction on 64-bit x86.
-//
-// +stateify savable
type SignalAct struct {
Handler uint64
Flags uint64
@@ -49,8 +47,6 @@ func (s *SignalAct) DeserializeTo(other *SignalAct) {
// SignalStack represents information about a user stack, and is equivalent to
// stack_t on 64-bit x86.
-//
-// +stateify savable
type SignalStack struct {
Addr uint64
Flags uint32
@@ -70,8 +66,6 @@ func (s *SignalStack) DeserializeTo(other *SignalStack) {
// SignalInfo represents information about a signal being delivered, and is
// equivalent to struct siginfo on 64-bit x86.
-//
-// +stateify savable
type SignalInfo struct {
Signo int32 // Signal number
Errno int32 // Errno value
diff --git a/pkg/sentry/context/contexttest/BUILD b/pkg/sentry/context/contexttest/BUILD
index 01bb40b04..591b11a4d 100644
--- a/pkg/sentry/context/contexttest/BUILD
+++ b/pkg/sentry/context/contexttest/BUILD
@@ -1,11 +1,23 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "contexttest_state",
+ srcs = [
+ "contexttest.go",
+ ],
+ out = "contexttest_state.go",
+ package = "contexttest",
+)
go_library(
name = "contexttest",
testonly = 1,
- srcs = ["contexttest.go"],
+ srcs = [
+ "contexttest.go",
+ "contexttest_state.go",
+ ],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/context/contexttest",
visibility = ["//pkg/sentry:internal"],
deps = [
@@ -16,5 +28,6 @@ go_library(
"//pkg/sentry/platform",
"//pkg/sentry/platform/ptrace",
"//pkg/sentry/uniqueid",
+ "//pkg/state",
],
)
diff --git a/pkg/sentry/fs/BUILD b/pkg/sentry/fs/BUILD
index 18cd5ae8e..e3c9a9b70 100644
--- a/pkg/sentry/fs/BUILD
+++ b/pkg/sentry/fs/BUILD
@@ -1,7 +1,40 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "fs_state",
+ srcs = [
+ "attr.go",
+ "dentry.go",
+ "dirent.go",
+ "dirent_cache.go",
+ "dirent_list.go",
+ "dirent_state.go",
+ "file.go",
+ "file_overlay.go",
+ "file_state.go",
+ "filesystems.go",
+ "flags.go",
+ "inode.go",
+ "inode_inotify.go",
+ "inode_operations.go",
+ "inode_overlay.go",
+ "inotify.go",
+ "inotify_event.go",
+ "inotify_watch.go",
+ "mock.go",
+ "mount.go",
+ "mount_overlay.go",
+ "mount_state.go",
+ "mounts.go",
+ "overlay.go",
+ "path.go",
+ ],
+ out = "fs_state.go",
+ package = "fs",
+)
go_library(
name = "fs",
@@ -21,6 +54,7 @@ go_library(
"filesystems.go",
"flags.go",
"fs.go",
+ "fs_state.go",
"inode.go",
"inode_inotify.go",
"inode_operations.go",
diff --git a/pkg/sentry/fs/ashmem/BUILD b/pkg/sentry/fs/ashmem/BUILD
index dc893d22f..9f166799a 100644
--- a/pkg/sentry/fs/ashmem/BUILD
+++ b/pkg/sentry/fs/ashmem/BUILD
@@ -1,12 +1,26 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
load("//tools/go_generics:defs.bzl", "go_template_instance")
+go_stateify(
+ name = "ashmem_state",
+ srcs = [
+ "area.go",
+ "device.go",
+ "pin_board.go",
+ "uint64_range.go",
+ "uint64_set.go",
+ ],
+ out = "ashmem_state.go",
+ package = "ashmem",
+)
+
go_library(
name = "ashmem",
srcs = [
"area.go",
+ "ashmem_state.go",
"device.go",
"pin_board.go",
"uint64_range.go",
@@ -27,6 +41,7 @@ go_library(
"//pkg/sentry/platform",
"//pkg/sentry/usage",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
"//pkg/tcpip/transport/unix",
],
diff --git a/pkg/sentry/fs/ashmem/area.go b/pkg/sentry/fs/ashmem/area.go
index bfd7f2762..e4f76f0d0 100644
--- a/pkg/sentry/fs/ashmem/area.go
+++ b/pkg/sentry/fs/ashmem/area.go
@@ -39,12 +39,10 @@ const (
)
// Area implements fs.FileOperations.
-//
-// +stateify savable
type Area struct {
- fsutil.NoFsync `state:"nosave"`
- fsutil.DeprecatedFileOperations `state:"nosave"`
- fsutil.NotDirReaddir `state:"nosave"`
+ fsutil.NoFsync
+ fsutil.DeprecatedFileOperations
+ fsutil.NotDirReaddir
ad *Device
diff --git a/pkg/sentry/fs/ashmem/device.go b/pkg/sentry/fs/ashmem/device.go
index d0986fa11..c5b51d4a7 100644
--- a/pkg/sentry/fs/ashmem/device.go
+++ b/pkg/sentry/fs/ashmem/device.go
@@ -27,19 +27,17 @@ import (
)
// Device implements fs.InodeOperations.
-//
-// +stateify savable
type Device struct {
- fsutil.DeprecatedFileOperations `state:"nosave"`
- fsutil.InodeNoExtendedAttributes `state:"nosave"`
- fsutil.InodeNotDirectory `state:"nosave"`
- fsutil.InodeNotRenameable `state:"nosave"`
- fsutil.InodeNotSocket `state:"nosave"`
- fsutil.InodeNotSymlink `state:"nosave"`
- fsutil.NoFsync `state:"nosave"`
- fsutil.NoMappable `state:"nosave"`
- fsutil.NoopWriteOut `state:"nosave"`
- fsutil.NotDirReaddir `state:"nosave"`
+ fsutil.DeprecatedFileOperations
+ fsutil.InodeNoExtendedAttributes
+ fsutil.InodeNotDirectory
+ fsutil.InodeNotRenameable
+ fsutil.InodeNotSocket
+ fsutil.InodeNotSymlink
+ fsutil.NoFsync
+ fsutil.NoMappable
+ fsutil.NoopWriteOut
+ fsutil.NotDirReaddir
mu sync.Mutex `state:"nosave"`
unstable fs.UnstableAttr
diff --git a/pkg/sentry/fs/ashmem/pin_board.go b/pkg/sentry/fs/ashmem/pin_board.go
index ecba395a0..c7fb3822c 100644
--- a/pkg/sentry/fs/ashmem/pin_board.go
+++ b/pkg/sentry/fs/ashmem/pin_board.go
@@ -56,8 +56,6 @@ func (setFunctions) Split(Range, noValue, uint64) (noValue, noValue) {
// segment.Set is used for implementation where segments represent
// ranges of pinned bytes, while gaps represent ranges of unpinned
// bytes. All ranges are page-aligned.
-//
-// +stateify savable
type PinBoard struct {
Set
}
diff --git a/pkg/sentry/fs/attr.go b/pkg/sentry/fs/attr.go
index 4178f18b2..56a2ad6f7 100644
--- a/pkg/sentry/fs/attr.go
+++ b/pkg/sentry/fs/attr.go
@@ -91,8 +91,6 @@ func (n InodeType) String() string {
// StableAttr contains Inode attributes that will be stable throughout the
// lifetime of the Inode.
-//
-// +stateify savable
type StableAttr struct {
// Type is the InodeType of a InodeOperations.
Type InodeType
@@ -152,8 +150,6 @@ func IsCharDevice(s StableAttr) bool {
// UnstableAttr contains Inode attributes that may change over the lifetime
// of the Inode.
-//
-// +stateify savable
type UnstableAttr struct {
// Size is the file size in bytes.
Size int64
@@ -190,8 +186,6 @@ func WithCurrentTime(ctx context.Context, u UnstableAttr) UnstableAttr {
}
// AttrMask contains fields to mask StableAttr and UnstableAttr.
-//
-// +stateify savable
type AttrMask struct {
Type bool
DeviceID bool
@@ -233,8 +227,6 @@ func (a AttrMask) Union(b AttrMask) AttrMask {
}
// PermMask are file access permissions.
-//
-// +stateify savable
type PermMask struct {
// Read indicates reading is permitted.
Read bool
@@ -288,8 +280,6 @@ func (p PermMask) SupersetOf(other PermMask) bool {
// FilePermissions represents the permissions of a file, with
// Read/Write/Execute bits for user, group, and other.
-//
-// +stateify savable
type FilePermissions struct {
User PermMask
Group PermMask
@@ -380,8 +370,6 @@ func (f FilePermissions) AnyRead() bool {
}
// FileOwner represents ownership of a file.
-//
-// +stateify savable
type FileOwner struct {
UID auth.KUID
GID auth.KGID
diff --git a/pkg/sentry/fs/binder/BUILD b/pkg/sentry/fs/binder/BUILD
index a077b91d2..ec3928baf 100644
--- a/pkg/sentry/fs/binder/BUILD
+++ b/pkg/sentry/fs/binder/BUILD
@@ -1,16 +1,25 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "binder_state",
+ srcs = ["binder.go"],
+ out = "binder_state.go",
+ package = "binder",
+)
go_library(
name = "binder",
srcs = [
"binder.go",
+ "binder_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/binder",
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
+ "//pkg/log",
"//pkg/sentry/arch",
"//pkg/sentry/context",
"//pkg/sentry/fs",
@@ -21,6 +30,8 @@ go_library(
"//pkg/sentry/platform",
"//pkg/sentry/usage",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
+ "//pkg/tcpip/transport/unix",
],
)
diff --git a/pkg/sentry/fs/binder/binder.go b/pkg/sentry/fs/binder/binder.go
index 502a262dd..3f87b6b08 100644
--- a/pkg/sentry/fs/binder/binder.go
+++ b/pkg/sentry/fs/binder/binder.go
@@ -40,17 +40,15 @@ const (
)
// Device implements fs.InodeOperations.
-//
-// +stateify savable
type Device struct {
- fsutil.InodeNoExtendedAttributes `state:"nosave"`
- fsutil.InodeNotDirectory `state:"nosave"`
- fsutil.InodeNotRenameable `state:"nosave"`
- fsutil.InodeNotSocket `state:"nosave"`
- fsutil.InodeNotSymlink `state:"nosave"`
- fsutil.NoMappable `state:"nosave"`
- fsutil.NoopWriteOut `state:"nosave"`
- fsutil.DeprecatedFileOperations `state:"nosave"`
+ fsutil.InodeNoExtendedAttributes
+ fsutil.InodeNotDirectory
+ fsutil.InodeNotRenameable
+ fsutil.InodeNotSocket
+ fsutil.InodeNotSymlink
+ fsutil.NoMappable
+ fsutil.NoopWriteOut
+ fsutil.DeprecatedFileOperations
// mu protects unstable.
mu sync.Mutex `state:"nosave"`
@@ -188,12 +186,10 @@ func (bd *Device) StatFS(context.Context) (fs.Info, error) {
}
// Proc implements fs.FileOperations and fs.IoctlGetter.
-//
-// +stateify savable
type Proc struct {
- fsutil.NoFsync `state:"nosave"`
- fsutil.DeprecatedFileOperations `state:"nosave"`
- fsutil.NotDirReaddir `state:"nosave"`
+ fsutil.NoFsync
+ fsutil.DeprecatedFileOperations
+ fsutil.NotDirReaddir
bd *Device
task *kernel.Task
diff --git a/pkg/sentry/fs/dentry.go b/pkg/sentry/fs/dentry.go
index b347468ff..d42e8da81 100644
--- a/pkg/sentry/fs/dentry.go
+++ b/pkg/sentry/fs/dentry.go
@@ -21,8 +21,6 @@ import (
)
// DentAttr is the metadata of a directory entry. It is a subset of StableAttr.
-//
-// +stateify savable
type DentAttr struct {
// Type is the InodeType of an Inode.
Type InodeType
@@ -156,8 +154,6 @@ func GenericReaddir(ctx *DirCtx, s *SortedDentryMap) (int, error) {
}
// SortedDentryMap is a sorted map of names and fs.DentAttr entries.
-//
-// +stateify savable
type SortedDentryMap struct {
// names is always kept in sorted-order.
names []string
diff --git a/pkg/sentry/fs/dev/BUILD b/pkg/sentry/fs/dev/BUILD
index fc069bb5f..ea41615fd 100644
--- a/pkg/sentry/fs/dev/BUILD
+++ b/pkg/sentry/fs/dev/BUILD
@@ -1,11 +1,25 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "dev_state",
+ srcs = [
+ "dev.go",
+ "fs.go",
+ "full.go",
+ "null.go",
+ "random.go",
+ ],
+ out = "dev_state.go",
+ package = "dev",
+)
go_library(
name = "dev",
srcs = [
"dev.go",
+ "dev_state.go",
"device.go",
"fs.go",
"full.go",
@@ -16,6 +30,8 @@ go_library(
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
+ "//pkg/amutex",
+ "//pkg/log",
"//pkg/rand",
"//pkg/sentry/context",
"//pkg/sentry/device",
@@ -29,7 +45,9 @@ go_library(
"//pkg/sentry/mm",
"//pkg/sentry/platform",
"//pkg/sentry/safemem",
+ "//pkg/sentry/usage",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
],
)
diff --git a/pkg/sentry/fs/dev/dev.go b/pkg/sentry/fs/dev/dev.go
index 3f4f2a40a..36c61bfc2 100644
--- a/pkg/sentry/fs/dev/dev.go
+++ b/pkg/sentry/fs/dev/dev.go
@@ -27,8 +27,6 @@ import (
)
// Dev is the root node.
-//
-// +stateify savable
type Dev struct {
ramfs.Dir
}
diff --git a/pkg/sentry/fs/dev/fs.go b/pkg/sentry/fs/dev/fs.go
index 2ae49be4e..3c79f3782 100644
--- a/pkg/sentry/fs/dev/fs.go
+++ b/pkg/sentry/fs/dev/fs.go
@@ -29,8 +29,6 @@ const binderEnabledKey = "binder_enabled"
const ashmemEnabledKey = "ashmem_enabled"
// filesystem is a devtmpfs.
-//
-// +stateify savable
type filesystem struct{}
func init() {
diff --git a/pkg/sentry/fs/dev/full.go b/pkg/sentry/fs/dev/full.go
index 492b8eb3a..e13eb6c03 100644
--- a/pkg/sentry/fs/dev/full.go
+++ b/pkg/sentry/fs/dev/full.go
@@ -26,8 +26,6 @@ import (
)
// fullDevice is used to implement /dev/full.
-//
-// +stateify savable
type fullDevice struct {
ramfs.Entry
}
diff --git a/pkg/sentry/fs/dev/null.go b/pkg/sentry/fs/dev/null.go
index 2977c8670..66b8ba967 100644
--- a/pkg/sentry/fs/dev/null.go
+++ b/pkg/sentry/fs/dev/null.go
@@ -29,7 +29,6 @@ import (
"gvisor.googlesource.com/gvisor/pkg/sentry/usermem"
)
-// +stateify savable
type nullDevice struct {
ramfs.Entry
}
@@ -55,7 +54,6 @@ func (n *nullDevice) Truncate(context.Context, *fs.Inode, int64) error {
return nil
}
-// +stateify savable
type zeroDevice struct {
nullDevice
}
@@ -82,7 +80,6 @@ func (zd *zeroDevice) GetFile(ctx context.Context, dirent *fs.Dirent, flags fs.F
}), nil
}
-// +stateify savable
type zeroFileOperations struct {
fs.FileOperations
}
diff --git a/pkg/sentry/fs/dev/random.go b/pkg/sentry/fs/dev/random.go
index 47b76218f..33a045a05 100644
--- a/pkg/sentry/fs/dev/random.go
+++ b/pkg/sentry/fs/dev/random.go
@@ -24,7 +24,6 @@ import (
"gvisor.googlesource.com/gvisor/pkg/sentry/usermem"
)
-// +stateify savable
type randomDevice struct {
ramfs.Entry
}
diff --git a/pkg/sentry/fs/dirent.go b/pkg/sentry/fs/dirent.go
index 4658d044f..f9bf2fba6 100644
--- a/pkg/sentry/fs/dirent.go
+++ b/pkg/sentry/fs/dirent.go
@@ -81,8 +81,6 @@ var renameMu sync.RWMutex
//
// Dirents currently do not attempt to free entries that lack application references under
// memory pressure.
-//
-// +stateify savable
type Dirent struct {
// AtomicRefCount is our reference count.
refs.AtomicRefCount
diff --git a/pkg/sentry/fs/dirent_cache.go b/pkg/sentry/fs/dirent_cache.go
index c680e4828..e786e4f65 100644
--- a/pkg/sentry/fs/dirent_cache.go
+++ b/pkg/sentry/fs/dirent_cache.go
@@ -25,8 +25,6 @@ import (
//
// A nil DirentCache corresponds to a cache with size 0. All methods can be
// called, but nothing is actually cached.
-//
-// +stateify savable
type DirentCache struct {
// Maximum size of the cache. This must be saved manually, to handle the case
// when cache is nil.
diff --git a/pkg/sentry/fs/fdpipe/BUILD b/pkg/sentry/fs/fdpipe/BUILD
index ffe4204bc..4fcb06f1f 100644
--- a/pkg/sentry/fs/fdpipe/BUILD
+++ b/pkg/sentry/fs/fdpipe/BUILD
@@ -1,27 +1,54 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "pipe_state",
+ srcs = [
+ "pipe.go",
+ "pipe_state.go",
+ ],
+ out = "pipe_autogen_state.go",
+ imports = ["gvisor.googlesource.com/gvisor/pkg/sentry/fs"],
+ package = "fdpipe",
+)
go_library(
name = "fdpipe",
srcs = [
"pipe.go",
+ "pipe_autogen_state.go",
"pipe_opener.go",
"pipe_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/fdpipe",
- imports = ["gvisor.googlesource.com/gvisor/pkg/sentry/fs"],
visibility = ["//pkg/sentry:internal"],
deps = [
+ "//pkg/abi/linux",
+ "//pkg/amutex",
"//pkg/fd",
"//pkg/log",
+ "//pkg/metric",
+ "//pkg/p9",
+ "//pkg/refs",
"//pkg/secio",
"//pkg/sentry/context",
+ "//pkg/sentry/device",
"//pkg/sentry/fs",
"//pkg/sentry/fs/fsutil",
+ "//pkg/sentry/fs/lock",
+ "//pkg/sentry/kernel/auth",
+ "//pkg/sentry/kernel/time",
+ "//pkg/sentry/memmap",
+ "//pkg/sentry/platform",
"//pkg/sentry/safemem",
+ "//pkg/sentry/uniqueid",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
+ "//pkg/tcpip",
+ "//pkg/tcpip/transport/unix",
+ "//pkg/unet",
"//pkg/waiter",
"//pkg/waiter/fdnotifier",
],
diff --git a/pkg/sentry/fs/fdpipe/pipe.go b/pkg/sentry/fs/fdpipe/pipe.go
index 2e34604e6..7b318e35f 100644
--- a/pkg/sentry/fs/fdpipe/pipe.go
+++ b/pkg/sentry/fs/fdpipe/pipe.go
@@ -34,8 +34,6 @@ import (
)
// pipeOperations are the fs.FileOperations of a host pipe.
-//
-// +stateify savable
type pipeOperations struct {
fsutil.PipeSeek `state:"nosave"`
fsutil.NotDirReaddir `state:"nosave"`
diff --git a/pkg/sentry/fs/file.go b/pkg/sentry/fs/file.go
index 8e535a618..6d93ef760 100644
--- a/pkg/sentry/fs/file.go
+++ b/pkg/sentry/fs/file.go
@@ -47,8 +47,6 @@ const FileMaxOffset = math.MaxInt64
// and write(2).
//
// FIXME: Split synchronization from cancellation.
-//
-// +stateify savable
type File struct {
refs.AtomicRefCount
diff --git a/pkg/sentry/fs/file_overlay.go b/pkg/sentry/fs/file_overlay.go
index 113962368..36b2cf75e 100644
--- a/pkg/sentry/fs/file_overlay.go
+++ b/pkg/sentry/fs/file_overlay.go
@@ -60,8 +60,6 @@ func overlayFile(ctx context.Context, inode *Inode, flags FileFlags) (*File, err
}
// overlayFileOperations implements FileOperations for a file in an overlay.
-//
-// +stateify savable
type overlayFileOperations struct {
// upperMu protects upper below. In contrast lower is stable.
upperMu sync.Mutex `state:"nosave"`
@@ -377,8 +375,6 @@ func readdirOne(ctx context.Context, d *Dirent) (map[string]DentAttr, error) {
// overlayMappingIdentity wraps a MappingIdentity, and also holds a reference
// on a file during its lifetime.
-//
-// +stateify savable
type overlayMappingIdentity struct {
refs.AtomicRefCount
id memmap.MappingIdentity
diff --git a/pkg/sentry/fs/filesystems.go b/pkg/sentry/fs/filesystems.go
index 5a1e7a270..200e792f4 100644
--- a/pkg/sentry/fs/filesystems.go
+++ b/pkg/sentry/fs/filesystems.go
@@ -125,8 +125,6 @@ func GetFilesystems() []Filesystem {
}
// MountSourceFlags represents all mount option flags as a struct.
-//
-// +stateify savable
type MountSourceFlags struct {
// ReadOnly corresponds to mount(2)'s "MS_RDONLY" and indicates that
// the filesystem should be mounted read-only.
diff --git a/pkg/sentry/fs/filetest/BUILD b/pkg/sentry/fs/filetest/BUILD
index d137fee4c..f481c57fb 100644
--- a/pkg/sentry/fs/filetest/BUILD
+++ b/pkg/sentry/fs/filetest/BUILD
@@ -1,20 +1,34 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "filetest_state",
+ srcs = [
+ "filetest.go",
+ ],
+ out = "filetest_state.go",
+ package = "filetest",
+)
go_library(
name = "filetest",
testonly = 1,
- srcs = ["filetest.go"],
+ srcs = [
+ "filetest.go",
+ "filetest_state.go",
+ ],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/filetest",
visibility = ["//pkg/sentry:internal"],
deps = [
+ "//pkg/refs",
"//pkg/sentry/context",
"//pkg/sentry/context/contexttest",
"//pkg/sentry/fs",
"//pkg/sentry/fs/anon",
"//pkg/sentry/fs/fsutil",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/waiter",
],
)
diff --git a/pkg/sentry/fs/flags.go b/pkg/sentry/fs/flags.go
index 1aa271560..da0ff58af 100644
--- a/pkg/sentry/fs/flags.go
+++ b/pkg/sentry/fs/flags.go
@@ -19,8 +19,6 @@ import (
)
// FileFlags encodes file flags.
-//
-// +stateify savable
type FileFlags struct {
// Direct indicates that I/O should be done directly.
Direct bool
diff --git a/pkg/sentry/fs/fsutil/BUILD b/pkg/sentry/fs/fsutil/BUILD
index 3512bae6f..6eea64298 100644
--- a/pkg/sentry/fs/fsutil/BUILD
+++ b/pkg/sentry/fs/fsutil/BUILD
@@ -1,7 +1,24 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "fsutil_state",
+ srcs = [
+ "dirty_set_impl.go",
+ "file.go",
+ "file_range_set_impl.go",
+ "frame_ref_set_impl.go",
+ "handle.go",
+ "host_file_mapper.go",
+ "host_file_mapper_state.go",
+ "inode.go",
+ "inode_cached.go",
+ ],
+ out = "fsutil_state.go",
+ package = "fsutil",
+)
go_template_instance(
name = "dirty_set_impl",
@@ -67,6 +84,7 @@ go_library(
"frame_ref_set.go",
"frame_ref_set_impl.go",
"fsutil.go",
+ "fsutil_state.go",
"handle.go",
"host_file_mapper.go",
"host_file_mapper_state.go",
diff --git a/pkg/sentry/fs/fsutil/dirty_set.go b/pkg/sentry/fs/fsutil/dirty_set.go
index 8e31e48fd..9c6c98542 100644
--- a/pkg/sentry/fs/fsutil/dirty_set.go
+++ b/pkg/sentry/fs/fsutil/dirty_set.go
@@ -32,8 +32,6 @@ import (
// DirtyInfo is the value type of DirtySet, and represents information about a
// Mappable offset that is dirty (the cached data for that offset is newer than
// its source).
-//
-// +stateify savable
type DirtyInfo struct {
// Keep is true if the represented offset is concurrently writable, such
// that writing the data for that offset back to the source does not
diff --git a/pkg/sentry/fs/fsutil/handle.go b/pkg/sentry/fs/fsutil/handle.go
index e7efd3c0f..149c0f84a 100644
--- a/pkg/sentry/fs/fsutil/handle.go
+++ b/pkg/sentry/fs/fsutil/handle.go
@@ -27,8 +27,6 @@ import (
//
// FIXME: Remove Handle entirely in favor of individual fs.File
// implementations using simple generic utilities.
-//
-// +stateify savable
type Handle struct {
NoopRelease `state:"nosave"`
NoIoctl `state:"nosave"`
diff --git a/pkg/sentry/fs/fsutil/host_file_mapper.go b/pkg/sentry/fs/fsutil/host_file_mapper.go
index 9c1e2f76f..d0a27fc1c 100644
--- a/pkg/sentry/fs/fsutil/host_file_mapper.go
+++ b/pkg/sentry/fs/fsutil/host_file_mapper.go
@@ -29,8 +29,6 @@ import (
// HostFileMapper caches mappings of an arbitrary host file descriptor. It is
// used by implementations of memmap.Mappable that represent a host file
// descriptor.
-//
-// +stateify savable
type HostFileMapper struct {
// HostFile conceptually breaks the file into pieces called chunks, of
// size and alignment chunkSize, and caches mappings of the file on a chunk
diff --git a/pkg/sentry/fs/fsutil/inode.go b/pkg/sentry/fs/fsutil/inode.go
index 177396fdc..e1ad07df2 100644
--- a/pkg/sentry/fs/fsutil/inode.go
+++ b/pkg/sentry/fs/fsutil/inode.go
@@ -31,8 +31,6 @@ func NewSimpleInodeOperations(i InodeSimpleAttributes) fs.InodeOperations {
}
// simpleInodeOperations is a simple implementation of Inode.
-//
-// +stateify savable
type simpleInodeOperations struct {
DeprecatedFileOperations `state:"nosave"`
InodeNotDirectory `state:"nosave"`
@@ -50,8 +48,6 @@ type simpleInodeOperations struct {
// InodeSimpleAttributes implements a subset of the Inode interface. It provides
// read-only access to attributes.
-//
-// +stateify savable
type InodeSimpleAttributes struct {
// FSType is the filesystem type reported by StatFS.
FSType uint64
@@ -114,8 +110,6 @@ func (*InodeSimpleAttributes) Truncate(context.Context, *fs.Inode, int64) error
//
// Users need not initialize Xattrs to non-nil (it will be initialized
// when the first extended attribute is set.
-//
-// +stateify savable
type InMemoryAttributes struct {
Unstable fs.UnstableAttr
Xattrs map[string][]byte
diff --git a/pkg/sentry/fs/fsutil/inode_cached.go b/pkg/sentry/fs/fsutil/inode_cached.go
index 0a320e2d8..cba642a8f 100644
--- a/pkg/sentry/fs/fsutil/inode_cached.go
+++ b/pkg/sentry/fs/fsutil/inode_cached.go
@@ -55,8 +55,6 @@ import (
//
// Implementations of InodeOperations.WriteOut must call Sync to write out
// in-memory modifications of data and metadata to the CachedFileObject.
-//
-// +stateify savable
type CachingInodeOperations struct {
// backingFile is a handle to a cached file object.
backingFile CachedFileObject
diff --git a/pkg/sentry/fs/gofer/BUILD b/pkg/sentry/fs/gofer/BUILD
index cb17339c9..1277379e7 100644
--- a/pkg/sentry/fs/gofer/BUILD
+++ b/pkg/sentry/fs/gofer/BUILD
@@ -1,6 +1,21 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "gofer_state",
+ srcs = [
+ "file.go",
+ "file_state.go",
+ "fs.go",
+ "inode.go",
+ "inode_state.go",
+ "session.go",
+ "session_state.go",
+ ],
+ out = "gofer_state.go",
+ package = "gofer",
+)
go_library(
name = "gofer",
@@ -12,6 +27,7 @@ go_library(
"file.go",
"file_state.go",
"fs.go",
+ "gofer_state.go",
"handles.go",
"inode.go",
"inode_state.go",
@@ -25,6 +41,7 @@ go_library(
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
+ "//pkg/amutex",
"//pkg/fd",
"//pkg/log",
"//pkg/metric",
@@ -37,11 +54,15 @@ go_library(
"//pkg/sentry/fs/fdpipe",
"//pkg/sentry/fs/fsutil",
"//pkg/sentry/fs/host",
+ "//pkg/sentry/fs/lock",
"//pkg/sentry/kernel/auth",
"//pkg/sentry/kernel/time",
"//pkg/sentry/memmap",
+ "//pkg/sentry/platform",
"//pkg/sentry/safemem",
+ "//pkg/sentry/uniqueid",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
"//pkg/tcpip",
"//pkg/tcpip/transport/unix",
diff --git a/pkg/sentry/fs/gofer/file.go b/pkg/sentry/fs/gofer/file.go
index 46a6bbd5d..039618808 100644
--- a/pkg/sentry/fs/gofer/file.go
+++ b/pkg/sentry/fs/gofer/file.go
@@ -33,8 +33,6 @@ import (
var openedWX = metric.MustCreateNewUint64Metric("/gofer/opened_write_execute_file", true /* sync */, "Number of times a writable+executable file was opened from a gofer.")
// fileOperations implements fs.FileOperations for a remote file system.
-//
-// +stateify savable
type fileOperations struct {
fsutil.NoIoctl `state:"nosave"`
waiter.AlwaysReady `state:"nosave"`
diff --git a/pkg/sentry/fs/gofer/fs.go b/pkg/sentry/fs/gofer/fs.go
index 3ae93f059..dd5d43c47 100644
--- a/pkg/sentry/fs/gofer/fs.go
+++ b/pkg/sentry/fs/gofer/fs.go
@@ -83,8 +83,6 @@ var (
)
// filesystem is a 9p client.
-//
-// +stateify savable
type filesystem struct{}
func init() {
diff --git a/pkg/sentry/fs/gofer/inode.go b/pkg/sentry/fs/gofer/inode.go
index 7fc8f77b0..df584c382 100644
--- a/pkg/sentry/fs/gofer/inode.go
+++ b/pkg/sentry/fs/gofer/inode.go
@@ -35,8 +35,6 @@ import (
)
// inodeOperations implements fs.InodeOperations.
-//
-// +stateify savable
type inodeOperations struct {
fsutil.InodeNotVirtual `state:"nosave"`
fsutil.InodeNoExtendedAttributes `state:"nosave"`
@@ -70,8 +68,6 @@ type inodeOperations struct {
// circular load dependency between it and inodeOperations). Even with
// lazy loading, this approach defines the dependencies between objects
// and the expected load behavior more concretely.
-//
-// +stateify savable
type inodeFileState struct {
// s is common file system state for Gofers.
s *session `state:"wait"`
diff --git a/pkg/sentry/fs/gofer/session.go b/pkg/sentry/fs/gofer/session.go
index 648a11435..b6841526a 100644
--- a/pkg/sentry/fs/gofer/session.go
+++ b/pkg/sentry/fs/gofer/session.go
@@ -27,7 +27,6 @@ import (
"gvisor.googlesource.com/gvisor/pkg/unet"
)
-// +stateify savable
type endpointMap struct {
mu sync.RWMutex `state:"nosave"`
// TODO: Make map with private unix sockets savable.
@@ -64,8 +63,6 @@ func (e *endpointMap) get(key device.MultiDeviceKey) unix.BoundEndpoint {
}
// session holds state for each 9p session established during sys_mount.
-//
-// +stateify savable
type session struct {
refs.AtomicRefCount
diff --git a/pkg/sentry/fs/host/BUILD b/pkg/sentry/fs/host/BUILD
index 29c79284a..23ec66f50 100644
--- a/pkg/sentry/fs/host/BUILD
+++ b/pkg/sentry/fs/host/BUILD
@@ -1,6 +1,23 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "host_state",
+ srcs = [
+ "control.go",
+ "descriptor.go",
+ "descriptor_state.go",
+ "file.go",
+ "fs.go",
+ "inode.go",
+ "inode_state.go",
+ "socket.go",
+ "socket_state.go",
+ ],
+ out = "host_state.go",
+ package = "host",
+)
go_library(
name = "host",
@@ -11,6 +28,7 @@ go_library(
"device.go",
"file.go",
"fs.go",
+ "host_state.go",
"inode.go",
"inode_state.go",
"ioctl_unsafe.go",
@@ -24,6 +42,7 @@ go_library(
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
+ "//pkg/amutex",
"//pkg/fd",
"//pkg/log",
"//pkg/refs",
@@ -33,14 +52,20 @@ go_library(
"//pkg/sentry/device",
"//pkg/sentry/fs",
"//pkg/sentry/fs/fsutil",
+ "//pkg/sentry/fs/lock",
"//pkg/sentry/kernel",
"//pkg/sentry/kernel/auth",
"//pkg/sentry/kernel/time",
"//pkg/sentry/memmap",
+ "//pkg/sentry/platform",
"//pkg/sentry/safemem",
+ "//pkg/sentry/socket",
"//pkg/sentry/socket/control",
"//pkg/sentry/socket/unix",
+ "//pkg/sentry/uniqueid",
+ "//pkg/sentry/usage",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
"//pkg/tcpip",
"//pkg/tcpip/link/rawfile",
diff --git a/pkg/sentry/fs/host/descriptor.go b/pkg/sentry/fs/host/descriptor.go
index 3aee4d11c..613bd06e8 100644
--- a/pkg/sentry/fs/host/descriptor.go
+++ b/pkg/sentry/fs/host/descriptor.go
@@ -25,8 +25,6 @@ import (
)
// descriptor wraps a host fd.
-//
-// +stateify savable
type descriptor struct {
// donated is true if the host fd was donated by another process.
donated bool
diff --git a/pkg/sentry/fs/host/file.go b/pkg/sentry/fs/host/file.go
index f9bef6d93..bdf844337 100644
--- a/pkg/sentry/fs/host/file.go
+++ b/pkg/sentry/fs/host/file.go
@@ -37,8 +37,6 @@ import (
)
// fileOperations implements fs.FileOperations for a host file descriptor.
-//
-// +stateify savable
type fileOperations struct {
fsutil.NoopRelease `state:"nosave"`
diff --git a/pkg/sentry/fs/host/fs.go b/pkg/sentry/fs/host/fs.go
index e46ae433c..974700636 100644
--- a/pkg/sentry/fs/host/fs.go
+++ b/pkg/sentry/fs/host/fs.go
@@ -51,8 +51,6 @@ const maxTraversals = 10
// to lock down the configurations. This filesystem should only be mounted at root.
//
// Think twice before exposing this to applications.
-//
-// +stateify savable
type Filesystem struct {
// whitelist is a set of host paths to whitelist.
paths []string
@@ -268,10 +266,8 @@ func newMountSource(ctx context.Context, root string, mounter fs.FileOwner, file
}
// superOperations implements fs.MountSourceOperations.
-//
-// +stateify savable
type superOperations struct {
- fs.SimpleMountSourceOperations
+ fs.SimpleMountSourceOperations `state:"nosave"`
// root is the path of the mount point. All inode mappings
// are relative to this root.
diff --git a/pkg/sentry/fs/host/inode.go b/pkg/sentry/fs/host/inode.go
index 761ccde33..226bc5164 100644
--- a/pkg/sentry/fs/host/inode.go
+++ b/pkg/sentry/fs/host/inode.go
@@ -34,8 +34,6 @@ import (
// inodeOperations implements fs.InodeOperations for an fs.Inodes backed
// by a host file descriptor.
-//
-// +stateify savable
type inodeOperations struct {
fsutil.InodeNotVirtual `state:"nosave"`
fsutil.InodeNoExtendedAttributes `state:"nosave"`
@@ -67,8 +65,6 @@ type inodeOperations struct {
// circular load dependency between it and inodeOperations). Even with
// lazy loading, this approach defines the dependencies between objects
// and the expected load behavior more concretely.
-//
-// +stateify savable
type inodeFileState struct {
// Common file system state.
mops *superOperations `state:"wait"`
diff --git a/pkg/sentry/fs/inode.go b/pkg/sentry/fs/inode.go
index d0dbce5dd..6c8e6f188 100644
--- a/pkg/sentry/fs/inode.go
+++ b/pkg/sentry/fs/inode.go
@@ -28,8 +28,6 @@ import (
// Inode is a file system object that can be simultaneously referenced by different
// components of the VFS (Dirent, fs.File, etc).
-//
-// +stateify savable
type Inode struct {
// AtomicRefCount is our reference count.
refs.AtomicRefCount
@@ -60,8 +58,6 @@ type Inode struct {
// Note that in Linux fcntl(2) and flock(2) locks are _not_ cooperative, because race and
// deadlock conditions make merging them prohibitive. We do the same and keep them oblivious
// to each other but provide a "context" as a convenient container.
-//
-// +stateify savable
type LockCtx struct {
// Posix is a set of POSIX-style regional advisory locks, see fcntl(2).
Posix lock.Locks
diff --git a/pkg/sentry/fs/inode_inotify.go b/pkg/sentry/fs/inode_inotify.go
index 683140afe..358bbecdf 100644
--- a/pkg/sentry/fs/inode_inotify.go
+++ b/pkg/sentry/fs/inode_inotify.go
@@ -20,8 +20,6 @@ import (
)
// Watches is the collection of inotify watches on an inode.
-//
-// +stateify savable
type Watches struct {
// mu protects the fields below.
mu sync.RWMutex `state:"nosave"`
diff --git a/pkg/sentry/fs/inotify.go b/pkg/sentry/fs/inotify.go
index 2aabdded8..6f5e8ce5e 100644
--- a/pkg/sentry/fs/inotify.go
+++ b/pkg/sentry/fs/inotify.go
@@ -34,8 +34,6 @@ import (
//
// Lock ordering:
// Inotify.mu -> Inode.Watches.mu -> Watch.mu -> Inotify.evMu
-//
-// +stateify savable
type Inotify struct {
// Unique identifier for this inotify instance. We don't just reuse the
// inotify fd because fds can be duped. These should not be exposed to the
diff --git a/pkg/sentry/fs/inotify_event.go b/pkg/sentry/fs/inotify_event.go
index e9b5e0f56..217915ba4 100644
--- a/pkg/sentry/fs/inotify_event.go
+++ b/pkg/sentry/fs/inotify_event.go
@@ -28,8 +28,6 @@ import (
const inotifyEventBaseSize = 16
// Event represents a struct inotify_event from linux.
-//
-// +stateify savable
type Event struct {
ilist.Entry
diff --git a/pkg/sentry/fs/inotify_watch.go b/pkg/sentry/fs/inotify_watch.go
index 3e1959e83..8904ef544 100644
--- a/pkg/sentry/fs/inotify_watch.go
+++ b/pkg/sentry/fs/inotify_watch.go
@@ -27,8 +27,6 @@ import (
// holding an extra ref on each dirent known (by inotify) to point to the
// inode. These are known as pins. For a full discussion, see
// fs/g3doc/inotify.md.
-//
-// +stateify savable
type Watch struct {
// Inotify instance which owns this watch.
owner *Inotify
diff --git a/pkg/sentry/fs/lock/BUILD b/pkg/sentry/fs/lock/BUILD
index 3159ff1da..2607d7ed3 100644
--- a/pkg/sentry/fs/lock/BUILD
+++ b/pkg/sentry/fs/lock/BUILD
@@ -1,7 +1,18 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "lock_state",
+ srcs = [
+ "lock.go",
+ "lock_range.go",
+ "lock_set.go",
+ ],
+ out = "lock_state.go",
+ package = "lock",
+)
go_template_instance(
name = "lock_range",
@@ -38,11 +49,13 @@ go_library(
"lock_range.go",
"lock_set.go",
"lock_set_functions.go",
+ "lock_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/lock",
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/log",
+ "//pkg/state",
"//pkg/waiter",
],
)
diff --git a/pkg/sentry/fs/lock/lock.go b/pkg/sentry/fs/lock/lock.go
index e9b376eb6..24d54c989 100644
--- a/pkg/sentry/fs/lock/lock.go
+++ b/pkg/sentry/fs/lock/lock.go
@@ -88,8 +88,6 @@ const LockEOF = math.MaxUint64
//
// A Lock may be downgraded from a write lock to a read lock only if
// the write lock's uid is the same as the read lock.
-//
-// +stateify savable
type Lock struct {
// Readers are the set of read lock holders identified by UniqueID.
// If len(Readers) > 0 then HasWriter must be false.
@@ -105,8 +103,6 @@ type Lock struct {
}
// Locks is a thread-safe wrapper around a LockSet.
-//
-// +stateify savable
type Locks struct {
// mu protects locks below.
mu sync.Mutex `state:"nosave"`
@@ -115,7 +111,7 @@ type Locks struct {
locks LockSet
// blockedQueue is the queue of waiters that are waiting on a lock.
- blockedQueue waiter.Queue `state:"zerovalue"`
+ blockedQueue waiter.Queue
}
// Blocker is the interface used for blocking locks. Passing a nil Blocker
diff --git a/pkg/sentry/fs/mount.go b/pkg/sentry/fs/mount.go
index 4ede767f9..eb1897174 100644
--- a/pkg/sentry/fs/mount.go
+++ b/pkg/sentry/fs/mount.go
@@ -101,8 +101,6 @@ func (i InodeMappings) String() string {
// (e.g. cannot be mounted at different locations).
//
// TODO: Move mount-specific information out of MountSource.
-//
-// +stateify savable
type MountSource struct {
refs.AtomicRefCount
@@ -262,8 +260,6 @@ func NewNonCachingMountSource(filesystem Filesystem, flags MountSourceFlags) *Mo
}
// SimpleMountSourceOperations implements MountSourceOperations.
-//
-// +stateify savable
type SimpleMountSourceOperations struct {
keep bool
}
diff --git a/pkg/sentry/fs/mount_overlay.go b/pkg/sentry/fs/mount_overlay.go
index d135e8a37..1be81e3a1 100644
--- a/pkg/sentry/fs/mount_overlay.go
+++ b/pkg/sentry/fs/mount_overlay.go
@@ -18,8 +18,6 @@ import "gvisor.googlesource.com/gvisor/pkg/sentry/context"
// overlayMountSourceOperations implements MountSourceOperations for an overlay
// mount point.
-//
-// +stateify savable
type overlayMountSourceOperations struct {
upper *MountSource
lower *MountSource
@@ -74,8 +72,6 @@ func (o *overlayMountSourceOperations) Destroy() {
}
// type overlayFilesystem is the filesystem for overlay mounts.
-//
-// +stateify savable
type overlayFilesystem struct{}
// Name implements Filesystem.Name.
diff --git a/pkg/sentry/fs/mounts.go b/pkg/sentry/fs/mounts.go
index 144d3427d..87da4ee0e 100644
--- a/pkg/sentry/fs/mounts.go
+++ b/pkg/sentry/fs/mounts.go
@@ -32,8 +32,6 @@ import (
const DefaultTraversalLimit = 10
// MountNamespace defines a collection of mounts.
-//
-// +stateify savable
type MountNamespace struct {
refs.AtomicRefCount
diff --git a/pkg/sentry/fs/overlay.go b/pkg/sentry/fs/overlay.go
index af13dc8c7..7357d6401 100644
--- a/pkg/sentry/fs/overlay.go
+++ b/pkg/sentry/fs/overlay.go
@@ -145,8 +145,6 @@ func newOverlayInode(ctx context.Context, o *overlayEntry, msrc *MountSource) *I
}
// overlayEntry is the overlay metadata of an Inode. It implements Mappable.
-//
-// +stateify savable
type overlayEntry struct {
// lowerExists is true if an Inode exists for this file in the lower
// filesystem. If lowerExists is true, then the overlay must create
diff --git a/pkg/sentry/fs/proc/BUILD b/pkg/sentry/fs/proc/BUILD
index 2d9f07f2f..870df47b2 100644
--- a/pkg/sentry/fs/proc/BUILD
+++ b/pkg/sentry/fs/proc/BUILD
@@ -1,6 +1,32 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "proc_state",
+ srcs = [
+ "cpuinfo.go",
+ "exec_args.go",
+ "fds.go",
+ "file.go",
+ "filesystems.go",
+ "fs.go",
+ "loadavg.go",
+ "meminfo.go",
+ "mounts.go",
+ "net.go",
+ "proc.go",
+ "stat.go",
+ "sys.go",
+ "sys_net.go",
+ "task.go",
+ "uid_gid_map.go",
+ "uptime.go",
+ "version.go",
+ ],
+ out = "proc_state.go",
+ package = "proc",
+)
go_library(
name = "proc",
@@ -16,6 +42,7 @@ go_library(
"mounts.go",
"net.go",
"proc.go",
+ "proc_state.go",
"rpcinet_proc.go",
"stat.go",
"sys.go",
@@ -29,6 +56,9 @@ go_library(
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
+ "//pkg/amutex",
+ "//pkg/log",
+ "//pkg/sentry/arch",
"//pkg/sentry/context",
"//pkg/sentry/fs",
"//pkg/sentry/fs/proc/device",
@@ -43,6 +73,8 @@ go_library(
"//pkg/sentry/socket/rpcinet",
"//pkg/sentry/usage",
"//pkg/sentry/usermem",
+ "//pkg/state",
+ "//pkg/syserr",
"//pkg/syserror",
],
)
diff --git a/pkg/sentry/fs/proc/cpuinfo.go b/pkg/sentry/fs/proc/cpuinfo.go
index 4dfec03a4..f80aaa5b1 100644
--- a/pkg/sentry/fs/proc/cpuinfo.go
+++ b/pkg/sentry/fs/proc/cpuinfo.go
@@ -27,8 +27,6 @@ import (
// cpuinfo is a file describing the CPU capabilities.
//
// Presently cpuinfo never changes, so it doesn't need to be a SeqFile.
-//
-// +stateify savable
type cpuinfo struct {
ramfs.Entry
diff --git a/pkg/sentry/fs/proc/exec_args.go b/pkg/sentry/fs/proc/exec_args.go
index a69cbaa0e..0e1523bf1 100644
--- a/pkg/sentry/fs/proc/exec_args.go
+++ b/pkg/sentry/fs/proc/exec_args.go
@@ -37,8 +37,6 @@ const (
// execArgFile is a file containing the exec args (either cmdline or environ)
// for a given task.
-//
-// +stateify savable
type execArgFile struct {
ramfs.Entry
diff --git a/pkg/sentry/fs/proc/fds.go b/pkg/sentry/fs/proc/fds.go
index cca8f874c..194a9c12a 100644
--- a/pkg/sentry/fs/proc/fds.go
+++ b/pkg/sentry/fs/proc/fds.go
@@ -138,8 +138,6 @@ func (f *fd) Close() error {
}
// fdDir implements /proc/TID/fd.
-//
-// +stateify savable
type fdDir struct {
ramfs.Dir
@@ -199,8 +197,6 @@ func (f *fdDir) DeprecatedReaddir(ctx context.Context, dirCtx *fs.DirCtx, offset
}
// fdInfo is a single file in /proc/TID/fdinfo/.
-//
-// +stateify savable
type fdInfo struct {
ramfs.File
@@ -233,8 +229,6 @@ func (*fdInfo) Truncate(ctx context.Context, inode *fs.Inode, size int64) error
// fdInfoDir implements /proc/TID/fdinfo. It embeds an fdDir, but overrides
// Lookup and Readdir.
-//
-// +stateify savable
type fdInfoDir struct {
ramfs.Dir
diff --git a/pkg/sentry/fs/proc/file.go b/pkg/sentry/fs/proc/file.go
index 4b2d08e75..9a433cdf8 100644
--- a/pkg/sentry/fs/proc/file.go
+++ b/pkg/sentry/fs/proc/file.go
@@ -22,7 +22,6 @@ import (
"gvisor.googlesource.com/gvisor/pkg/sentry/usermem"
)
-// +stateify savable
type file struct {
fs.InodeOperations
diff --git a/pkg/sentry/fs/proc/filesystems.go b/pkg/sentry/fs/proc/filesystems.go
index 49b92fd8a..37db9cf9c 100644
--- a/pkg/sentry/fs/proc/filesystems.go
+++ b/pkg/sentry/fs/proc/filesystems.go
@@ -24,8 +24,6 @@ import (
)
// filesystemsData backs /proc/filesystems.
-//
-// +stateify savable
type filesystemsData struct{}
// NeedsUpdate returns true on the first generation. The set of registered file
diff --git a/pkg/sentry/fs/proc/fs.go b/pkg/sentry/fs/proc/fs.go
index 061824b8c..3aadd6ac4 100644
--- a/pkg/sentry/fs/proc/fs.go
+++ b/pkg/sentry/fs/proc/fs.go
@@ -22,8 +22,6 @@ import (
)
// filesystem is a procfs.
-//
-// +stateify savable
type filesystem struct{}
func init() {
diff --git a/pkg/sentry/fs/proc/loadavg.go b/pkg/sentry/fs/proc/loadavg.go
index 6fac251d2..7583b6ccd 100644
--- a/pkg/sentry/fs/proc/loadavg.go
+++ b/pkg/sentry/fs/proc/loadavg.go
@@ -23,8 +23,6 @@ import (
)
// loadavgData backs /proc/loadavg.
-//
-// +stateify savable
type loadavgData struct{}
// NeedsUpdate implements seqfile.SeqSource.NeedsUpdate.
diff --git a/pkg/sentry/fs/proc/meminfo.go b/pkg/sentry/fs/proc/meminfo.go
index 53dfd59ef..49cb0faed 100644
--- a/pkg/sentry/fs/proc/meminfo.go
+++ b/pkg/sentry/fs/proc/meminfo.go
@@ -26,8 +26,6 @@ import (
)
// meminfoData backs /proc/meminfo.
-//
-// +stateify savable
type meminfoData struct {
// k is the owning Kernel.
k *kernel.Kernel
diff --git a/pkg/sentry/fs/proc/mounts.go b/pkg/sentry/fs/proc/mounts.go
index 2b8167c28..108432f4e 100644
--- a/pkg/sentry/fs/proc/mounts.go
+++ b/pkg/sentry/fs/proc/mounts.go
@@ -71,8 +71,6 @@ func forEachMountSource(t *kernel.Task, fn func(string, *fs.MountSource)) {
}
// mountInfoFile is used to implement /proc/[pid]/mountinfo.
-//
-// +stateify savable
type mountInfoFile struct {
t *kernel.Task
}
@@ -154,8 +152,6 @@ func (mif *mountInfoFile) ReadSeqFileData(ctx context.Context, handle seqfile.Se
}
// mountsFile is used to implement /proc/[pid]/mountinfo.
-//
-// +stateify savable
type mountsFile struct {
t *kernel.Task
}
diff --git a/pkg/sentry/fs/proc/proc.go b/pkg/sentry/fs/proc/proc.go
index 07029a7bb..b2a8d639c 100644
--- a/pkg/sentry/fs/proc/proc.go
+++ b/pkg/sentry/fs/proc/proc.go
@@ -33,8 +33,6 @@ import (
)
// proc is a root proc node.
-//
-// +stateify savable
type proc struct {
ramfs.Dir
@@ -49,8 +47,6 @@ type proc struct {
// stubProcFSFile is a file type that can be used to return file contents
// which are constant. This file is not writable and will always have mode
// 0444.
-//
-// +stateify savable
type stubProcFSFile struct {
ramfs.Entry
diff --git a/pkg/sentry/fs/proc/seqfile/BUILD b/pkg/sentry/fs/proc/seqfile/BUILD
index 53c475652..c84f7e20d 100644
--- a/pkg/sentry/fs/proc/seqfile/BUILD
+++ b/pkg/sentry/fs/proc/seqfile/BUILD
@@ -1,10 +1,22 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "seqfile_state",
+ srcs = [
+ "seqfile.go",
+ ],
+ out = "seqfile_state.go",
+ package = "seqfile",
+)
go_library(
name = "seqfile",
- srcs = ["seqfile.go"],
+ srcs = [
+ "seqfile.go",
+ "seqfile_state.go",
+ ],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/proc/seqfile",
visibility = ["//pkg/sentry:internal"],
deps = [
@@ -14,16 +26,26 @@ go_library(
"//pkg/sentry/fs/ramfs",
"//pkg/sentry/kernel/time",
"//pkg/sentry/usermem",
+ "//pkg/state",
],
)
+go_stateify(
+ name = "seqfile_test_state",
+ srcs = ["seqfile_test.go"],
+ out = "seqfile_test_state.go",
+ package = "seqfile",
+)
+
go_test(
name = "seqfile_test",
size = "small",
- srcs = ["seqfile_test.go"],
+ srcs = [
+ "seqfile_test.go",
+ "seqfile_test_state.go",
+ ],
embed = [":seqfile"],
deps = [
- "//pkg/sentry/context",
"//pkg/sentry/context/contexttest",
"//pkg/sentry/fs",
"//pkg/sentry/fs/ramfs/test",
diff --git a/pkg/sentry/fs/proc/seqfile/seqfile.go b/pkg/sentry/fs/proc/seqfile/seqfile.go
index 51cae5e37..c08565f8a 100644
--- a/pkg/sentry/fs/proc/seqfile/seqfile.go
+++ b/pkg/sentry/fs/proc/seqfile/seqfile.go
@@ -30,8 +30,6 @@ import (
type SeqHandle interface{}
// SeqData holds the data for one unit in the file.
-//
-// +stateify savable
type SeqData struct {
// The data to be returned to the user.
Buf []byte
@@ -84,8 +82,6 @@ func (s *SeqGenerationCounter) IsCurrent(generation int64) bool {
}
// SeqFile is used to provide dynamic files that can be ordered by record.
-//
-// +stateify savable
type SeqFile struct {
ramfs.Entry
diff --git a/pkg/sentry/fs/proc/stat.go b/pkg/sentry/fs/proc/stat.go
index bf7650211..284f3e52b 100644
--- a/pkg/sentry/fs/proc/stat.go
+++ b/pkg/sentry/fs/proc/stat.go
@@ -25,8 +25,6 @@ import (
)
// statData backs /proc/stat.
-//
-// +stateify savable
type statData struct {
// k is the owning Kernel.
k *kernel.Kernel
diff --git a/pkg/sentry/fs/proc/sys.go b/pkg/sentry/fs/proc/sys.go
index a2d36ca23..aab891c53 100644
--- a/pkg/sentry/fs/proc/sys.go
+++ b/pkg/sentry/fs/proc/sys.go
@@ -28,8 +28,6 @@ import (
)
// hostname is a file containing the system hostname.
-//
-// +stateify savable
type hostname struct {
ramfs.Entry
}
@@ -54,8 +52,6 @@ func (p *proc) newHostname(ctx context.Context, msrc *fs.MountSource) *fs.Inode
}
// mmapMinAddrData backs /proc/sys/vm/mmap_min_addr.
-//
-// +stateify savable
type mmapMinAddrData struct {
k *kernel.Kernel
}
@@ -78,7 +74,6 @@ func (d *mmapMinAddrData) ReadSeqFileData(ctx context.Context, h seqfile.SeqHand
}, 0
}
-// +stateify savable
type overcommitMemory struct{}
func (*overcommitMemory) NeedsUpdate(generation int64) bool {
diff --git a/pkg/sentry/fs/proc/sys_net.go b/pkg/sentry/fs/proc/sys_net.go
index beb25be20..f3a5043f8 100644
--- a/pkg/sentry/fs/proc/sys_net.go
+++ b/pkg/sentry/fs/proc/sys_net.go
@@ -33,7 +33,6 @@ const (
tcpWMem
)
-// +stateify savable
type tcpMem struct {
ramfs.Entry
s inet.Stack
@@ -101,7 +100,6 @@ func (m *tcpMem) DeprecatedPwritev(ctx context.Context, src usermem.IOSequence,
return n, cperr
}
-// +stateify savable
type tcpSack struct {
ramfs.Entry
s inet.Stack
diff --git a/pkg/sentry/fs/proc/task.go b/pkg/sentry/fs/proc/task.go
index 748ca4320..efc635946 100644
--- a/pkg/sentry/fs/proc/task.go
+++ b/pkg/sentry/fs/proc/task.go
@@ -52,8 +52,6 @@ func getTaskMM(t *kernel.Task) (*mm.MemoryManager, error) {
}
// taskDir represents a task-level directory.
-//
-// +stateify savable
type taskDir struct {
ramfs.Dir
@@ -94,8 +92,6 @@ func newTaskDir(t *kernel.Task, msrc *fs.MountSource, pidns *kernel.PIDNamespace
}
// subtasks represents a /proc/TID/task directory.
-//
-// +stateify savable
type subtasks struct {
ramfs.Dir
@@ -171,8 +167,6 @@ func (s *subtasks) DeprecatedReaddir(ctx context.Context, dirCtx *fs.DirCtx, off
}
// exe is an fs.InodeOperations symlink for the /proc/PID/exe file.
-//
-// +stateify savable
type exe struct {
ramfs.Symlink
@@ -232,8 +226,6 @@ func (e *exe) Readlink(ctx context.Context, inode *fs.Inode) (string, error) {
// namespaceFile represents a file in the namespacefs, such as the files in
// /proc/<pid>/ns.
-//
-// +stateify savable
type namespaceFile struct {
ramfs.Symlink
@@ -282,8 +274,6 @@ func newNamespaceDir(t *kernel.Task, msrc *fs.MountSource) *fs.Inode {
}
// mapsData implements seqfile.SeqSource for /proc/[pid]/maps.
-//
-// +stateify savable
type mapsData struct {
t *kernel.Task
}
@@ -321,7 +311,6 @@ func (md *mapsData) ReadSeqFileData(ctx context.Context, h seqfile.SeqHandle) ([
return []seqfile.SeqData{}, 0
}
-// +stateify savable
type taskStatData struct {
t *kernel.Task
@@ -402,8 +391,6 @@ func (s *taskStatData) ReadSeqFileData(ctx context.Context, h seqfile.SeqHandle)
}
// statmData implements seqfile.SeqSource for /proc/[pid]/statm.
-//
-// +stateify savable
type statmData struct {
t *kernel.Task
}
@@ -438,8 +425,6 @@ func (s *statmData) ReadSeqFileData(ctx context.Context, h seqfile.SeqHandle) ([
}
// statusData implements seqfile.SeqSource for /proc/[pid]/status.
-//
-// +stateify savable
type statusData struct {
t *kernel.Task
pidns *kernel.PIDNamespace
@@ -505,7 +490,6 @@ type ioUsage interface {
IOUsage() *usage.IO
}
-// +stateify savable
type ioData struct {
ioUsage
}
@@ -546,8 +530,6 @@ func (i *ioData) ReadSeqFileData(ctx context.Context, h seqfile.SeqHandle) ([]se
// On Linux, /proc/[pid]/comm is writable, and writing to the comm file changes
// the thread name. We don't implement this yet as there are no known users of
// this feature.
-//
-// +stateify savable
type comm struct {
ramfs.Entry
@@ -577,8 +559,6 @@ func (c *comm) DeprecatedPreadv(ctx context.Context, dst usermem.IOSequence, off
}
// auxvec is a file containing the auxiliary vector for a task.
-//
-// +stateify savable
type auxvec struct {
ramfs.Entry
diff --git a/pkg/sentry/fs/proc/uid_gid_map.go b/pkg/sentry/fs/proc/uid_gid_map.go
index 9811d9c9d..85acb5163 100644
--- a/pkg/sentry/fs/proc/uid_gid_map.go
+++ b/pkg/sentry/fs/proc/uid_gid_map.go
@@ -29,8 +29,6 @@ import (
// An idMapSeqSource is a seqfile.SeqSource that returns UID or GID mappings
// from a task's user namespace.
-//
-// +stateify savable
type idMapSeqSource struct {
t *kernel.Task
gids bool
@@ -72,7 +70,6 @@ type idMapSeqHandle struct {
value int
}
-// +stateify savable
type idMapSeqFile struct {
seqfile.SeqFile
}
diff --git a/pkg/sentry/fs/proc/uptime.go b/pkg/sentry/fs/proc/uptime.go
index f3a9b81df..4679d5821 100644
--- a/pkg/sentry/fs/proc/uptime.go
+++ b/pkg/sentry/fs/proc/uptime.go
@@ -27,8 +27,6 @@ import (
)
// uptime is a file containing the system uptime.
-//
-// +stateify savable
type uptime struct {
ramfs.Entry
diff --git a/pkg/sentry/fs/proc/version.go b/pkg/sentry/fs/proc/version.go
index 00f6a2afd..c0f2e87e3 100644
--- a/pkg/sentry/fs/proc/version.go
+++ b/pkg/sentry/fs/proc/version.go
@@ -23,8 +23,6 @@ import (
)
// versionData backs /proc/version.
-//
-// +stateify savable
type versionData struct {
// k is the owning Kernel.
k *kernel.Kernel
diff --git a/pkg/sentry/fs/ramfs/BUILD b/pkg/sentry/fs/ramfs/BUILD
index 5230157fe..d84f2c624 100644
--- a/pkg/sentry/fs/ramfs/BUILD
+++ b/pkg/sentry/fs/ramfs/BUILD
@@ -1,6 +1,19 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "ramfs_state",
+ srcs = [
+ "dir.go",
+ "file.go",
+ "ramfs.go",
+ "socket.go",
+ "symlink.go",
+ ],
+ out = "ramfs_state.go",
+ package = "ramfs",
+)
go_library(
name = "ramfs",
@@ -8,6 +21,7 @@ go_library(
"dir.go",
"file.go",
"ramfs.go",
+ "ramfs_state.go",
"socket.go",
"symlink.go",
"tree.go",
@@ -15,8 +29,12 @@ go_library(
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/ramfs",
visibility = ["//pkg/sentry:internal"],
deps = [
+ "//pkg/amutex",
+ "//pkg/log",
+ "//pkg/refs",
"//pkg/secio",
"//pkg/sentry/context",
+ "//pkg/sentry/device",
"//pkg/sentry/fs",
"//pkg/sentry/fs/anon",
"//pkg/sentry/fs/fsutil",
@@ -24,6 +42,7 @@ go_library(
"//pkg/sentry/memmap",
"//pkg/sentry/safemem",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
"//pkg/tcpip/transport/unix",
"//pkg/waiter",
diff --git a/pkg/sentry/fs/ramfs/dir.go b/pkg/sentry/fs/ramfs/dir.go
index 04432f28c..19d5612ed 100644
--- a/pkg/sentry/fs/ramfs/dir.go
+++ b/pkg/sentry/fs/ramfs/dir.go
@@ -44,8 +44,6 @@ type CreateOps struct {
}
// Dir represents a single directory in the filesystem.
-//
-// +stateify savable
type Dir struct {
Entry
diff --git a/pkg/sentry/fs/ramfs/ramfs.go b/pkg/sentry/fs/ramfs/ramfs.go
index 13e72e775..d6cfaf753 100644
--- a/pkg/sentry/fs/ramfs/ramfs.go
+++ b/pkg/sentry/fs/ramfs/ramfs.go
@@ -60,8 +60,6 @@ var (
// Entry represents common internal state for file and directory nodes.
// This may be used by other packages to easily create ramfs files.
-//
-// +stateify savable
type Entry struct {
waiter.AlwaysReady `state:"nosave"`
fsutil.NoMappable `state:"nosave"`
diff --git a/pkg/sentry/fs/ramfs/socket.go b/pkg/sentry/fs/ramfs/socket.go
index 93427a1ff..b0c79325f 100644
--- a/pkg/sentry/fs/ramfs/socket.go
+++ b/pkg/sentry/fs/ramfs/socket.go
@@ -21,8 +21,6 @@ import (
)
// Socket represents a socket.
-//
-// +stateify savable
type Socket struct {
Entry
diff --git a/pkg/sentry/fs/ramfs/symlink.go b/pkg/sentry/fs/ramfs/symlink.go
index 1c54d9991..9bbf78619 100644
--- a/pkg/sentry/fs/ramfs/symlink.go
+++ b/pkg/sentry/fs/ramfs/symlink.go
@@ -22,8 +22,6 @@ import (
)
// Symlink represents a symlink.
-//
-// +stateify savable
type Symlink struct {
Entry
diff --git a/pkg/sentry/fs/ramfs/test/BUILD b/pkg/sentry/fs/ramfs/test/BUILD
index 187eac49d..57fee45e2 100644
--- a/pkg/sentry/fs/ramfs/test/BUILD
+++ b/pkg/sentry/fs/ramfs/test/BUILD
@@ -1,16 +1,30 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "test_state",
+ srcs = [
+ "test.go",
+ ],
+ out = "test_state.go",
+ package = "test",
+)
go_library(
name = "test",
testonly = 1,
- srcs = ["test.go"],
+ srcs = [
+ "test.go",
+ "test_state.go",
+ ],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/ramfs/test",
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/sentry/context",
+ "//pkg/sentry/device",
"//pkg/sentry/fs",
"//pkg/sentry/fs/ramfs",
+ "//pkg/state",
],
)
diff --git a/pkg/sentry/fs/sys/BUILD b/pkg/sentry/fs/sys/BUILD
index bc24e980e..095ff1f25 100644
--- a/pkg/sentry/fs/sys/BUILD
+++ b/pkg/sentry/fs/sys/BUILD
@@ -1,6 +1,16 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "sys_state",
+ srcs = [
+ "fs.go",
+ "sys.go",
+ ],
+ out = "sys_state.go",
+ package = "sys",
+)
go_library(
name = "sys",
@@ -8,6 +18,7 @@ go_library(
"device.go",
"fs.go",
"sys.go",
+ "sys_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/sys",
visibility = ["//pkg/sentry:internal"],
@@ -17,5 +28,6 @@ go_library(
"//pkg/sentry/fs",
"//pkg/sentry/fs/ramfs",
"//pkg/sentry/usermem",
+ "//pkg/state",
],
)
diff --git a/pkg/sentry/fs/sys/fs.go b/pkg/sentry/fs/sys/fs.go
index 625525540..c6d5f7fd8 100644
--- a/pkg/sentry/fs/sys/fs.go
+++ b/pkg/sentry/fs/sys/fs.go
@@ -20,8 +20,6 @@ import (
)
// filesystem is a sysfs.
-//
-// +stateify savable
type filesystem struct{}
func init() {
diff --git a/pkg/sentry/fs/sys/sys.go b/pkg/sentry/fs/sys/sys.go
index b9b2fb4a1..ccf56f644 100644
--- a/pkg/sentry/fs/sys/sys.go
+++ b/pkg/sentry/fs/sys/sys.go
@@ -22,13 +22,12 @@ import (
"gvisor.googlesource.com/gvisor/pkg/sentry/usermem"
)
-// +stateify savable
-type dir struct {
+type Dir struct {
ramfs.Dir
}
func newDir(ctx context.Context, msrc *fs.MountSource, contents map[string]*fs.Inode) *fs.Inode {
- d := &dir{}
+ d := &Dir{}
d.InitDir(ctx, contents, fs.RootOwner, fs.FilePermsFromMode(0555))
return fs.NewInode(d, msrc, fs.StableAttr{
DeviceID: sysfsDevice.DeviceID(),
diff --git a/pkg/sentry/fs/timerfd/BUILD b/pkg/sentry/fs/timerfd/BUILD
index ffdd7e0dc..8b1b7872e 100644
--- a/pkg/sentry/fs/timerfd/BUILD
+++ b/pkg/sentry/fs/timerfd/BUILD
@@ -1,19 +1,33 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "timerfd_state",
+ srcs = [
+ "timerfd.go",
+ ],
+ out = "timerfd_state.go",
+ package = "timerfd",
+)
go_library(
name = "timerfd",
- srcs = ["timerfd.go"],
+ srcs = [
+ "timerfd.go",
+ "timerfd_state.go",
+ ],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/timerfd",
visibility = ["//pkg/sentry:internal"],
deps = [
+ "//pkg/refs",
"//pkg/sentry/context",
"//pkg/sentry/fs",
"//pkg/sentry/fs/anon",
"//pkg/sentry/fs/fsutil",
"//pkg/sentry/kernel/time",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
"//pkg/waiter",
],
diff --git a/pkg/sentry/fs/timerfd/timerfd.go b/pkg/sentry/fs/timerfd/timerfd.go
index 767db95a0..ae58f6fd7 100644
--- a/pkg/sentry/fs/timerfd/timerfd.go
+++ b/pkg/sentry/fs/timerfd/timerfd.go
@@ -30,8 +30,6 @@ import (
)
// TimerOperations implements fs.FileOperations for timerfds.
-//
-// +stateify savable
type TimerOperations struct {
fsutil.ZeroSeek `state:"nosave"`
fsutil.NotDirReaddir `state:"nosave"`
@@ -40,7 +38,7 @@ type TimerOperations struct {
fsutil.NoMMap `state:"nosave"`
fsutil.NoIoctl `state:"nosave"`
- events waiter.Queue `state:"zerovalue"`
+ events waiter.Queue `state:"nosave"`
timer *ktime.Timer
// val is the number of timer expirations since the last successful call to
diff --git a/pkg/sentry/fs/tmpfs/BUILD b/pkg/sentry/fs/tmpfs/BUILD
index cfe11ab02..473ab4296 100644
--- a/pkg/sentry/fs/tmpfs/BUILD
+++ b/pkg/sentry/fs/tmpfs/BUILD
@@ -1,6 +1,18 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "tmpfs_state",
+ srcs = [
+ "file_regular.go",
+ "fs.go",
+ "inode_file.go",
+ "tmpfs.go",
+ ],
+ out = "tmpfs_state.go",
+ package = "tmpfs",
+)
go_library(
name = "tmpfs",
@@ -10,11 +22,13 @@ go_library(
"fs.go",
"inode_file.go",
"tmpfs.go",
+ "tmpfs_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/tmpfs",
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
+ "//pkg/log",
"//pkg/sentry/context",
"//pkg/sentry/device",
"//pkg/sentry/fs",
@@ -27,6 +41,7 @@ go_library(
"//pkg/sentry/safemem",
"//pkg/sentry/usage",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/tcpip/transport/unix",
"//pkg/waiter",
],
diff --git a/pkg/sentry/fs/tmpfs/file_regular.go b/pkg/sentry/fs/tmpfs/file_regular.go
index 342688f81..9811d90bc 100644
--- a/pkg/sentry/fs/tmpfs/file_regular.go
+++ b/pkg/sentry/fs/tmpfs/file_regular.go
@@ -25,8 +25,6 @@ import (
// regularFileOperations implements fs.FileOperations for a regular
// tmpfs file.
-//
-// +stateify savable
type regularFileOperations struct {
waiter.AlwaysReady `state:"nosave"`
fsutil.NoopRelease `state:"nosave"`
diff --git a/pkg/sentry/fs/tmpfs/fs.go b/pkg/sentry/fs/tmpfs/fs.go
index ca620e65e..5bd9ade52 100644
--- a/pkg/sentry/fs/tmpfs/fs.go
+++ b/pkg/sentry/fs/tmpfs/fs.go
@@ -47,8 +47,6 @@ const (
var modeRegexp = regexp.MustCompile("0[0-7][0-7][0-7]")
// Filesystem is a tmpfs.
-//
-// +stateify savable
type Filesystem struct{}
func init() {
diff --git a/pkg/sentry/fs/tmpfs/inode_file.go b/pkg/sentry/fs/tmpfs/inode_file.go
index 1e4fe47d2..4e803c9ff 100644
--- a/pkg/sentry/fs/tmpfs/inode_file.go
+++ b/pkg/sentry/fs/tmpfs/inode_file.go
@@ -43,8 +43,6 @@ import (
// include an InvalidatorRegion associated with that reference. When the
// referenced portion of the file is removed (with Truncate), the associated
// InvalidatorRegion is invalidated.
-//
-// +stateify savable
type fileInodeOperations struct {
fsutil.DeprecatedFileOperations `state:"nosave"`
fsutil.InodeNotDirectory `state:"nosave"`
diff --git a/pkg/sentry/fs/tmpfs/tmpfs.go b/pkg/sentry/fs/tmpfs/tmpfs.go
index 10cb5451d..1cc7ae491 100644
--- a/pkg/sentry/fs/tmpfs/tmpfs.go
+++ b/pkg/sentry/fs/tmpfs/tmpfs.go
@@ -49,8 +49,6 @@ func rename(ctx context.Context, oldParent *fs.Inode, oldName string, newParent
}
// Dir is a directory.
-//
-// +stateify savable
type Dir struct {
ramfs.Dir
@@ -124,8 +122,6 @@ func (*Dir) StatFS(context.Context) (fs.Info, error) {
}
// Symlink is a symlink.
-//
-// +stateify savable
type Symlink struct {
ramfs.Symlink
}
@@ -153,8 +149,6 @@ func (s *Symlink) StatFS(context.Context) (fs.Info, error) {
}
// Socket is a socket.
-//
-// +stateify savable
type Socket struct {
ramfs.Socket
}
@@ -182,8 +176,6 @@ func (s *Socket) StatFS(context.Context) (fs.Info, error) {
}
// Fifo is a tmpfs named pipe.
-//
-// +stateify savable
type Fifo struct {
ramfs.Entry
}
diff --git a/pkg/sentry/fs/tty/BUILD b/pkg/sentry/fs/tty/BUILD
index 3c446eef4..363897b2c 100644
--- a/pkg/sentry/fs/tty/BUILD
+++ b/pkg/sentry/fs/tty/BUILD
@@ -1,6 +1,22 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "tty_state",
+ srcs = [
+ "dir.go",
+ "fs.go",
+ "inode.go",
+ "line_discipline.go",
+ "master.go",
+ "queue.go",
+ "slave.go",
+ "terminal.go",
+ ],
+ out = "tty_state.go",
+ package = "tty",
+)
go_library(
name = "tty",
@@ -13,6 +29,7 @@ go_library(
"queue.go",
"slave.go",
"terminal.go",
+ "tty_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/fs/tty",
visibility = ["//pkg/sentry:internal"],
@@ -27,6 +44,7 @@ go_library(
"//pkg/sentry/kernel/auth",
"//pkg/sentry/kernel/time",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
"//pkg/tcpip/transport/unix",
"//pkg/waiter",
diff --git a/pkg/sentry/fs/tty/dir.go b/pkg/sentry/fs/tty/dir.go
index c91091db4..2c5b2aed6 100644
--- a/pkg/sentry/fs/tty/dir.go
+++ b/pkg/sentry/fs/tty/dir.go
@@ -49,16 +49,14 @@ import (
// corresponding Dirents hold on their parent (this directory).
//
// dirInodeOperations implements fs.InodeOperations.
-//
-// +stateify savable
type dirInodeOperations struct {
- fsutil.DeprecatedFileOperations `state:"nosave"`
- fsutil.InodeNotSocket `state:"nosave"`
- fsutil.InodeNotRenameable `state:"nosave"`
- fsutil.InodeNotSymlink `state:"nosave"`
- fsutil.InodeNoExtendedAttributes `state:"nosave"`
- fsutil.NoMappable `state:"nosave"`
- fsutil.NoopWriteOut `state:"nosave"`
+ fsutil.DeprecatedFileOperations
+ fsutil.InodeNotSocket
+ fsutil.InodeNotRenameable
+ fsutil.InodeNotSymlink
+ fsutil.InodeNoExtendedAttributes
+ fsutil.NoMappable
+ fsutil.NoopWriteOut
// msrc is the super block this directory is on.
//
@@ -350,8 +348,6 @@ func (d *dirInodeOperations) masterClose(t *Terminal) {
//
// This is nearly identical to fsutil.DirFileOperations, except that it takes
// df.di.mu in IterateDir.
-//
-// +stateify savable
type dirFileOperations struct {
waiter.AlwaysReady `state:"nosave"`
fsutil.NoopRelease `state:"nosave"`
diff --git a/pkg/sentry/fs/tty/fs.go b/pkg/sentry/fs/tty/fs.go
index e28635607..dbaffe95e 100644
--- a/pkg/sentry/fs/tty/fs.go
+++ b/pkg/sentry/fs/tty/fs.go
@@ -28,8 +28,6 @@ var ptsDevice = device.NewAnonDevice()
//
// This devpts is always in the new "multi-instance" mode. i.e., it contains a
// ptmx device tied to this mount.
-//
-// +stateify savable
type filesystem struct{}
func init() {
@@ -71,8 +69,6 @@ func (f *filesystem) Mount(ctx context.Context, device string, flags fs.MountSou
}
// superOperations implements fs.MountSourceOperations, preventing caching.
-//
-// +stateify savable
type superOperations struct{}
// Revalidate implements fs.DirentOperations.Revalidate.
diff --git a/pkg/sentry/fs/tty/inode.go b/pkg/sentry/fs/tty/inode.go
index c0fa2b407..04b9a7727 100644
--- a/pkg/sentry/fs/tty/inode.go
+++ b/pkg/sentry/fs/tty/inode.go
@@ -31,8 +31,6 @@ import (
//
// * fs.InodeOperations.Release
// * fs.InodeOperations.GetFile
-//
-// +stateify savable
type inodeOperations struct {
fsutil.DeprecatedFileOperations `state:"nosave"`
fsutil.InodeNoExtendedAttributes `state:"nosave"`
diff --git a/pkg/sentry/fs/tty/line_discipline.go b/pkg/sentry/fs/tty/line_discipline.go
index d243ee40e..f094635f5 100644
--- a/pkg/sentry/fs/tty/line_discipline.go
+++ b/pkg/sentry/fs/tty/line_discipline.go
@@ -72,8 +72,6 @@ const (
// termiosMu
// inQueue.mu
// outQueue.mu
-//
-// +stateify savable
type lineDiscipline struct {
// inQueue is the input queue of the terminal.
inQueue queue
@@ -185,8 +183,6 @@ type transformer interface {
// outputQueueTransformer implements transformer. It performs line discipline
// transformations on the output queue.
-//
-// +stateify savable
type outputQueueTransformer struct{}
// transform does output processing for one end of the pty. See
@@ -258,8 +254,6 @@ func (*outputQueueTransformer) transform(l *lineDiscipline, q *queue, buf []byte
// inputQueueTransformer implements transformer. It performs line discipline
// transformations on the input queue.
-//
-// +stateify savable
type inputQueueTransformer struct{}
// transform does input processing for one end of the pty. Characters read are
diff --git a/pkg/sentry/fs/tty/master.go b/pkg/sentry/fs/tty/master.go
index c7198e218..74cdbe874 100644
--- a/pkg/sentry/fs/tty/master.go
+++ b/pkg/sentry/fs/tty/master.go
@@ -27,8 +27,6 @@ import (
// masterInodeOperations are the fs.InodeOperations for the master end of the
// Terminal (ptmx file).
-//
-// +stateify savable
type masterInodeOperations struct {
inodeOperations
@@ -98,8 +96,6 @@ func (mi *masterInodeOperations) GetFile(ctx context.Context, d *fs.Dirent, flag
}
// masterFileOperations are the fs.FileOperations for the master end of a terminal.
-//
-// +stateify savable
type masterFileOperations struct {
fsutil.PipeSeek `state:"nosave"`
fsutil.NotDirReaddir `state:"nosave"`
diff --git a/pkg/sentry/fs/tty/queue.go b/pkg/sentry/fs/tty/queue.go
index 42c105abc..026d5e077 100644
--- a/pkg/sentry/fs/tty/queue.go
+++ b/pkg/sentry/fs/tty/queue.go
@@ -32,13 +32,11 @@ import (
// processed (i.e. undergo termios transformations) as they are added to the
// read buffer. The read buffer is readable when its length is nonzero and
// readable is true.
-//
-// +stateify savable
type queue struct {
// mu protects everything in queue.
mu sync.Mutex `state:"nosave"`
- waiter.Queue `state:"zerovalue"`
+ waiter.Queue `state:"nosave"`
// readBuf is buffer of data ready to be read when readable is true.
// This data has been processed.
diff --git a/pkg/sentry/fs/tty/slave.go b/pkg/sentry/fs/tty/slave.go
index 1c562b172..f5eec726e 100644
--- a/pkg/sentry/fs/tty/slave.go
+++ b/pkg/sentry/fs/tty/slave.go
@@ -27,8 +27,6 @@ import (
// slaveInodeOperations are the fs.InodeOperations for the slave end of the
// Terminal (pts file).
-//
-// +stateify savable
type slaveInodeOperations struct {
inodeOperations
@@ -88,8 +86,6 @@ func (si *slaveInodeOperations) GetFile(ctx context.Context, d *fs.Dirent, flags
}
// slaveFileOperations are the fs.FileOperations for the slave end of a terminal.
-//
-// +stateify savable
type slaveFileOperations struct {
fsutil.PipeSeek `state:"nosave"`
fsutil.NotDirReaddir `state:"nosave"`
diff --git a/pkg/sentry/fs/tty/terminal.go b/pkg/sentry/fs/tty/terminal.go
index 3cb135124..fa5b00409 100644
--- a/pkg/sentry/fs/tty/terminal.go
+++ b/pkg/sentry/fs/tty/terminal.go
@@ -21,8 +21,6 @@ import (
)
// Terminal is a pseudoterminal.
-//
-// +stateify savable
type Terminal struct {
refs.AtomicRefCount
diff --git a/pkg/sentry/inet/BUILD b/pkg/sentry/inet/BUILD
index 159c50efb..eaf8f15b2 100644
--- a/pkg/sentry/inet/BUILD
+++ b/pkg/sentry/inet/BUILD
@@ -3,15 +3,26 @@ package(
licenses = ["notice"], # Apache 2.0
)
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "inet_state",
+ srcs = ["inet.go"],
+ out = "inet_state.go",
+ package = "inet",
+)
go_library(
name = "inet",
srcs = [
"context.go",
"inet.go",
+ "inet_state.go",
"test_stack.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/inet",
- deps = ["//pkg/sentry/context"],
+ deps = [
+ "//pkg/sentry/context",
+ "//pkg/state",
+ ],
)
diff --git a/pkg/sentry/inet/inet.go b/pkg/sentry/inet/inet.go
index e54a61196..e4b326993 100644
--- a/pkg/sentry/inet/inet.go
+++ b/pkg/sentry/inet/inet.go
@@ -87,8 +87,6 @@ type InterfaceAddr struct {
}
// TCPBufferSize contains settings controlling TCP buffer sizing.
-//
-// +stateify savable
type TCPBufferSize struct {
// Min is the minimum size.
Min int
diff --git a/pkg/sentry/kernel/BUILD b/pkg/sentry/kernel/BUILD
index 0ebacefa6..c4a7dacb2 100644
--- a/pkg/sentry/kernel/BUILD
+++ b/pkg/sentry/kernel/BUILD
@@ -1,7 +1,58 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "kernel_state",
+ srcs = [
+ "abstract_socket_namespace.go",
+ "fd_map.go",
+ "fs_context.go",
+ "ipc_namespace.go",
+ "kernel.go",
+ "kernel_state.go",
+ "pending_signals.go",
+ "pending_signals_state.go",
+ "process_group_list.go",
+ "ptrace.go",
+ "rseq.go",
+ "session_list.go",
+ "sessions.go",
+ "signal.go",
+ "signal_handlers.go",
+ "syscalls.go",
+ "syscalls_state.go",
+ "syslog.go",
+ "task.go",
+ "task_clone.go",
+ "task_context.go",
+ "task_exec.go",
+ "task_exit.go",
+ "task_list.go",
+ "task_resources.go",
+ "task_run.go",
+ "task_sched.go",
+ "task_signals.go",
+ "task_start.go",
+ "task_syscall.go",
+ "thread_group.go",
+ "threads.go",
+ "timekeeper.go",
+ "timekeeper_state.go",
+ "timer.go",
+ "uts_namespace.go",
+ "vdso.go",
+ "version.go",
+ ],
+ out = "kernel_autogen_state.go",
+ imports = [
+ "gvisor.googlesource.com/gvisor/pkg/sentry/arch",
+ "gvisor.googlesource.com/gvisor/pkg/sentry/kernel/kdefs",
+ "gvisor.googlesource.com/gvisor/pkg/tcpip",
+ ],
+ package = "kernel",
+)
go_template_instance(
name = "pending_signals_list",
@@ -67,6 +118,7 @@ go_library(
"fs_context.go",
"ipc_namespace.go",
"kernel.go",
+ "kernel_autogen_state.go",
"kernel_state.go",
"pending_signals.go",
"pending_signals_list.go",
@@ -112,11 +164,6 @@ go_library(
"version.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/kernel",
- imports = [
- "gvisor.googlesource.com/gvisor/pkg/sentry/arch",
- # "gvisor.googlesource.com/gvisor/pkg/sentry/kernel/kdefs",
- "gvisor.googlesource.com/gvisor/pkg/tcpip",
- ],
visibility = ["//:sandbox"],
deps = [
"//pkg/abi",
diff --git a/pkg/sentry/kernel/abstract_socket_namespace.go b/pkg/sentry/kernel/abstract_socket_namespace.go
index d6d1d341d..014c4a3bf 100644
--- a/pkg/sentry/kernel/abstract_socket_namespace.go
+++ b/pkg/sentry/kernel/abstract_socket_namespace.go
@@ -22,7 +22,6 @@ import (
"gvisor.googlesource.com/gvisor/pkg/tcpip/transport/unix"
)
-// +stateify savable
type abstractEndpoint struct {
ep unix.BoundEndpoint
wr *refs.WeakRef
@@ -40,8 +39,6 @@ func (e *abstractEndpoint) WeakRefGone() {
}
// AbstractSocketNamespace is used to implement the Linux abstract socket functionality.
-//
-// +stateify savable
type AbstractSocketNamespace struct {
mu sync.Mutex `state:"nosave"`
diff --git a/pkg/sentry/kernel/auth/BUILD b/pkg/sentry/kernel/auth/BUILD
index a81085372..5b7b30557 100644
--- a/pkg/sentry/kernel/auth/BUILD
+++ b/pkg/sentry/kernel/auth/BUILD
@@ -1,7 +1,20 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "auth_state",
+ srcs = [
+ "credentials.go",
+ "id.go",
+ "id_map_range.go",
+ "id_map_set.go",
+ "user_namespace.go",
+ ],
+ out = "auth_state.go",
+ package = "auth",
+)
go_template_instance(
name = "id_map_range",
@@ -35,6 +48,7 @@ go_library(
name = "auth",
srcs = [
"auth.go",
+ "auth_state.go",
"capability_set.go",
"context.go",
"credentials.go",
@@ -52,6 +66,7 @@ go_library(
"//pkg/bits",
"//pkg/log",
"//pkg/sentry/context",
+ "//pkg/state",
"//pkg/syserror",
],
)
diff --git a/pkg/sentry/kernel/auth/credentials.go b/pkg/sentry/kernel/auth/credentials.go
index f18f7dac9..f6fb05285 100644
--- a/pkg/sentry/kernel/auth/credentials.go
+++ b/pkg/sentry/kernel/auth/credentials.go
@@ -21,8 +21,6 @@ import (
// Credentials contains information required to authorize privileged operations
// in a user namespace.
-//
-// +stateify savable
type Credentials struct {
// Real/effective/saved user/group IDs in the root user namespace. None of
// these should ever be NoID.
diff --git a/pkg/sentry/kernel/auth/id_map.go b/pkg/sentry/kernel/auth/id_map.go
index bd0090e0f..6adb33530 100644
--- a/pkg/sentry/kernel/auth/id_map.go
+++ b/pkg/sentry/kernel/auth/id_map.go
@@ -77,8 +77,6 @@ func (ns *UserNamespace) allIDsMapped(m *idMapSet, start, end uint32) bool {
// An IDMapEntry represents a mapping from a range of contiguous IDs in a user
// namespace to an equally-sized range of contiguous IDs in the namespace's
// parent.
-//
-// +stateify savable
type IDMapEntry struct {
// FirstID is the first ID in the range in the namespace.
FirstID uint32
diff --git a/pkg/sentry/kernel/auth/user_namespace.go b/pkg/sentry/kernel/auth/user_namespace.go
index d359f3f31..0980aeadf 100644
--- a/pkg/sentry/kernel/auth/user_namespace.go
+++ b/pkg/sentry/kernel/auth/user_namespace.go
@@ -23,8 +23,6 @@ import (
// A UserNamespace represents a user namespace. See user_namespaces(7) for
// details.
-//
-// +stateify savable
type UserNamespace struct {
// parent is this namespace's parent. If this is the root namespace, parent
// is nil. The parent pointer is immutable.
diff --git a/pkg/sentry/kernel/epoll/BUILD b/pkg/sentry/kernel/epoll/BUILD
index 5e8b36ed6..7d491efbc 100644
--- a/pkg/sentry/kernel/epoll/BUILD
+++ b/pkg/sentry/kernel/epoll/BUILD
@@ -1,11 +1,22 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "epoll_autogen_state",
+ srcs = [
+ "epoll.go",
+ "epoll_state.go",
+ ],
+ out = "epoll_autogen_state.go",
+ package = "epoll",
+)
go_library(
name = "epoll",
srcs = [
"epoll.go",
+ "epoll_autogen_state.go",
"epoll_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/kernel/epoll",
@@ -18,7 +29,9 @@ go_library(
"//pkg/sentry/fs/anon",
"//pkg/sentry/fs/fsutil",
"//pkg/sentry/kernel/kdefs",
+ "//pkg/sentry/kernel/time",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/waiter",
],
)
diff --git a/pkg/sentry/kernel/epoll/epoll.go b/pkg/sentry/kernel/epoll/epoll.go
index d87e64a1c..b572fcd7e 100644
--- a/pkg/sentry/kernel/epoll/epoll.go
+++ b/pkg/sentry/kernel/epoll/epoll.go
@@ -58,8 +58,6 @@ const (
// potentially be reassigned. We also cannot use just the file pointer because
// it is possible to have multiple entries for the same file object as long as
// they are created with different FDs (i.e., the FDs point to the same file).
-//
-// +stateify savable
type FileIdentifier struct {
File *fs.File
Fd kdefs.FD
@@ -67,8 +65,6 @@ type FileIdentifier struct {
// pollEntry holds all the state associated with an event poll entry, that is,
// a file being observed by an event poll object.
-//
-// +stateify savable
type pollEntry struct {
ilist.Entry
file *refs.WeakRef `state:"manual"`
@@ -96,8 +92,6 @@ func (p *pollEntry) WeakRefGone() {
// EventPoll holds all the state associated with an event poll object, that is,
// collection of files to observe and their current state.
-//
-// +stateify savable
type EventPoll struct {
fsutil.PipeSeek `state:"zerovalue"`
fsutil.NotDirReaddir `state:"zerovalue"`
@@ -108,7 +102,7 @@ type EventPoll struct {
// Wait queue is used to notify interested parties when the event poll
// object itself becomes readable or writable.
- waiter.Queue `state:"zerovalue"`
+ waiter.Queue
// files is the map of all the files currently being observed, it is
// protected by mu.
diff --git a/pkg/sentry/kernel/eventfd/BUILD b/pkg/sentry/kernel/eventfd/BUILD
index cc1120b4f..7ec179bd8 100644
--- a/pkg/sentry/kernel/eventfd/BUILD
+++ b/pkg/sentry/kernel/eventfd/BUILD
@@ -1,19 +1,33 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "eventfd_state",
+ srcs = [
+ "eventfd.go",
+ ],
+ out = "eventfd_state.go",
+ package = "eventfd",
+)
go_library(
name = "eventfd",
- srcs = ["eventfd.go"],
+ srcs = [
+ "eventfd.go",
+ "eventfd_state.go",
+ ],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/kernel/eventfd",
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
+ "//pkg/refs",
"//pkg/sentry/context",
"//pkg/sentry/fs",
"//pkg/sentry/fs/anon",
"//pkg/sentry/fs/fsutil",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
"//pkg/waiter",
"//pkg/waiter/fdnotifier",
diff --git a/pkg/sentry/kernel/eventfd/eventfd.go b/pkg/sentry/kernel/eventfd/eventfd.go
index a4ada0e78..bd50bd9fe 100644
--- a/pkg/sentry/kernel/eventfd/eventfd.go
+++ b/pkg/sentry/kernel/eventfd/eventfd.go
@@ -35,8 +35,6 @@ import (
// EventOperations represents an event with the semantics of Linux's file-based event
// notification (eventfd). Eventfds are usually internal to the Sentry but in certain
// situations they may be converted into a host-backed eventfd.
-//
-// +stateify savable
type EventOperations struct {
fsutil.NoopRelease `state:"nosave"`
fsutil.PipeSeek `state:"nosave"`
@@ -51,7 +49,7 @@ type EventOperations struct {
// Queue is used to notify interested parties when the event object
// becomes readable or writable.
- wq waiter.Queue `state:"zerovalue"`
+ wq waiter.Queue `state:"nosave"`
// val is the current value of the event counter.
val uint64
diff --git a/pkg/sentry/kernel/fd_map.go b/pkg/sentry/kernel/fd_map.go
index d5d4aaacb..299506330 100644
--- a/pkg/sentry/kernel/fd_map.go
+++ b/pkg/sentry/kernel/fd_map.go
@@ -46,8 +46,6 @@ func (f FDs) Less(i, j int) bool {
}
// FDFlags define flags for an individual descriptor.
-//
-// +stateify savable
type FDFlags struct {
// CloseOnExec indicates the descriptor should be closed on exec.
CloseOnExec bool
@@ -71,16 +69,12 @@ func (f FDFlags) ToLinuxFDFlags() (mask uint) {
// descriptor holds the details about a file descriptor, namely a pointer the
// file itself and the descriptor flags.
-//
-// +stateify savable
type descriptor struct {
file *fs.File
flags FDFlags
}
// FDMap is used to manage File references and flags.
-//
-// +stateify savable
type FDMap struct {
refs.AtomicRefCount
k *Kernel
diff --git a/pkg/sentry/kernel/fs_context.go b/pkg/sentry/kernel/fs_context.go
index f3f05e8f5..dbc097696 100644
--- a/pkg/sentry/kernel/fs_context.go
+++ b/pkg/sentry/kernel/fs_context.go
@@ -25,8 +25,6 @@ import (
// FSContext contains filesystem context.
//
// This includes umask and working directory.
-//
-// +stateify savable
type FSContext struct {
refs.AtomicRefCount
diff --git a/pkg/sentry/kernel/futex/BUILD b/pkg/sentry/kernel/futex/BUILD
index b44a26974..a97a43549 100644
--- a/pkg/sentry/kernel/futex/BUILD
+++ b/pkg/sentry/kernel/futex/BUILD
@@ -1,7 +1,7 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
go_template_instance(
name = "waiter_list",
@@ -14,15 +14,29 @@ go_template_instance(
},
)
+go_stateify(
+ name = "futex_state",
+ srcs = [
+ "futex.go",
+ "waiter_list.go",
+ ],
+ out = "futex_state.go",
+ package = "futex",
+)
+
go_library(
name = "futex",
srcs = [
"futex.go",
+ "futex_state.go",
"waiter_list.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/kernel/futex",
visibility = ["//pkg/sentry:internal"],
- deps = ["//pkg/syserror"],
+ deps = [
+ "//pkg/state",
+ "//pkg/syserror",
+ ],
)
go_test(
diff --git a/pkg/sentry/kernel/futex/futex.go b/pkg/sentry/kernel/futex/futex.go
index 4a1f2a0ef..15e3e5e2c 100644
--- a/pkg/sentry/kernel/futex/futex.go
+++ b/pkg/sentry/kernel/futex/futex.go
@@ -196,8 +196,6 @@ func bucketIndexForAddr(addr uintptr) uintptr {
}
// Manager holds futex state for a single virtual address space.
-//
-// +stateify savable
type Manager struct {
buckets [bucketCount]bucket `state:"zerovalue"`
}
diff --git a/pkg/sentry/kernel/ipc_namespace.go b/pkg/sentry/kernel/ipc_namespace.go
index 5eef49f59..a86bda77b 100644
--- a/pkg/sentry/kernel/ipc_namespace.go
+++ b/pkg/sentry/kernel/ipc_namespace.go
@@ -21,8 +21,6 @@ import (
)
// IPCNamespace represents an IPC namespace.
-//
-// +stateify savable
type IPCNamespace struct {
// User namespace which owns this IPC namespace. Immutable.
userNS *auth.UserNamespace
diff --git a/pkg/sentry/kernel/kernel.go b/pkg/sentry/kernel/kernel.go
index 419a1d473..64439cd9d 100644
--- a/pkg/sentry/kernel/kernel.go
+++ b/pkg/sentry/kernel/kernel.go
@@ -62,8 +62,6 @@ import (
// Kernel represents an emulated Linux kernel. It must be initialized by calling
// Init() or LoadFrom().
-//
-// +stateify savable
type Kernel struct {
// extMu serializes external changes to the Kernel with calls to
// Kernel.SaveTo. (Kernel.SaveTo requires that the state of the Kernel
@@ -160,7 +158,7 @@ type Kernel struct {
// exitErr is the error causing the sandbox to exit, if any. It is
// protected by extMu.
- exitErr error `state:"nosave"`
+ exitErr error
// danglingEndpoints is used to save / restore tcpip.DanglingEndpoints.
danglingEndpoints struct{} `state:".([]tcpip.Endpoint)"`
diff --git a/pkg/sentry/kernel/pending_signals.go b/pkg/sentry/kernel/pending_signals.go
index 06be5a7e1..5dc0f266c 100644
--- a/pkg/sentry/kernel/pending_signals.go
+++ b/pkg/sentry/kernel/pending_signals.go
@@ -38,8 +38,6 @@ const (
// pendingSignals holds a collection of pending signals. The zero value of
// pendingSignals is a valid empty collection. pendingSignals is thread-unsafe;
// users must provide synchronization.
-//
-// +stateify savable
type pendingSignals struct {
// signals contains all pending signals.
//
@@ -54,14 +52,11 @@ type pendingSignals struct {
}
// pendingSignalQueue holds a pendingSignalList for a single signal number.
-//
-// +stateify savable
type pendingSignalQueue struct {
pendingSignalList
length int
}
-// +stateify savable
type pendingSignal struct {
// pendingSignalEntry links into a pendingSignalList.
pendingSignalEntry
diff --git a/pkg/sentry/kernel/pipe/BUILD b/pkg/sentry/kernel/pipe/BUILD
index 19b23c6d2..4600d19bd 100644
--- a/pkg/sentry/kernel/pipe/BUILD
+++ b/pkg/sentry/kernel/pipe/BUILD
@@ -1,6 +1,20 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "pipe_state",
+ srcs = [
+ "buffers.go",
+ "node.go",
+ "pipe.go",
+ "reader.go",
+ "reader_writer.go",
+ "writer.go",
+ ],
+ out = "pipe_state.go",
+ package = "pipe",
+)
go_library(
name = "pipe",
@@ -9,6 +23,7 @@ go_library(
"device.go",
"node.go",
"pipe.go",
+ "pipe_state.go",
"reader.go",
"reader_writer.go",
"writer.go",
@@ -19,12 +34,15 @@ go_library(
"//pkg/abi/linux",
"//pkg/amutex",
"//pkg/ilist",
+ "//pkg/log",
+ "//pkg/refs",
"//pkg/sentry/arch",
"//pkg/sentry/context",
"//pkg/sentry/device",
"//pkg/sentry/fs",
"//pkg/sentry/fs/fsutil",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
"//pkg/waiter",
],
diff --git a/pkg/sentry/kernel/pipe/buffers.go b/pkg/sentry/kernel/pipe/buffers.go
index a82e45c3f..f300537c5 100644
--- a/pkg/sentry/kernel/pipe/buffers.go
+++ b/pkg/sentry/kernel/pipe/buffers.go
@@ -20,8 +20,6 @@ import (
// Buffer encapsulates a queueable byte buffer that can
// easily be truncated. It is designed only for use with pipes.
-//
-// +stateify savable
type Buffer struct {
ilist.Entry
data []byte
diff --git a/pkg/sentry/kernel/pipe/node.go b/pkg/sentry/kernel/pipe/node.go
index 23d692da1..e418cf174 100644
--- a/pkg/sentry/kernel/pipe/node.go
+++ b/pkg/sentry/kernel/pipe/node.go
@@ -24,8 +24,6 @@ import (
)
// inodeOperations wraps fs.InodeOperations operations with common pipe opening semantics.
-//
-// +stateify savable
type inodeOperations struct {
fs.InodeOperations
diff --git a/pkg/sentry/kernel/pipe/pipe.go b/pkg/sentry/kernel/pipe/pipe.go
index ced2559a7..9a21df5b4 100644
--- a/pkg/sentry/kernel/pipe/pipe.go
+++ b/pkg/sentry/kernel/pipe/pipe.go
@@ -41,8 +41,6 @@ const DefaultPipeSize = 65536
// Pipe is an encapsulation of a platform-independent pipe.
// It manages a buffered byte queue shared between a reader/writer
// pair.
-//
-// +stateify savable
type Pipe struct {
waiter.Queue `state:"nosave"`
diff --git a/pkg/sentry/kernel/pipe/reader.go b/pkg/sentry/kernel/pipe/reader.go
index 1fa5e9a32..40d5e4943 100644
--- a/pkg/sentry/kernel/pipe/reader.go
+++ b/pkg/sentry/kernel/pipe/reader.go
@@ -20,8 +20,6 @@ import (
// Reader satisfies the fs.FileOperations interface for read-only pipes.
// Reader should be used with !fs.FileFlags.Write to reject writes.
-//
-// +stateify savable
type Reader struct {
ReaderWriter
}
diff --git a/pkg/sentry/kernel/pipe/reader_writer.go b/pkg/sentry/kernel/pipe/reader_writer.go
index 82607367b..dc642a3a6 100644
--- a/pkg/sentry/kernel/pipe/reader_writer.go
+++ b/pkg/sentry/kernel/pipe/reader_writer.go
@@ -31,8 +31,6 @@ import (
// read and write requests. This should only be used directly for named pipes.
// pipe(2) and pipe2(2) only support unidirectional pipes and should use
// either pipe.Reader or pipe.Writer.
-//
-// +stateify savable
type ReaderWriter struct {
fsutil.PipeSeek `state:"nosave"`
fsutil.NotDirReaddir `state:"nosave"`
diff --git a/pkg/sentry/kernel/pipe/writer.go b/pkg/sentry/kernel/pipe/writer.go
index d93324b53..fd13008ac 100644
--- a/pkg/sentry/kernel/pipe/writer.go
+++ b/pkg/sentry/kernel/pipe/writer.go
@@ -20,8 +20,6 @@ import (
// Writer satisfies the fs.FileOperations interface for write-only pipes.
// Writer should be used with !fs.FileFlags.Read to reject reads.
-//
-// +stateify savable
type Writer struct {
ReaderWriter
}
diff --git a/pkg/sentry/kernel/ptrace.go b/pkg/sentry/kernel/ptrace.go
index e9e69004d..f1c2c4bf0 100644
--- a/pkg/sentry/kernel/ptrace.go
+++ b/pkg/sentry/kernel/ptrace.go
@@ -25,8 +25,6 @@ import (
// ptraceOptions are the subset of options controlling a task's ptrace behavior
// that are set by ptrace(PTRACE_SETOPTIONS).
-//
-// +stateify savable
type ptraceOptions struct {
// ExitKill is true if the tracee should be sent SIGKILL when the tracer
// exits.
@@ -187,8 +185,6 @@ func (t *Task) hasTracer() bool {
}
// ptraceStop is a TaskStop placed on tasks in a ptrace-stop.
-//
-// +stateify savable
type ptraceStop struct {
// If frozen is true, the stopped task's tracer is currently operating on
// it, so Task.Kill should not remove the stop.
diff --git a/pkg/sentry/kernel/rseq.go b/pkg/sentry/kernel/rseq.go
index 1f3de58e3..635372993 100644
--- a/pkg/sentry/kernel/rseq.go
+++ b/pkg/sentry/kernel/rseq.go
@@ -23,8 +23,6 @@ import (
// Restartable sequences, as described in https://lwn.net/Articles/650333/.
// RSEQCriticalRegion describes a restartable sequence critical region.
-//
-// +stateify savable
type RSEQCriticalRegion struct {
// When a task in this thread group has its CPU preempted (as defined by
// platform.ErrContextCPUPreempted) or has a signal delivered to an
diff --git a/pkg/sentry/kernel/semaphore/BUILD b/pkg/sentry/kernel/semaphore/BUILD
index e7fa44e2c..969145fe1 100644
--- a/pkg/sentry/kernel/semaphore/BUILD
+++ b/pkg/sentry/kernel/semaphore/BUILD
@@ -1,7 +1,7 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
go_template_instance(
name = "waiter_list",
@@ -14,10 +14,21 @@ go_template_instance(
},
)
+go_stateify(
+ name = "semaphore_state",
+ srcs = [
+ "semaphore.go",
+ "waiter_list.go",
+ ],
+ out = "semaphore_autogen_state.go",
+ package = "semaphore",
+)
+
go_library(
name = "semaphore",
srcs = [
"semaphore.go",
+ "semaphore_autogen_state.go",
"waiter_list.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/kernel/semaphore",
@@ -29,6 +40,8 @@ go_library(
"//pkg/sentry/fs",
"//pkg/sentry/kernel/auth",
"//pkg/sentry/kernel/time",
+ "//pkg/state",
+ "//pkg/state/statefile",
"//pkg/syserror",
],
)
diff --git a/pkg/sentry/kernel/semaphore/semaphore.go b/pkg/sentry/kernel/semaphore/semaphore.go
index aa07946cf..a1ee83ce5 100644
--- a/pkg/sentry/kernel/semaphore/semaphore.go
+++ b/pkg/sentry/kernel/semaphore/semaphore.go
@@ -42,8 +42,6 @@ const (
)
// Registry maintains a set of semaphores that can be found by key or ID.
-//
-// +stateify savable
type Registry struct {
// userNS owning the ipc name this registry belongs to. Immutable.
userNS *auth.UserNamespace
@@ -54,8 +52,6 @@ type Registry struct {
}
// Set represents a set of semaphores that can be operated atomically.
-//
-// +stateify savable
type Set struct {
// registry owning this sem set. Immutable.
registry *Registry
@@ -83,8 +79,6 @@ type Set struct {
}
// sem represents a single semanphore from a set.
-//
-// +stateify savable
type sem struct {
value int16
waiters waiterList `state:"zerovalue"`
@@ -92,8 +86,6 @@ type sem struct {
// waiter represents a caller that is waiting for the semaphore value to
// become positive or zero.
-//
-// +stateify savable
type waiter struct {
waiterEntry
diff --git a/pkg/sentry/kernel/sessions.go b/pkg/sentry/kernel/sessions.go
index cf4e18805..fa4c7b8f6 100644
--- a/pkg/sentry/kernel/sessions.go
+++ b/pkg/sentry/kernel/sessions.go
@@ -27,8 +27,6 @@ type SessionID ThreadID
type ProcessGroupID ThreadID
// Session contains a leader threadgroup and a list of ProcessGroups.
-//
-// +stateify savable
type Session struct {
refs refs.AtomicRefCount
@@ -78,8 +76,6 @@ func (s *Session) decRef() {
}
// ProcessGroup contains an originator threadgroup and a parent Session.
-//
-// +stateify savable
type ProcessGroup struct {
refs refs.AtomicRefCount // not exported.
diff --git a/pkg/sentry/kernel/shm/BUILD b/pkg/sentry/kernel/shm/BUILD
index 40e641355..0f88eb0ac 100644
--- a/pkg/sentry/kernel/shm/BUILD
+++ b/pkg/sentry/kernel/shm/BUILD
@@ -1,12 +1,22 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "shm_state",
+ srcs = [
+ "shm.go",
+ ],
+ out = "shm_autogen_state.go",
+ package = "shm",
+)
go_library(
name = "shm",
srcs = [
"device.go",
"shm.go",
+ "shm_autogen_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/kernel/shm",
visibility = ["//pkg/sentry:internal"],
@@ -23,6 +33,7 @@ go_library(
"//pkg/sentry/platform",
"//pkg/sentry/usage",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
],
)
diff --git a/pkg/sentry/kernel/shm/shm.go b/pkg/sentry/kernel/shm/shm.go
index 1ac444094..7217e8103 100644
--- a/pkg/sentry/kernel/shm/shm.go
+++ b/pkg/sentry/kernel/shm/shm.go
@@ -72,8 +72,6 @@ const (
// Registry tracks all shared memory segments in an IPC namespace. The registry
// provides the mechanisms for creating and finding segments, and reporting
// global shm parameters.
-//
-// +stateify savable
type Registry struct {
// userNS owns the IPC namespace this registry belong to. Immutable.
userNS *auth.UserNamespace
@@ -290,8 +288,6 @@ func (r *Registry) remove(s *Shm) {
// shmctl(SHM_RMID).
//
// Shm implements memmap.Mappable and memmap.MappingIdentity.
-//
-// +stateify savable
type Shm struct {
// AtomicRefCount tracks the number of references to this segment from
// maps. A segment always holds a reference to itself, until it's marked for
diff --git a/pkg/sentry/kernel/signal_handlers.go b/pkg/sentry/kernel/signal_handlers.go
index 3649f5e4d..21ba4ee70 100644
--- a/pkg/sentry/kernel/signal_handlers.go
+++ b/pkg/sentry/kernel/signal_handlers.go
@@ -22,8 +22,6 @@ import (
)
// SignalHandlers holds information about signal actions.
-//
-// +stateify savable
type SignalHandlers struct {
// mu protects actions, as well as the signal state of all tasks and thread
// groups using this SignalHandlers object. (See comment on
diff --git a/pkg/sentry/kernel/syscalls.go b/pkg/sentry/kernel/syscalls.go
index 4c7811b6c..e20fa3eb6 100644
--- a/pkg/sentry/kernel/syscalls.go
+++ b/pkg/sentry/kernel/syscalls.go
@@ -176,8 +176,6 @@ type Stracer interface {
// SyscallTable is a lookup table of system calls. Critically, a SyscallTable
// is *immutable*. In order to make supporting suspend and resume sane, they
// must be uniquely registered and may not change during operation.
-//
-// +stateify savable
type SyscallTable struct {
// OS is the operating system that this syscall table implements.
OS abi.OS `state:"wait"`
diff --git a/pkg/sentry/kernel/syslog.go b/pkg/sentry/kernel/syslog.go
index 125312b6a..31541749e 100644
--- a/pkg/sentry/kernel/syslog.go
+++ b/pkg/sentry/kernel/syslog.go
@@ -23,8 +23,6 @@ import (
// syslog represents a sentry-global kernel log.
//
// Currently, it contains only fun messages for a dmesg easter egg.
-//
-// +stateify savable
type syslog struct {
// mu protects the below.
mu sync.Mutex `state:"nosave"`
diff --git a/pkg/sentry/kernel/task.go b/pkg/sentry/kernel/task.go
index ae9b3d175..7f6735320 100644
--- a/pkg/sentry/kernel/task.go
+++ b/pkg/sentry/kernel/task.go
@@ -52,8 +52,6 @@ import (
// All fields that are "exclusive to the task goroutine" can only be accessed
// by the task goroutine while it is running. The task goroutine does not
// require synchronization to read or write these fields.
-//
-// +stateify savable
type Task struct {
taskNode
diff --git a/pkg/sentry/kernel/task_clone.go b/pkg/sentry/kernel/task_clone.go
index 38f7826e2..a61283267 100644
--- a/pkg/sentry/kernel/task_clone.go
+++ b/pkg/sentry/kernel/task_clone.go
@@ -349,7 +349,6 @@ func (t *Task) unstopVforkParent() {
}
}
-// +stateify savable
type runSyscallAfterPtraceEventClone struct {
vforkChild *Task
@@ -367,7 +366,6 @@ func (r *runSyscallAfterPtraceEventClone) execute(t *Task) taskRunState {
return (*runSyscallExit)(nil)
}
-// +stateify savable
type runSyscallAfterVforkStop struct {
// childTID has the same meaning as
// runSyscallAfterPtraceEventClone.vforkChildTID.
@@ -473,8 +471,6 @@ func (t *Task) Unshare(opts *SharingOptions) error {
// current MM. (Normally, CLONE_VFORK is used in conjunction with CLONE_VM, so
// that the child and parent share mappings until the child execve()s into a
// new process image or exits.)
-//
-// +stateify savable
type vforkStop struct{}
// StopIgnoresKill implements TaskStop.Killable.
diff --git a/pkg/sentry/kernel/task_context.go b/pkg/sentry/kernel/task_context.go
index 9a59cbd33..5c563ba08 100644
--- a/pkg/sentry/kernel/task_context.go
+++ b/pkg/sentry/kernel/task_context.go
@@ -35,8 +35,6 @@ var ErrNoSyscalls = errors.New("no syscall table found")
type Auxmap map[string]interface{}
// TaskContext is the subset of a task's data that is provided by the loader.
-//
-// +stateify savable
type TaskContext struct {
// Name is the thread name set by the prctl(PR_SET_NAME) system call.
Name string
diff --git a/pkg/sentry/kernel/task_exec.go b/pkg/sentry/kernel/task_exec.go
index 385299b24..2285847a2 100644
--- a/pkg/sentry/kernel/task_exec.go
+++ b/pkg/sentry/kernel/task_exec.go
@@ -73,8 +73,6 @@ import (
// execStop is a TaskStop that a task sets on itself when it wants to execve
// and is waiting for the other tasks in its thread group to exit first.
-//
-// +stateify savable
type execStop struct{}
// Killable implements TaskStop.Killable.
@@ -121,8 +119,6 @@ func (t *Task) Execve(newTC *TaskContext) (*SyscallControl, error) {
// The runSyscallAfterExecStop state continues execve(2) after all siblings of
// a thread in the execve syscall have exited.
-//
-// +stateify savable
type runSyscallAfterExecStop struct {
tc *TaskContext
}
diff --git a/pkg/sentry/kernel/task_exit.go b/pkg/sentry/kernel/task_exit.go
index b16844e91..d6604f37b 100644
--- a/pkg/sentry/kernel/task_exit.go
+++ b/pkg/sentry/kernel/task_exit.go
@@ -38,8 +38,6 @@ import (
// An ExitStatus is a value communicated from an exiting task or thread group
// to the party that reaps it.
-//
-// +stateify savable
type ExitStatus struct {
// Code is the numeric value passed to the call to exit or exit_group that
// caused the exit. If the exit was not caused by such a call, Code is 0.
@@ -224,8 +222,6 @@ func (t *Task) advanceExitStateLocked(oldExit, newExit TaskExitState) {
}
// runExit is the entry point into the task exit path.
-//
-// +stateify savable
type runExit struct{}
func (*runExit) execute(t *Task) taskRunState {
@@ -233,7 +229,6 @@ func (*runExit) execute(t *Task) taskRunState {
return (*runExitMain)(nil)
}
-// +stateify savable
type runExitMain struct{}
func (*runExitMain) execute(t *Task) taskRunState {
@@ -536,7 +531,6 @@ func (t *Task) reparentLocked(parent *Task) {
// tracer (if one exists) and reaps the leader immediately. In Linux, this is
// in fs/exec.c:de_thread(); in the sentry, this is in Task.promoteLocked().
-// +stateify savable
type runExitNotify struct{}
func (*runExitNotify) execute(t *Task) taskRunState {
diff --git a/pkg/sentry/kernel/task_resources.go b/pkg/sentry/kernel/task_resources.go
index 0832bf989..4ca25664a 100644
--- a/pkg/sentry/kernel/task_resources.go
+++ b/pkg/sentry/kernel/task_resources.go
@@ -21,8 +21,6 @@ import (
// TaskResources is the subset of a task's data provided by its creator that is
// not provided by the loader.
-//
-// +stateify savable
type TaskResources struct {
// SignalMask is the set of signals whose delivery is currently blocked.
//
diff --git a/pkg/sentry/kernel/task_run.go b/pkg/sentry/kernel/task_run.go
index 8dd0ef6ea..a03fa6ac0 100644
--- a/pkg/sentry/kernel/task_run.go
+++ b/pkg/sentry/kernel/task_run.go
@@ -131,8 +131,6 @@ func (t *Task) doStop() {
// The runApp state checks for interrupts before executing untrusted
// application code.
-//
-// +stateify savable
type runApp struct{}
func (*runApp) execute(t *Task) taskRunState {
diff --git a/pkg/sentry/kernel/task_sched.go b/pkg/sentry/kernel/task_sched.go
index 49141ab74..b50139077 100644
--- a/pkg/sentry/kernel/task_sched.go
+++ b/pkg/sentry/kernel/task_sched.go
@@ -65,8 +65,6 @@ const (
// TaskGoroutineSchedInfo contains task goroutine scheduling state which must
// be read and updated atomically.
-//
-// +stateify savable
type TaskGoroutineSchedInfo struct {
// Timestamp was the value of Kernel.cpuClock when this
// TaskGoroutineSchedInfo was last updated.
diff --git a/pkg/sentry/kernel/task_signals.go b/pkg/sentry/kernel/task_signals.go
index 62ec530be..91f6c0874 100644
--- a/pkg/sentry/kernel/task_signals.go
+++ b/pkg/sentry/kernel/task_signals.go
@@ -748,8 +748,6 @@ func (t *Task) CopyInSignalStack(addr usermem.Addr) (arch.SignalStack, error) {
// groupStop is a TaskStop placed on tasks that have received a stop signal
// (SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU). (The term "group-stop" originates from
// the ptrace man page.)
-//
-// +stateify savable
type groupStop struct{}
// Killable implements TaskStop.Killable.
@@ -883,8 +881,6 @@ func (t *Task) signalStop(target *Task, code int32, status int32) {
}
// The runInterrupt state handles conditions indicated by interrupts.
-//
-// +stateify savable
type runInterrupt struct{}
func (*runInterrupt) execute(t *Task) taskRunState {
@@ -1024,7 +1020,6 @@ func (*runInterrupt) execute(t *Task) taskRunState {
return (*runApp)(nil)
}
-// +stateify savable
type runInterruptAfterSignalDeliveryStop struct{}
func (*runInterruptAfterSignalDeliveryStop) execute(t *Task) taskRunState {
diff --git a/pkg/sentry/kernel/task_syscall.go b/pkg/sentry/kernel/task_syscall.go
index 3b9652504..79f4ff60c 100644
--- a/pkg/sentry/kernel/task_syscall.go
+++ b/pkg/sentry/kernel/task_syscall.go
@@ -241,7 +241,6 @@ func (t *Task) doSyscallEnter(sysno uintptr, args arch.SyscallArguments) taskRun
return t.doSyscallInvoke(sysno, args)
}
-// +stateify savable
type runSyscallAfterSyscallEnterStop struct{}
func (*runSyscallAfterSyscallEnterStop) execute(t *Task) taskRunState {
@@ -261,7 +260,6 @@ func (*runSyscallAfterSyscallEnterStop) execute(t *Task) taskRunState {
return t.doSyscallInvoke(sysno, args)
}
-// +stateify savable
type runSyscallAfterSysemuStop struct{}
func (*runSyscallAfterSysemuStop) execute(t *Task) taskRunState {
@@ -296,7 +294,6 @@ func (t *Task) doSyscallInvoke(sysno uintptr, args arch.SyscallArguments) taskRu
return (*runSyscallExit)(nil).execute(t)
}
-// +stateify savable
type runSyscallReinvoke struct{}
func (*runSyscallReinvoke) execute(t *Task) taskRunState {
@@ -313,7 +310,6 @@ func (*runSyscallReinvoke) execute(t *Task) taskRunState {
return t.doSyscallInvoke(sysno, args)
}
-// +stateify savable
type runSyscallExit struct{}
func (*runSyscallExit) execute(t *Task) taskRunState {
diff --git a/pkg/sentry/kernel/thread_group.go b/pkg/sentry/kernel/thread_group.go
index 441b8a822..8fffd3446 100644
--- a/pkg/sentry/kernel/thread_group.go
+++ b/pkg/sentry/kernel/thread_group.go
@@ -28,8 +28,6 @@ import (
// groups" are usually called "processes" in userspace documentation.)
//
// ThreadGroup is a superset of Linux's struct signal_struct.
-//
-// +stateify savable
type ThreadGroup struct {
threadGroupNode
diff --git a/pkg/sentry/kernel/threads.go b/pkg/sentry/kernel/threads.go
index 844213c35..440da9dad 100644
--- a/pkg/sentry/kernel/threads.go
+++ b/pkg/sentry/kernel/threads.go
@@ -50,8 +50,6 @@ func (tid ThreadID) String() string {
const InitTID ThreadID = 1
// A TaskSet comprises all tasks in a system.
-//
-// +stateify savable
type TaskSet struct {
// mu protects all relationships betweens tasks and thread groups in the
// TaskSet. (mu is approximately equivalent to Linux's tasklist_lock.)
@@ -112,8 +110,6 @@ func (ts *TaskSet) forEachThreadGroupLocked(f func(tg *ThreadGroup)) {
//
// N.B. A task is said to be visible in a PID namespace if the PID namespace
// contains a thread ID that maps to that task.
-//
-// +stateify savable
type PIDNamespace struct {
// owner is the TaskSet that this PID namespace belongs to. The owner
// pointer is immutable.
@@ -267,8 +263,6 @@ func (ns *PIDNamespace) UserNamespace() *auth.UserNamespace {
// (threadGroupNode is an anonymous field in ThreadGroup; this is to expose
// threadGroupEntry's methods on ThreadGroup to make it implement
// threadGroupLinker.)
-//
-// +stateify savable
type threadGroupNode struct {
// pidns is the PID namespace containing the thread group and all of its
// member tasks. The pidns pointer is immutable.
@@ -388,8 +382,6 @@ func (tg *ThreadGroup) ID() ThreadID {
// A taskNode defines the relationship between a task and the rest of the
// system. The comments on threadGroupNode also apply to taskNode.
-//
-// +stateify savable
type taskNode struct {
// tg is the thread group that this task belongs to. The tg pointer is
// immutable.
diff --git a/pkg/sentry/kernel/time/BUILD b/pkg/sentry/kernel/time/BUILD
index 5d8db2273..b3ed42aa4 100644
--- a/pkg/sentry/kernel/time/BUILD
+++ b/pkg/sentry/kernel/time/BUILD
@@ -1,18 +1,30 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "time_state",
+ srcs = [
+ "time.go",
+ ],
+ out = "time_state.go",
+ package = "time",
+)
go_library(
name = "time",
srcs = [
"context.go",
"time.go",
+ "time_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/kernel/time",
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
+ "//pkg/log",
"//pkg/sentry/context",
+ "//pkg/state",
"//pkg/syserror",
"//pkg/waiter",
],
diff --git a/pkg/sentry/kernel/time/time.go b/pkg/sentry/kernel/time/time.go
index 6eadd2878..c223c2f19 100644
--- a/pkg/sentry/kernel/time/time.go
+++ b/pkg/sentry/kernel/time/time.go
@@ -42,8 +42,6 @@ const (
//
// Time may represent time with respect to any clock and may not have any
// meaning in the real world.
-//
-// +stateify savable
type Time struct {
ns int64
}
@@ -288,8 +286,6 @@ type TimerListener interface {
}
// Setting contains user-controlled mutable Timer properties.
-//
-// +stateify savable
type Setting struct {
// Enabled is true if the timer is running.
Enabled bool
@@ -375,8 +371,6 @@ func (s Setting) advancedTo(now Time) (Setting, uint64) {
//
// Timers should be created using NewTimer and must be cleaned up by calling
// Timer.Destroy when no longer used.
-//
-// +stateify savable
type Timer struct {
// clock is the time source. clock is immutable.
clock Clock
diff --git a/pkg/sentry/kernel/timekeeper.go b/pkg/sentry/kernel/timekeeper.go
index df5dbe128..4de8ac13b 100644
--- a/pkg/sentry/kernel/timekeeper.go
+++ b/pkg/sentry/kernel/timekeeper.go
@@ -25,8 +25,6 @@ import (
)
// Timekeeper manages all of the kernel clocks.
-//
-// +stateify savable
type Timekeeper struct {
// clocks are the clock sources.
//
diff --git a/pkg/sentry/kernel/timer.go b/pkg/sentry/kernel/timer.go
index 534d03d0f..03a3310be 100644
--- a/pkg/sentry/kernel/timer.go
+++ b/pkg/sentry/kernel/timer.go
@@ -26,8 +26,6 @@ import (
// timekeeperClock is a ktime.Clock that reads time from a
// kernel.Timekeeper-managed clock.
-//
-// +stateify savable
type timekeeperClock struct {
tk *Timekeeper
c sentrytime.ClockID
@@ -51,8 +49,6 @@ func (tc *timekeeperClock) Now() ktime.Time {
// tgClock is a ktime.Clock that measures the time a thread group has spent
// executing.
-//
-// +stateify savable
type tgClock struct {
tg *ThreadGroup
@@ -159,8 +155,6 @@ func (tc *taskClock) Now() ktime.Time {
}
// signalNotifier is a ktime.Listener that sends signals to a ThreadGroup.
-//
-// +stateify savable
type signalNotifier struct {
tg *ThreadGroup
signal linux.Signal
@@ -185,8 +179,6 @@ func (s *signalNotifier) Notify(exp uint64) {
func (s *signalNotifier) Destroy() {}
// TimerManager is a collection of supported process cpu timers.
-//
-// +stateify savable
type TimerManager struct {
// Clocks used to drive thread group execution time timers.
virtClock *tgClock
diff --git a/pkg/sentry/kernel/uts_namespace.go b/pkg/sentry/kernel/uts_namespace.go
index 7e0fe0d21..58e9b4d1b 100644
--- a/pkg/sentry/kernel/uts_namespace.go
+++ b/pkg/sentry/kernel/uts_namespace.go
@@ -22,8 +22,6 @@ import (
// UTSNamespace represents a UTS namespace, a holder of two system identifiers:
// the hostname and domain name.
-//
-// +stateify savable
type UTSNamespace struct {
// mu protects all fields below.
mu sync.Mutex `state:"nosave"`
diff --git a/pkg/sentry/kernel/vdso.go b/pkg/sentry/kernel/vdso.go
index 971e8bc59..0bacbea49 100644
--- a/pkg/sentry/kernel/vdso.go
+++ b/pkg/sentry/kernel/vdso.go
@@ -52,8 +52,6 @@ type vdsoParams struct {
// Everything in the struct is 8 bytes for easy alignment.
//
// It must be kept in sync with params in vdso/vdso_time.cc.
-//
-// +stateify savable
type VDSOParamPage struct {
// The parameter page is fr, allocated from platform.Memory().
platform platform.Platform
diff --git a/pkg/sentry/limits/BUILD b/pkg/sentry/limits/BUILD
index 90f4395d4..3ce41cacc 100644
--- a/pkg/sentry/limits/BUILD
+++ b/pkg/sentry/limits/BUILD
@@ -1,12 +1,22 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "limits_state",
+ srcs = [
+ "limits.go",
+ ],
+ out = "limits_state.go",
+ package = "limits",
+)
go_library(
name = "limits",
srcs = [
"context.go",
"limits.go",
+ "limits_state.go",
"linux.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/limits",
@@ -14,6 +24,7 @@ go_library(
deps = [
"//pkg/abi/linux",
"//pkg/sentry/context",
+ "//pkg/state",
],
)
diff --git a/pkg/sentry/limits/limits.go b/pkg/sentry/limits/limits.go
index 02c8b60e3..4230ba958 100644
--- a/pkg/sentry/limits/limits.go
+++ b/pkg/sentry/limits/limits.go
@@ -47,8 +47,6 @@ const (
const Infinity = ^uint64(0)
// Limit specifies a system limit.
-//
-// +stateify savable
type Limit struct {
// Cur specifies the current limit.
Cur uint64
@@ -57,8 +55,6 @@ type Limit struct {
}
// LimitSet represents the Limits that correspond to each LimitType.
-//
-// +stateify savable
type LimitSet struct {
mu sync.Mutex `state:"nosave"`
data map[LimitType]Limit
diff --git a/pkg/sentry/loader/BUILD b/pkg/sentry/loader/BUILD
index 0beb4561b..e63052c6d 100644
--- a/pkg/sentry/loader/BUILD
+++ b/pkg/sentry/loader/BUILD
@@ -1,7 +1,7 @@
package(licenses = ["notice"]) # Apache 2.0
load("@io_bazel_rules_go//go:def.bzl", "go_embed_data")
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
go_embed_data(
name = "vdso_bin",
@@ -10,12 +10,23 @@ go_embed_data(
var = "vdsoBin",
)
+go_stateify(
+ name = "loader_state",
+ srcs = [
+ "vdso.go",
+ "vdso_state.go",
+ ],
+ out = "loader_state.go",
+ package = "loader",
+)
+
go_library(
name = "loader",
srcs = [
"elf.go",
"interpreter.go",
"loader.go",
+ "loader_state.go",
"vdso.go",
"vdso_state.go",
":vdso_bin",
@@ -29,6 +40,7 @@ go_library(
"//pkg/cpuid",
"//pkg/log",
"//pkg/rand",
+ "//pkg/refs",
"//pkg/sentry/arch",
"//pkg/sentry/context",
"//pkg/sentry/fs",
@@ -43,6 +55,7 @@ go_library(
"//pkg/sentry/uniqueid",
"//pkg/sentry/usage",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
"//pkg/waiter",
],
diff --git a/pkg/sentry/loader/vdso.go b/pkg/sentry/loader/vdso.go
index a06e27ac9..2e8693f8e 100644
--- a/pkg/sentry/loader/vdso.go
+++ b/pkg/sentry/loader/vdso.go
@@ -193,8 +193,6 @@ func validateVDSO(ctx context.Context, f *fs.File, size uint64) (elfInfo, error)
//
// NOTE: to support multiple architectures or operating systems, this
// would need to contain a VDSO for each.
-//
-// +stateify savable
type VDSO struct {
// ParamPage is the VDSO parameter page. This page should be updated to
// inform the VDSO for timekeeping data.
diff --git a/pkg/sentry/loader/vdso_state.go b/pkg/sentry/loader/vdso_state.go
index dc71e1c2d..92004ad9e 100644
--- a/pkg/sentry/loader/vdso_state.go
+++ b/pkg/sentry/loader/vdso_state.go
@@ -18,7 +18,6 @@ import (
"debug/elf"
)
-// +stateify savable
type elfProgHeader struct {
Type elf.ProgType
Flags elf.ProgFlag
diff --git a/pkg/sentry/memmap/BUILD b/pkg/sentry/memmap/BUILD
index c9e0b95a0..2e367e189 100644
--- a/pkg/sentry/memmap/BUILD
+++ b/pkg/sentry/memmap/BUILD
@@ -1,7 +1,18 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "memmap_state",
+ srcs = [
+ "mappable_range.go",
+ "mapping_set.go",
+ "mapping_set_impl.go",
+ ],
+ out = "memmap_state.go",
+ package = "memmap",
+)
go_template_instance(
name = "mappable_range",
@@ -35,6 +46,7 @@ go_library(
"mapping_set.go",
"mapping_set_impl.go",
"memmap.go",
+ "memmap_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/memmap",
visibility = ["//pkg/sentry:internal"],
@@ -44,6 +56,7 @@ go_library(
"//pkg/sentry/context",
"//pkg/sentry/platform",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
],
)
diff --git a/pkg/sentry/memmap/mapping_set.go b/pkg/sentry/memmap/mapping_set.go
index c9483905d..0cd42ffbf 100644
--- a/pkg/sentry/memmap/mapping_set.go
+++ b/pkg/sentry/memmap/mapping_set.go
@@ -35,8 +35,6 @@ import (
type MappingsOfRange map[MappingOfRange]struct{}
// MappingOfRange represents a mapping of a MappableRange.
-//
-// +stateify savable
type MappingOfRange struct {
MappingSpace MappingSpace
AddrRange usermem.AddrRange
diff --git a/pkg/sentry/mm/BUILD b/pkg/sentry/mm/BUILD
index bbdfae247..3f396986a 100644
--- a/pkg/sentry/mm/BUILD
+++ b/pkg/sentry/mm/BUILD
@@ -1,7 +1,24 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "mm_state",
+ srcs = [
+ "aio_context.go",
+ "aio_context_state.go",
+ "file_refcount_set.go",
+ "io_list.go",
+ "mm.go",
+ "pma_set.go",
+ "save_restore.go",
+ "special_mappable.go",
+ "vma_set.go",
+ ],
+ out = "mm_state.go",
+ package = "mm",
+)
go_template_instance(
name = "file_refcount_set",
@@ -84,6 +101,7 @@ go_library(
"lifecycle.go",
"metadata.go",
"mm.go",
+ "mm_state.go",
"pma.go",
"pma_set.go",
"proc_pid_maps.go",
@@ -113,6 +131,7 @@ go_library(
"//pkg/sentry/safemem",
"//pkg/sentry/usage",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/sync",
"//pkg/syserror",
"//pkg/tcpip/buffer",
diff --git a/pkg/sentry/mm/aio_context.go b/pkg/sentry/mm/aio_context.go
index b42156d45..992bde5a5 100644
--- a/pkg/sentry/mm/aio_context.go
+++ b/pkg/sentry/mm/aio_context.go
@@ -28,8 +28,6 @@ import (
)
// aioManager creates and manages asynchronous I/O contexts.
-//
-// +stateify savable
type aioManager struct {
// mu protects below.
mu sync.Mutex `state:"nosave"`
@@ -91,16 +89,12 @@ func (a *aioManager) lookupAIOContext(id uint64) (*AIOContext, bool) {
}
// ioResult is a completed I/O operation.
-//
-// +stateify savable
type ioResult struct {
data interface{}
ioEntry
}
// AIOContext is a single asynchronous I/O context.
-//
-// +stateify savable
type AIOContext struct {
// done is the notification channel used for all requests.
done chan struct{} `state:"nosave"`
@@ -196,8 +190,6 @@ func (ctx *AIOContext) WaitChannel() (chan struct{}, bool) {
// aioMappable implements memmap.MappingIdentity and memmap.Mappable for AIO
// ring buffers.
-//
-// +stateify savable
type aioMappable struct {
refs.AtomicRefCount
diff --git a/pkg/sentry/mm/mm.go b/pkg/sentry/mm/mm.go
index 3299ae164..ce8097b7f 100644
--- a/pkg/sentry/mm/mm.go
+++ b/pkg/sentry/mm/mm.go
@@ -46,8 +46,6 @@ import (
)
// MemoryManager implements a virtual address space.
-//
-// +stateify savable
type MemoryManager struct {
// p is the platform.
//
@@ -209,8 +207,6 @@ type MemoryManager struct {
}
// vma represents a virtual memory area.
-//
-// +stateify savable
type vma struct {
// mappable is the virtual memory object mapped by this vma. If mappable is
// nil, the vma represents a private anonymous mapping.
@@ -350,8 +346,6 @@ func (v *vma) loadRealPerms(b int) {
}
// pma represents a platform mapping area.
-//
-// +stateify savable
type pma struct {
// file is the file mapped by this pma. Only pmas for which file ==
// platform.Platform.Memory() may be saved. pmas hold a reference to the
@@ -386,7 +380,6 @@ type pma struct {
internalMappings safemem.BlockSeq `state:"nosave"`
}
-// +stateify savable
type privateRefs struct {
mu sync.Mutex `state:"nosave"`
diff --git a/pkg/sentry/mm/special_mappable.go b/pkg/sentry/mm/special_mappable.go
index aa2f87107..9d3614034 100644
--- a/pkg/sentry/mm/special_mappable.go
+++ b/pkg/sentry/mm/special_mappable.go
@@ -28,8 +28,6 @@ import (
// semantics similar to Linux's mm/mmap.c:_install_special_mapping(), except
// that SpecialMappable takes ownership of the memory that it represents
// (_install_special_mapping() does not.)
-//
-// +stateify savable
type SpecialMappable struct {
refs.AtomicRefCount
diff --git a/pkg/sentry/platform/BUILD b/pkg/sentry/platform/BUILD
index af9ba5394..15a7fbbc3 100644
--- a/pkg/sentry/platform/BUILD
+++ b/pkg/sentry/platform/BUILD
@@ -1,7 +1,16 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "platform_state",
+ srcs = [
+ "file_range.go",
+ ],
+ out = "platform_state.go",
+ package = "platform",
+)
go_template_instance(
name = "file_range",
@@ -21,6 +30,7 @@ go_library(
"file_range.go",
"mmap_min_addr.go",
"platform.go",
+ "platform_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/platform",
visibility = ["//pkg/sentry:internal"],
@@ -34,6 +44,7 @@ go_library(
"//pkg/sentry/safemem",
"//pkg/sentry/usage",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
],
)
diff --git a/pkg/sentry/platform/filemem/BUILD b/pkg/sentry/platform/filemem/BUILD
index 2a5982763..dadba1d38 100644
--- a/pkg/sentry/platform/filemem/BUILD
+++ b/pkg/sentry/platform/filemem/BUILD
@@ -1,7 +1,18 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "filemem_autogen_state",
+ srcs = [
+ "filemem.go",
+ "filemem_state.go",
+ "usage_set.go",
+ ],
+ out = "filemem_autogen_state.go",
+ package = "filemem",
+)
go_template_instance(
name = "usage_set",
@@ -27,6 +38,7 @@ go_library(
name = "filemem",
srcs = [
"filemem.go",
+ "filemem_autogen_state.go",
"filemem_state.go",
"filemem_unsafe.go",
"usage_set.go",
diff --git a/pkg/sentry/platform/filemem/filemem.go b/pkg/sentry/platform/filemem/filemem.go
index feb020ef8..870274ae1 100644
--- a/pkg/sentry/platform/filemem/filemem.go
+++ b/pkg/sentry/platform/filemem/filemem.go
@@ -155,8 +155,6 @@ type FileMem struct {
}
// usage tracks usage information.
-//
-// +stateify savable
type usageInfo struct {
// kind is the usage kind.
kind usage.MemoryKind
diff --git a/pkg/sentry/socket/BUILD b/pkg/sentry/socket/BUILD
index a320fca0b..929787aa0 100644
--- a/pkg/sentry/socket/BUILD
+++ b/pkg/sentry/socket/BUILD
@@ -1,10 +1,22 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "socket_state",
+ srcs = [
+ "socket.go",
+ ],
+ out = "socket_state_autogen.go",
+ package = "socket",
+)
go_library(
name = "socket",
- srcs = ["socket.go"],
+ srcs = [
+ "socket.go",
+ "socket_state_autogen.go",
+ ],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/socket",
visibility = ["//pkg/sentry:internal"],
deps = [
@@ -17,6 +29,7 @@ go_library(
"//pkg/sentry/kernel/kdefs",
"//pkg/sentry/kernel/time",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserr",
"//pkg/tcpip",
"//pkg/tcpip/transport/unix",
diff --git a/pkg/sentry/socket/control/BUILD b/pkg/sentry/socket/control/BUILD
index c4874fdfb..faf2b4c27 100644
--- a/pkg/sentry/socket/control/BUILD
+++ b/pkg/sentry/socket/control/BUILD
@@ -1,14 +1,26 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
-go_library(
- name = "control",
- srcs = ["control.go"],
- importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/socket/control",
+go_stateify(
+ name = "control_state",
+ srcs = [
+ "control.go",
+ ],
+ out = "control_state.go",
imports = [
"gvisor.googlesource.com/gvisor/pkg/sentry/fs",
],
+ package = "control",
+)
+
+go_library(
+ name = "control",
+ srcs = [
+ "control.go",
+ "control_state.go",
+ ],
+ importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/socket/control",
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
@@ -19,6 +31,7 @@ go_library(
"//pkg/sentry/kernel/auth",
"//pkg/sentry/kernel/kdefs",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserror",
"//pkg/tcpip/transport/unix",
],
diff --git a/pkg/sentry/socket/control/control.go b/pkg/sentry/socket/control/control.go
index c31182e69..17ecdd11c 100644
--- a/pkg/sentry/socket/control/control.go
+++ b/pkg/sentry/socket/control/control.go
@@ -51,8 +51,6 @@ type SCMRights interface {
// RightsFiles represents a SCM_RIGHTS socket control message. A reference is
// maintained for each fs.File and is release either when an FD is created or
// when the Release method is called.
-//
-// +stateify savable
type RightsFiles []*fs.File
// NewSCMRights creates a new SCM_RIGHTS socket control message representation
@@ -130,8 +128,6 @@ func PackRights(t *kernel.Task, rights SCMRights, cloexec bool, buf []byte) []by
}
// scmCredentials represents an SCM_CREDENTIALS socket control message.
-//
-// +stateify savable
type scmCredentials struct {
t *kernel.Task
kuid auth.KUID
diff --git a/pkg/sentry/socket/epsocket/BUILD b/pkg/sentry/socket/epsocket/BUILD
index 49af8db85..7ad5e88c5 100644
--- a/pkg/sentry/socket/epsocket/BUILD
+++ b/pkg/sentry/socket/epsocket/BUILD
@@ -1,12 +1,24 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "epsocket_state",
+ srcs = [
+ "epsocket.go",
+ "save_restore.go",
+ "stack.go",
+ ],
+ out = "epsocket_state.go",
+ package = "epsocket",
+)
go_library(
name = "epsocket",
srcs = [
"device.go",
"epsocket.go",
+ "epsocket_state.go",
"provider.go",
"save_restore.go",
"stack.go",
@@ -19,6 +31,7 @@ go_library(
"//pkg/abi/linux",
"//pkg/binary",
"//pkg/log",
+ "//pkg/refs",
"//pkg/sentry/arch",
"//pkg/sentry/context",
"//pkg/sentry/device",
@@ -31,6 +44,7 @@ go_library(
"//pkg/sentry/safemem",
"//pkg/sentry/socket",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserr",
"//pkg/syserror",
"//pkg/tcpip",
diff --git a/pkg/sentry/socket/epsocket/epsocket.go b/pkg/sentry/socket/epsocket/epsocket.go
index f969a1d7c..a2927e1b9 100644
--- a/pkg/sentry/socket/epsocket/epsocket.go
+++ b/pkg/sentry/socket/epsocket/epsocket.go
@@ -95,8 +95,6 @@ type commonEndpoint interface {
// SocketOperations encapsulates all the state needed to represent a network stack
// endpoint in the kernel context.
-//
-// +stateify savable
type SocketOperations struct {
socket.ReceiveTimeout
fsutil.PipeSeek `state:"nosave"`
diff --git a/pkg/sentry/socket/epsocket/stack.go b/pkg/sentry/socket/epsocket/stack.go
index 12b4b4767..ec1d96ccb 100644
--- a/pkg/sentry/socket/epsocket/stack.go
+++ b/pkg/sentry/socket/epsocket/stack.go
@@ -26,8 +26,6 @@ import (
)
// Stack implements inet.Stack for netstack/tcpip/stack.Stack.
-//
-// +stateify savable
type Stack struct {
Stack *stack.Stack `state:"manual"`
}
diff --git a/pkg/sentry/socket/hostinet/BUILD b/pkg/sentry/socket/hostinet/BUILD
index d623718b3..227ca3926 100644
--- a/pkg/sentry/socket/hostinet/BUILD
+++ b/pkg/sentry/socket/hostinet/BUILD
@@ -1,12 +1,24 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "hostinet_state",
+ srcs = [
+ "save_restore.go",
+ "socket.go",
+ "stack.go",
+ ],
+ out = "hostinet_autogen_state.go",
+ package = "hostinet",
+)
go_library(
name = "hostinet",
srcs = [
"device.go",
"hostinet.go",
+ "hostinet_autogen_state.go",
"save_restore.go",
"socket.go",
"socket_unsafe.go",
@@ -30,6 +42,7 @@ go_library(
"//pkg/sentry/safemem",
"//pkg/sentry/socket",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserr",
"//pkg/syserror",
"//pkg/tcpip/transport/unix",
diff --git a/pkg/sentry/socket/netlink/BUILD b/pkg/sentry/socket/netlink/BUILD
index b852165f7..b23a243f7 100644
--- a/pkg/sentry/socket/netlink/BUILD
+++ b/pkg/sentry/socket/netlink/BUILD
@@ -1,11 +1,21 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "netlink_state",
+ srcs = [
+ "socket.go",
+ ],
+ out = "netlink_state.go",
+ package = "netlink",
+)
go_library(
name = "netlink",
srcs = [
"message.go",
+ "netlink_state.go",
"provider.go",
"socket.go",
],
@@ -26,6 +36,7 @@ go_library(
"//pkg/sentry/socket/netlink/port",
"//pkg/sentry/socket/unix",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserr",
"//pkg/syserror",
"//pkg/tcpip",
diff --git a/pkg/sentry/socket/netlink/port/BUILD b/pkg/sentry/socket/netlink/port/BUILD
index 3a7dbc5ed..ba6f686e4 100644
--- a/pkg/sentry/socket/netlink/port/BUILD
+++ b/pkg/sentry/socket/netlink/port/BUILD
@@ -1,12 +1,23 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "port_state",
+ srcs = ["port.go"],
+ out = "port_state.go",
+ package = "port",
+)
go_library(
name = "port",
- srcs = ["port.go"],
+ srcs = [
+ "port.go",
+ "port_state.go",
+ ],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/socket/netlink/port",
visibility = ["//pkg/sentry:internal"],
+ deps = ["//pkg/state"],
)
go_test(
diff --git a/pkg/sentry/socket/netlink/port/port.go b/pkg/sentry/socket/netlink/port/port.go
index 1c5d4c3a5..4ccf0b84c 100644
--- a/pkg/sentry/socket/netlink/port/port.go
+++ b/pkg/sentry/socket/netlink/port/port.go
@@ -32,8 +32,6 @@ import (
const maxPorts = 10000
// Manager allocates netlink port IDs.
-//
-// +stateify savable
type Manager struct {
// mu protects the fields below.
mu sync.Mutex `state:"nosave"`
diff --git a/pkg/sentry/socket/netlink/route/BUILD b/pkg/sentry/socket/netlink/route/BUILD
index e1bcfe252..726469fc9 100644
--- a/pkg/sentry/socket/netlink/route/BUILD
+++ b/pkg/sentry/socket/netlink/route/BUILD
@@ -1,19 +1,32 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "route_state",
+ srcs = ["protocol.go"],
+ out = "route_state.go",
+ package = "route",
+)
go_library(
name = "route",
- srcs = ["protocol.go"],
+ srcs = [
+ "protocol.go",
+ "route_state.go",
+ ],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/socket/netlink/route",
visibility = ["//pkg/sentry:internal"],
deps = [
"//pkg/abi/linux",
"//pkg/sentry/context",
+ "//pkg/sentry/fs",
"//pkg/sentry/inet",
"//pkg/sentry/kernel",
"//pkg/sentry/kernel/auth",
"//pkg/sentry/socket/netlink",
+ "//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserr",
],
)
diff --git a/pkg/sentry/socket/netlink/route/protocol.go b/pkg/sentry/socket/netlink/route/protocol.go
index 55a76e916..e8030c518 100644
--- a/pkg/sentry/socket/netlink/route/protocol.go
+++ b/pkg/sentry/socket/netlink/route/protocol.go
@@ -43,8 +43,6 @@ func typeKind(typ uint16) commandKind {
}
// Protocol implements netlink.Protocol.
-//
-// +stateify savable
type Protocol struct{}
var _ netlink.Protocol = (*Protocol)(nil)
diff --git a/pkg/sentry/socket/netlink/socket.go b/pkg/sentry/socket/netlink/socket.go
index e15d1546c..0b8f528d0 100644
--- a/pkg/sentry/socket/netlink/socket.go
+++ b/pkg/sentry/socket/netlink/socket.go
@@ -51,8 +51,6 @@ var netlinkSocketDevice = device.NewAnonDevice()
// to/from the kernel.
//
// Socket implements socket.Socket.
-//
-// +stateify savable
type Socket struct {
socket.ReceiveTimeout
fsutil.PipeSeek `state:"nosave"`
diff --git a/pkg/sentry/socket/socket.go b/pkg/sentry/socket/socket.go
index 54fe64595..bd4858a34 100644
--- a/pkg/sentry/socket/socket.go
+++ b/pkg/sentry/socket/socket.go
@@ -195,8 +195,6 @@ func NewDirent(ctx context.Context, d *device.Device) *fs.Dirent {
//
// Care must be taken when copying ReceiveTimeout as it contains atomic
// variables.
-//
-// +stateify savable
type ReceiveTimeout struct {
// ns is length of the timeout in nanoseconds.
//
diff --git a/pkg/sentry/socket/unix/BUILD b/pkg/sentry/socket/unix/BUILD
index 9fe681e9a..7d04d6b6b 100644
--- a/pkg/sentry/socket/unix/BUILD
+++ b/pkg/sentry/socket/unix/BUILD
@@ -1,6 +1,15 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "unix_state",
+ srcs = [
+ "unix.go",
+ ],
+ out = "unix_state.go",
+ package = "unix",
+)
go_library(
name = "unix",
@@ -8,6 +17,7 @@ go_library(
"device.go",
"io.go",
"unix.go",
+ "unix_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/socket/unix",
visibility = ["//pkg/sentry:internal"],
@@ -27,6 +37,7 @@ go_library(
"//pkg/sentry/socket/control",
"//pkg/sentry/socket/epsocket",
"//pkg/sentry/usermem",
+ "//pkg/state",
"//pkg/syserr",
"//pkg/syserror",
"//pkg/tcpip",
diff --git a/pkg/sentry/socket/unix/unix.go b/pkg/sentry/socket/unix/unix.go
index 5b6411f97..27bacbbc3 100644
--- a/pkg/sentry/socket/unix/unix.go
+++ b/pkg/sentry/socket/unix/unix.go
@@ -42,8 +42,6 @@ import (
// SocketOperations is a Unix socket. It is similar to an epsocket, except it is backed
// by a unix.Endpoint instead of a tcpip.Endpoint.
-//
-// +stateify savable
type SocketOperations struct {
refs.AtomicRefCount
socket.ReceiveTimeout
diff --git a/pkg/sentry/syscalls/linux/BUILD b/pkg/sentry/syscalls/linux/BUILD
index e4450a093..574621ad2 100644
--- a/pkg/sentry/syscalls/linux/BUILD
+++ b/pkg/sentry/syscalls/linux/BUILD
@@ -1,6 +1,18 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "linux_state",
+ srcs = [
+ "sys_aio.go",
+ "sys_futex.go",
+ "sys_poll.go",
+ "sys_time.go",
+ ],
+ out = "linux_state.go",
+ package = "linux",
+)
go_library(
name = "linux",
@@ -8,6 +20,7 @@ go_library(
"error.go",
"flags.go",
"linux64.go",
+ "linux_state.go",
"sigset.go",
"sys_aio.go",
"sys_capability.go",
@@ -53,6 +66,7 @@ go_library(
"//pkg/abi/linux",
"//pkg/binary",
"//pkg/bpf",
+ "//pkg/eventchannel",
"//pkg/log",
"//pkg/metric",
"//pkg/rand",
@@ -60,6 +74,7 @@ go_library(
"//pkg/sentry/context",
"//pkg/sentry/fs",
"//pkg/sentry/fs/anon",
+ "//pkg/sentry/fs/fsutil",
"//pkg/sentry/fs/lock",
"//pkg/sentry/fs/timerfd",
"//pkg/sentry/kernel",
@@ -70,6 +85,7 @@ go_library(
"//pkg/sentry/kernel/kdefs",
"//pkg/sentry/kernel/pipe",
"//pkg/sentry/kernel/sched",
+ "//pkg/sentry/kernel/semaphore",
"//pkg/sentry/kernel/shm",
"//pkg/sentry/kernel/time",
"//pkg/sentry/limits",
@@ -81,6 +97,8 @@ go_library(
"//pkg/sentry/syscalls",
"//pkg/sentry/usage",
"//pkg/sentry/usermem",
+ "//pkg/state",
+ "//pkg/syserr",
"//pkg/syserror",
"//pkg/tcpip/transport/unix",
"//pkg/waiter",
diff --git a/pkg/sentry/syscalls/linux/sys_aio.go b/pkg/sentry/syscalls/linux/sys_aio.go
index 54e4afa9e..fc3397081 100644
--- a/pkg/sentry/syscalls/linux/sys_aio.go
+++ b/pkg/sentry/syscalls/linux/sys_aio.go
@@ -69,8 +69,6 @@ type ioCallback struct {
}
// ioEvent describes an I/O result.
-//
-// +stateify savable
type ioEvent struct {
Data uint64
Obj uint64
diff --git a/pkg/sentry/syscalls/linux/sys_futex.go b/pkg/sentry/syscalls/linux/sys_futex.go
index 1a0e1f5fb..57762d058 100644
--- a/pkg/sentry/syscalls/linux/sys_futex.go
+++ b/pkg/sentry/syscalls/linux/sys_futex.go
@@ -132,8 +132,6 @@ func (f futexChecker) Op(addr uintptr, opIn uint32) (bool, error) {
// futexWaitRestartBlock encapsulates the state required to restart futex(2)
// via restart_syscall(2).
-//
-// +stateify savable
type futexWaitRestartBlock struct {
duration time.Duration
diff --git a/pkg/sentry/syscalls/linux/sys_poll.go b/pkg/sentry/syscalls/linux/sys_poll.go
index b9bdefadb..d4dbfd285 100644
--- a/pkg/sentry/syscalls/linux/sys_poll.go
+++ b/pkg/sentry/syscalls/linux/sys_poll.go
@@ -274,8 +274,6 @@ func copyOutTimevalRemaining(t *kernel.Task, startNs ktime.Time, timeout time.Du
// pollRestartBlock encapsulates the state required to restart poll(2) via
// restart_syscall(2).
-//
-// +stateify savable
type pollRestartBlock struct {
pfdAddr usermem.Addr
nfds uint
diff --git a/pkg/sentry/syscalls/linux/sys_time.go b/pkg/sentry/syscalls/linux/sys_time.go
index 8e6683444..dcee694b2 100644
--- a/pkg/sentry/syscalls/linux/sys_time.go
+++ b/pkg/sentry/syscalls/linux/sys_time.go
@@ -168,8 +168,6 @@ func Time(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.SyscallC
// clockNanosleepRestartBlock encapsulates the state required to restart
// clock_nanosleep(2) via restart_syscall(2).
-//
-// +stateify savable
type clockNanosleepRestartBlock struct {
c ktime.Clock
duration time.Duration
diff --git a/pkg/sentry/usage/BUILD b/pkg/sentry/usage/BUILD
index 868dfd400..edee44d96 100644
--- a/pkg/sentry/usage/BUILD
+++ b/pkg/sentry/usage/BUILD
@@ -1,6 +1,17 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "usage_state",
+ srcs = [
+ "cpu.go",
+ "io.go",
+ "memory.go",
+ ],
+ out = "usage_state.go",
+ package = "usage",
+)
go_library(
name = "usage",
@@ -10,6 +21,7 @@ go_library(
"memory.go",
"memory_unsafe.go",
"usage.go",
+ "usage_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/usage",
visibility = [
@@ -17,6 +29,9 @@ go_library(
],
deps = [
"//pkg/bits",
+ "//pkg/log",
"//pkg/sentry/memutil",
+ "//pkg/state",
+ "@org_golang_x_sys//unix:go_default_library",
],
)
diff --git a/pkg/sentry/usage/cpu.go b/pkg/sentry/usage/cpu.go
index ed7b04b9e..1c2cc90e1 100644
--- a/pkg/sentry/usage/cpu.go
+++ b/pkg/sentry/usage/cpu.go
@@ -20,8 +20,6 @@ import (
// CPUStats contains the subset of struct rusage fields that relate to CPU
// scheduling.
-//
-// +stateify savable
type CPUStats struct {
// UserTime is the amount of time spent executing application code.
UserTime time.Duration
diff --git a/pkg/sentry/usage/io.go b/pkg/sentry/usage/io.go
index 49faa507d..a05053c32 100644
--- a/pkg/sentry/usage/io.go
+++ b/pkg/sentry/usage/io.go
@@ -19,8 +19,6 @@ import (
)
// IO contains I/O-related statistics.
-//
-// +stateify savable
type IO struct {
// CharsRead is the number of bytes read by read syscalls.
CharsRead uint64
diff --git a/pkg/sentry/usermem/BUILD b/pkg/sentry/usermem/BUILD
index 69ba919e0..9dd1cd2b5 100644
--- a/pkg/sentry/usermem/BUILD
+++ b/pkg/sentry/usermem/BUILD
@@ -1,7 +1,19 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "usermem_state",
+ srcs = [
+ "access_type.go",
+ "addr.go",
+ "addr_range.go",
+ "addr_range_seq_unsafe.go",
+ ],
+ out = "usermem_state.go",
+ package = "usermem",
+)
go_template_instance(
name = "addr_range",
@@ -24,6 +36,7 @@ go_library(
"bytes_io.go",
"bytes_io_unsafe.go",
"usermem.go",
+ "usermem_state.go",
"usermem_x86.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/usermem",
@@ -34,6 +47,7 @@ go_library(
"//pkg/log",
"//pkg/sentry/context",
"//pkg/sentry/safemem",
+ "//pkg/state",
"//pkg/syserror",
"//pkg/tcpip/buffer",
],
diff --git a/pkg/sentry/usermem/access_type.go b/pkg/sentry/usermem/access_type.go
index 75346d854..7eabecf30 100644
--- a/pkg/sentry/usermem/access_type.go
+++ b/pkg/sentry/usermem/access_type.go
@@ -20,8 +20,6 @@ import (
// AccessType specifies memory access types. This is used for
// setting mapping permissions, as well as communicating faults.
-//
-// +stateify savable
type AccessType struct {
// Read is read access.
Read bool
diff --git a/pkg/sentry/usermem/addr.go b/pkg/sentry/usermem/addr.go
index fc94bee80..d175fdc74 100644
--- a/pkg/sentry/usermem/addr.go
+++ b/pkg/sentry/usermem/addr.go
@@ -19,8 +19,6 @@ import (
)
// Addr represents a generic virtual address.
-//
-// +stateify savable
type Addr uintptr
// AddLength adds the given length to start and returns the result. ok is true
diff --git a/pkg/tcpip/BUILD b/pkg/tcpip/BUILD
index 5153bd3b4..391d801d0 100644
--- a/pkg/tcpip/BUILD
+++ b/pkg/tcpip/BUILD
@@ -1,13 +1,26 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "tcpip_state",
+ srcs = [
+ "tcpip.go",
+ ],
+ out = "tcpip_state.go",
+ package = "tcpip",
+)
go_library(
name = "tcpip",
- srcs = ["tcpip.go"],
+ srcs = [
+ "tcpip.go",
+ "tcpip_state.go",
+ ],
importpath = "gvisor.googlesource.com/gvisor/pkg/tcpip",
visibility = ["//visibility:public"],
deps = [
+ "//pkg/state",
"//pkg/tcpip/buffer",
"//pkg/waiter",
],
diff --git a/pkg/tcpip/buffer/BUILD b/pkg/tcpip/buffer/BUILD
index 11a725423..efeb6a448 100644
--- a/pkg/tcpip/buffer/BUILD
+++ b/pkg/tcpip/buffer/BUILD
@@ -1,15 +1,26 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "buffer_state",
+ srcs = [
+ "view.go",
+ ],
+ out = "buffer_state.go",
+ package = "buffer",
+)
go_library(
name = "buffer",
srcs = [
+ "buffer_state.go",
"prependable.go",
"view.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/tcpip/buffer",
visibility = ["//visibility:public"],
+ deps = ["//pkg/state"],
)
go_test(
diff --git a/pkg/tcpip/buffer/view.go b/pkg/tcpip/buffer/view.go
index bbb4e1d24..a5774a327 100644
--- a/pkg/tcpip/buffer/view.go
+++ b/pkg/tcpip/buffer/view.go
@@ -54,8 +54,6 @@ func (v *View) ToVectorisedView(views [1]View) VectorisedView {
// VectorisedView is a vectorised version of View using non contigous memory.
// It supports all the convenience methods supported by View.
-//
-// +stateify savable
type VectorisedView struct {
views []View
size int
diff --git a/pkg/tcpip/header/BUILD b/pkg/tcpip/header/BUILD
index 8f22ba3a5..3aa2cfb24 100644
--- a/pkg/tcpip/header/BUILD
+++ b/pkg/tcpip/header/BUILD
@@ -1,6 +1,15 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "tcp_header_state",
+ srcs = [
+ "tcp.go",
+ ],
+ out = "tcp_header_state.go",
+ package = "header",
+)
go_library(
name = "header",
@@ -16,11 +25,13 @@ go_library(
"ipv6.go",
"ipv6_fragment.go",
"tcp.go",
+ "tcp_header_state.go",
"udp.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/tcpip/header",
visibility = ["//visibility:public"],
deps = [
+ "//pkg/state",
"//pkg/tcpip",
"//pkg/tcpip/seqnum",
],
diff --git a/pkg/tcpip/header/tcp.go b/pkg/tcpip/header/tcp.go
index 6689a6dc5..a95d282b0 100644
--- a/pkg/tcpip/header/tcp.go
+++ b/pkg/tcpip/header/tcp.go
@@ -120,8 +120,6 @@ type TCPSynOptions struct {
}
// SACKBlock represents a single contiguous SACK block.
-//
-// +stateify savable
type SACKBlock struct {
// Start indicates the lowest sequence number in the block.
Start seqnum.Value
@@ -133,8 +131,6 @@ type SACKBlock struct {
// TCPOptions are used to parse and cache the TCP segment options for a non
// syn/syn-ack segment.
-//
-// +stateify savable
type TCPOptions struct {
// TS is true if the TimeStamp option is enabled.
TS bool
diff --git a/pkg/tcpip/network/fragmentation/BUILD b/pkg/tcpip/network/fragmentation/BUILD
index 83b4d253f..ac97ebe43 100644
--- a/pkg/tcpip/network/fragmentation/BUILD
+++ b/pkg/tcpip/network/fragmentation/BUILD
@@ -1,7 +1,14 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "fragmentation_state",
+ srcs = ["reassembler_list.go"],
+ out = "fragmentation_state.go",
+ package = "fragmentation",
+)
go_template_instance(
name = "reassembler_list",
@@ -19,6 +26,7 @@ go_library(
srcs = [
"frag_heap.go",
"fragmentation.go",
+ "fragmentation_state.go",
"reassembler.go",
"reassembler_list.go",
],
@@ -26,6 +34,7 @@ go_library(
visibility = ["//:sandbox"],
deps = [
"//pkg/log",
+ "//pkg/state",
"//pkg/tcpip/buffer",
],
)
diff --git a/pkg/tcpip/seqnum/BUILD b/pkg/tcpip/seqnum/BUILD
index c5c889239..a75869dac 100644
--- a/pkg/tcpip/seqnum/BUILD
+++ b/pkg/tcpip/seqnum/BUILD
@@ -1,12 +1,25 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "seqnum_state",
+ srcs = [
+ "seqnum.go",
+ ],
+ out = "seqnum_state.go",
+ package = "seqnum",
+)
go_library(
name = "seqnum",
- srcs = ["seqnum.go"],
+ srcs = [
+ "seqnum.go",
+ "seqnum_state.go",
+ ],
importpath = "gvisor.googlesource.com/gvisor/pkg/tcpip/seqnum",
visibility = [
"//visibility:public",
],
+ deps = ["//pkg/state"],
)
diff --git a/pkg/tcpip/tcpip.go b/pkg/tcpip/tcpip.go
index af0aec85c..eb1e4645d 100644
--- a/pkg/tcpip/tcpip.go
+++ b/pkg/tcpip/tcpip.go
@@ -213,8 +213,6 @@ const (
// FullAddress represents a full transport node address, as required by the
// Connect() and Bind() methods.
-//
-// +stateify savable
type FullAddress struct {
// NIC is the ID of the NIC this address refers to.
//
@@ -258,8 +256,6 @@ func (s SlicePayload) Size() int {
}
// A ControlMessages contains socket control messages for IP sockets.
-//
-// +stateify savable
type ControlMessages struct {
// HasTimestamp indicates whether Timestamp is valid/set.
HasTimestamp bool
diff --git a/pkg/tcpip/transport/ping/BUILD b/pkg/tcpip/transport/ping/BUILD
index 117532fea..28e3e1700 100644
--- a/pkg/tcpip/transport/ping/BUILD
+++ b/pkg/tcpip/transport/ping/BUILD
@@ -1,7 +1,19 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "ping_state",
+ srcs = [
+ "endpoint.go",
+ "endpoint_state.go",
+ "ping_packet_list.go",
+ ],
+ out = "ping_state.go",
+ imports = ["gvisor.googlesource.com/gvisor/pkg/tcpip/buffer"],
+ package = "ping",
+)
go_template_instance(
name = "ping_packet_list",
@@ -20,13 +32,14 @@ go_library(
"endpoint.go",
"endpoint_state.go",
"ping_packet_list.go",
+ "ping_state.go",
"protocol.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/tcpip/transport/ping",
- imports = ["gvisor.googlesource.com/gvisor/pkg/tcpip/buffer"],
visibility = ["//visibility:public"],
deps = [
"//pkg/sleep",
+ "//pkg/state",
"//pkg/tcpip",
"//pkg/tcpip/buffer",
"//pkg/tcpip/header",
diff --git a/pkg/tcpip/transport/ping/endpoint.go b/pkg/tcpip/transport/ping/endpoint.go
index a22684de9..f15e44b61 100644
--- a/pkg/tcpip/transport/ping/endpoint.go
+++ b/pkg/tcpip/transport/ping/endpoint.go
@@ -26,7 +26,6 @@ import (
"gvisor.googlesource.com/gvisor/pkg/waiter"
)
-// +stateify savable
type pingPacket struct {
pingPacketEntry
senderAddress tcpip.FullAddress
diff --git a/pkg/tcpip/transport/queue/BUILD b/pkg/tcpip/transport/queue/BUILD
index 6dcec312e..fb878ad36 100644
--- a/pkg/tcpip/transport/queue/BUILD
+++ b/pkg/tcpip/transport/queue/BUILD
@@ -1,14 +1,27 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "queue_state",
+ srcs = [
+ "queue.go",
+ ],
+ out = "queue_state.go",
+ package = "queue",
+)
go_library(
name = "queue",
- srcs = ["queue.go"],
+ srcs = [
+ "queue.go",
+ "queue_state.go",
+ ],
importpath = "gvisor.googlesource.com/gvisor/pkg/tcpip/transport/queue",
visibility = ["//:sandbox"],
deps = [
"//pkg/ilist",
+ "//pkg/state",
"//pkg/tcpip",
"//pkg/waiter",
],
diff --git a/pkg/tcpip/transport/queue/queue.go b/pkg/tcpip/transport/queue/queue.go
index eb9ee8a3f..6a17441ae 100644
--- a/pkg/tcpip/transport/queue/queue.go
+++ b/pkg/tcpip/transport/queue/queue.go
@@ -33,8 +33,6 @@ type Entry interface {
}
// Queue is a buffer queue.
-//
-// +stateify savable
type Queue struct {
ReaderQueue *waiter.Queue
WriterQueue *waiter.Queue
diff --git a/pkg/tcpip/transport/tcp/BUILD b/pkg/tcpip/transport/tcp/BUILD
index 9ebae6cc7..6a7153e4d 100644
--- a/pkg/tcpip/transport/tcp/BUILD
+++ b/pkg/tcpip/transport/tcp/BUILD
@@ -1,7 +1,27 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "tcp_state",
+ srcs = [
+ "endpoint.go",
+ "endpoint_state.go",
+ "rcv.go",
+ "reno.go",
+ "segment.go",
+ "segment_heap.go",
+ "segment_queue.go",
+ "segment_state.go",
+ "snd.go",
+ "snd_state.go",
+ "tcp_segment_list.go",
+ ],
+ out = "tcp_state.go",
+ imports = ["gvisor.googlesource.com/gvisor/pkg/tcpip/buffer"],
+ package = "tcp",
+)
go_template_instance(
name = "tcp_segment_list",
@@ -33,14 +53,15 @@ go_library(
"snd.go",
"snd_state.go",
"tcp_segment_list.go",
+ "tcp_state.go",
"timer.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/tcpip/transport/tcp",
- imports = ["gvisor.googlesource.com/gvisor/pkg/tcpip/buffer"],
visibility = ["//visibility:public"],
deps = [
"//pkg/rand",
"//pkg/sleep",
+ "//pkg/state",
"//pkg/tcpip",
"//pkg/tcpip/buffer",
"//pkg/tcpip/header",
diff --git a/pkg/tcpip/transport/tcp/endpoint.go b/pkg/tcpip/transport/tcp/endpoint.go
index de1883d84..5b8a1e20f 100644
--- a/pkg/tcpip/transport/tcp/endpoint.go
+++ b/pkg/tcpip/transport/tcp/endpoint.go
@@ -54,8 +54,6 @@ const (
)
// SACKInfo holds TCP SACK related information for a given endpoint.
-//
-// +stateify savable
type SACKInfo struct {
// Blocks is the maximum number of SACK blocks we track
// per endpoint.
@@ -71,8 +69,6 @@ type SACKInfo struct {
// have concurrent goroutines make calls into the endpoint, they are properly
// synchronized. The protocol implementation, however, runs in a single
// goroutine.
-//
-// +stateify savable
type endpoint struct {
// workMu is used to arbitrate which goroutine may perform protocol
// work. Only the main protocol goroutine is expected to call Lock() on
diff --git a/pkg/tcpip/transport/tcp/rcv.go b/pkg/tcpip/transport/tcp/rcv.go
index 92ef9c6f7..b22a00ce1 100644
--- a/pkg/tcpip/transport/tcp/rcv.go
+++ b/pkg/tcpip/transport/tcp/rcv.go
@@ -22,8 +22,6 @@ import (
// receiver holds the state necessary to receive TCP segments and turn them
// into a stream of bytes.
-//
-// +stateify savable
type receiver struct {
ep *endpoint
diff --git a/pkg/tcpip/transport/tcp/reno.go b/pkg/tcpip/transport/tcp/reno.go
index 03ae8d747..60f170a27 100644
--- a/pkg/tcpip/transport/tcp/reno.go
+++ b/pkg/tcpip/transport/tcp/reno.go
@@ -16,8 +16,6 @@ package tcp
// renoState stores the variables related to TCP New Reno congestion
// control algorithm.
-//
-// +stateify savable
type renoState struct {
s *sender
}
diff --git a/pkg/tcpip/transport/tcp/segment.go b/pkg/tcpip/transport/tcp/segment.go
index 8dccea2ba..40928ba2c 100644
--- a/pkg/tcpip/transport/tcp/segment.go
+++ b/pkg/tcpip/transport/tcp/segment.go
@@ -36,8 +36,6 @@ const (
// segment represents a TCP segment. It holds the payload and parsed TCP segment
// information, and can be added to intrusive lists.
// segment is mostly immutable, the only field allowed to change is viewToDeliver.
-//
-// +stateify savable
type segment struct {
segmentEntry
refCnt int32
diff --git a/pkg/tcpip/transport/tcp/segment_queue.go b/pkg/tcpip/transport/tcp/segment_queue.go
index 6a2d7bc0b..2ddcf5f10 100644
--- a/pkg/tcpip/transport/tcp/segment_queue.go
+++ b/pkg/tcpip/transport/tcp/segment_queue.go
@@ -21,8 +21,6 @@ import (
)
// segmentQueue is a bounded, thread-safe queue of TCP segments.
-//
-// +stateify savable
type segmentQueue struct {
mu sync.Mutex `state:"nosave"`
list segmentList `state:"wait"`
diff --git a/pkg/tcpip/transport/tcp/snd.go b/pkg/tcpip/transport/tcp/snd.go
index 376e81846..e38686e1b 100644
--- a/pkg/tcpip/transport/tcp/snd.go
+++ b/pkg/tcpip/transport/tcp/snd.go
@@ -54,8 +54,6 @@ type congestionControl interface {
}
// sender holds the state necessary to send TCP segments.
-//
-// +stateify savable
type sender struct {
ep *endpoint
@@ -135,8 +133,6 @@ type sender struct {
}
// fastRecovery holds information related to fast recovery from a packet loss.
-//
-// +stateify savable
type fastRecovery struct {
// active whether the endpoint is in fast recovery. The following fields
// are only meaningful when active is true.
diff --git a/pkg/tcpip/transport/tcp/snd_state.go b/pkg/tcpip/transport/tcp/snd_state.go
index d536839af..33c8867f4 100644
--- a/pkg/tcpip/transport/tcp/snd_state.go
+++ b/pkg/tcpip/transport/tcp/snd_state.go
@@ -18,7 +18,6 @@ import (
"time"
)
-// +stateify savable
type unixTime struct {
second int64
nano int64
diff --git a/pkg/tcpip/transport/udp/BUILD b/pkg/tcpip/transport/udp/BUILD
index 1a3a62d3d..790dd55a3 100644
--- a/pkg/tcpip/transport/udp/BUILD
+++ b/pkg/tcpip/transport/udp/BUILD
@@ -1,7 +1,19 @@
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "udp_state",
+ srcs = [
+ "endpoint.go",
+ "endpoint_state.go",
+ "udp_packet_list.go",
+ ],
+ out = "udp_state.go",
+ imports = ["gvisor.googlesource.com/gvisor/pkg/tcpip/buffer"],
+ package = "udp",
+)
go_template_instance(
name = "udp_packet_list",
@@ -21,12 +33,13 @@ go_library(
"endpoint_state.go",
"protocol.go",
"udp_packet_list.go",
+ "udp_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/tcpip/transport/udp",
- imports = ["gvisor.googlesource.com/gvisor/pkg/tcpip/buffer"],
visibility = ["//visibility:public"],
deps = [
"//pkg/sleep",
+ "//pkg/state",
"//pkg/tcpip",
"//pkg/tcpip/buffer",
"//pkg/tcpip/header",
diff --git a/pkg/tcpip/transport/udp/endpoint.go b/pkg/tcpip/transport/udp/endpoint.go
index 03fb76f92..2a32c3a87 100644
--- a/pkg/tcpip/transport/udp/endpoint.go
+++ b/pkg/tcpip/transport/udp/endpoint.go
@@ -25,7 +25,6 @@ import (
"gvisor.googlesource.com/gvisor/pkg/waiter"
)
-// +stateify savable
type udpPacket struct {
udpPacketEntry
senderAddress tcpip.FullAddress
@@ -50,8 +49,6 @@ const (
// between users of the endpoint and the protocol implementation; it is legal to
// have concurrent goroutines make calls into the endpoint, they are properly
// synchronized.
-//
-// +stateify savable
type endpoint struct {
// The following fields are initialized at creation time and do not
// change throughout the lifetime of the endpoint.
diff --git a/pkg/tcpip/transport/unix/BUILD b/pkg/tcpip/transport/unix/BUILD
index dae0bd079..676f2cf92 100644
--- a/pkg/tcpip/transport/unix/BUILD
+++ b/pkg/tcpip/transport/unix/BUILD
@@ -1,6 +1,17 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify")
+
+go_stateify(
+ name = "unix_state",
+ srcs = [
+ "connectioned.go",
+ "connectionless.go",
+ "unix.go",
+ ],
+ out = "unix_state.go",
+ package = "unix",
+)
go_library(
name = "unix",
@@ -9,11 +20,14 @@ go_library(
"connectioned_state.go",
"connectionless.go",
"unix.go",
+ "unix_state.go",
],
importpath = "gvisor.googlesource.com/gvisor/pkg/tcpip/transport/unix",
visibility = ["//:sandbox"],
deps = [
"//pkg/ilist",
+ "//pkg/log",
+ "//pkg/state",
"//pkg/tcpip",
"//pkg/tcpip/buffer",
"//pkg/tcpip/transport/queue",
diff --git a/pkg/tcpip/transport/unix/connectioned.go b/pkg/tcpip/transport/unix/connectioned.go
index dd7c03cf1..0e63186b2 100644
--- a/pkg/tcpip/transport/unix/connectioned.go
+++ b/pkg/tcpip/transport/unix/connectioned.go
@@ -85,8 +85,6 @@ type ConnectingEndpoint interface {
// path != "" && acceptedChan != nil => bound and listening.
//
// Only one of these will be true at any moment.
-//
-// +stateify savable
type connectionedEndpoint struct {
baseEndpoint
diff --git a/pkg/tcpip/transport/unix/connectionless.go b/pkg/tcpip/transport/unix/connectionless.go
index 2a6ec8b4b..3276ddcd0 100644
--- a/pkg/tcpip/transport/unix/connectionless.go
+++ b/pkg/tcpip/transport/unix/connectionless.go
@@ -25,8 +25,6 @@ import (
//
// Specifically, this means datagram unix sockets not created with
// socketpair(2).
-//
-// +stateify savable
type connectionlessEndpoint struct {
baseEndpoint
}
diff --git a/pkg/tcpip/transport/unix/unix.go b/pkg/tcpip/transport/unix/unix.go
index 8e4af3139..190a1ccdb 100644
--- a/pkg/tcpip/transport/unix/unix.go
+++ b/pkg/tcpip/transport/unix/unix.go
@@ -60,8 +60,6 @@ type CredentialsControlMessage interface {
}
// A ControlMessages represents a collection of socket control messages.
-//
-// +stateify savable
type ControlMessages struct {
// Rights is a control message containing FDs.
Rights RightsControlMessage
@@ -237,8 +235,6 @@ type BoundEndpoint interface {
}
// message represents a message passed over a Unix domain socket.
-//
-// +stateify savable
type message struct {
ilist.Entry
@@ -310,8 +306,6 @@ type Receiver interface {
}
// queueReceiver implements Receiver for datagram sockets.
-//
-// +stateify savable
type queueReceiver struct {
readQueue *queue.Queue
}
@@ -375,8 +369,6 @@ func (q *queueReceiver) RecvMaxQueueSize() int64 {
func (*queueReceiver) Release() {}
// streamQueueReceiver implements Receiver for stream sockets.
-//
-// +stateify savable
type streamQueueReceiver struct {
queueReceiver
@@ -587,7 +579,6 @@ type ConnectedEndpoint interface {
Release()
}
-// +stateify savable
type connectedEndpoint struct {
// endpoint represents the subset of the Endpoint functionality needed by
// the connectedEndpoint. It is implemented by both connectionedEndpoint
@@ -680,8 +671,6 @@ func (*connectedEndpoint) Release() {}
// unix domain socket Endpoint implementations.
//
// Not to be used on its own.
-//
-// +stateify savable
type baseEndpoint struct {
*waiter.Queue
diff --git a/pkg/waiter/BUILD b/pkg/waiter/BUILD
index 5e611c54f..8256acdb4 100644
--- a/pkg/waiter/BUILD
+++ b/pkg/waiter/BUILD
@@ -1,13 +1,28 @@
package(licenses = ["notice"]) # Apache 2.0
-load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
+load("//tools/go_stateify:defs.bzl", "go_library", "go_stateify", "go_test")
+
+go_stateify(
+ name = "waiter_state",
+ srcs = [
+ "waiter.go",
+ ],
+ out = "waiter_state.go",
+ package = "waiter",
+)
go_library(
name = "waiter",
- srcs = ["waiter.go"],
+ srcs = [
+ "waiter.go",
+ "waiter_state.go",
+ ],
importpath = "gvisor.googlesource.com/gvisor/pkg/waiter",
visibility = ["//visibility:public"],
- deps = ["//pkg/ilist"],
+ deps = [
+ "//pkg/ilist",
+ "//pkg/state",
+ ],
)
go_test(
diff --git a/pkg/waiter/waiter.go b/pkg/waiter/waiter.go
index 9825880ca..9b189bb9e 100644
--- a/pkg/waiter/waiter.go
+++ b/pkg/waiter/waiter.go
@@ -157,8 +157,6 @@ func NewChannelEntry(c chan struct{}) (Entry, chan struct{}) {
// notifiers can notify them when events happen.
//
// The zero value for waiter.Queue is an empty queue ready for use.
-//
-// +stateify savable
type Queue struct {
list ilist.List `state:"zerovalue"`
mu sync.RWMutex `state:"nosave"`