diff --git a/pkg/sentry/devices/nvproxy/BUILD b/pkg/sentry/devices/nvproxy/BUILD index ff2bf88a6..e7f88fd59 100644 --- a/pkg/sentry/devices/nvproxy/BUILD +++ b/pkg/sentry/devices/nvproxy/BUILD @@ -37,6 +37,7 @@ go_library( "object_free_list.go", "objs_mutex.go", "save_restore.go", + "save_restore_impl.go", "seccomp_filters.go", "uvm.go", "uvm_mmap.go", diff --git a/pkg/sentry/devices/nvproxy/save_restore.go b/pkg/sentry/devices/nvproxy/save_restore.go index f9df43a0e..8c36a1342 100644 --- a/pkg/sentry/devices/nvproxy/save_restore.go +++ b/pkg/sentry/devices/nvproxy/save_restore.go @@ -12,9 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !false -// +build !false - package nvproxy import ( @@ -24,15 +21,11 @@ import ( // beforeSave is invoked by stateify. func (nvp *nvproxy) beforeSave() { - nvp.objsLock() - defer nvp.objsUnlock() - if len(nvp.clients) != 0 { - panic("can't save with live nvproxy clients") - } + nvp.beforeSaveImpl() } // afterLoad is invoked by stateify. -func (nvp *nvproxy) afterLoad(goContext.Context) { +func (nvp *nvproxy) afterLoad(ctx goContext.Context) { Init() abiCons, ok := abis[nvp.version] if !ok { @@ -40,14 +33,25 @@ func (nvp *nvproxy) afterLoad(goContext.Context) { } nvp.abi = abiCons.cons() nvp.objsFreeSet = make(map[*object]struct{}) + nvp.afterLoadImpl(ctx) } // beforeSave is invoked by stateify. func (fd *frontendFD) beforeSave() { - panic("nvproxy.frontendFD is not saveable.") + fd.beforeSaveImpl() +} + +// afterLoad is invoked by stateify. +func (fd *frontendFD) afterLoad(ctx goContext.Context) { + fd.afterLoadImpl(ctx) } // beforeSave is invoked by stateify. func (fd *uvmFD) beforeSave() { - panic("nvproxy.uvmFD is not saveable.") + fd.beforeSaveImpl() +} + +// afterLoad is invoked by stateify. +func (fd *uvmFD) afterLoad(ctx goContext.Context) { + fd.afterLoadImpl(ctx) } diff --git a/pkg/sentry/devices/nvproxy/save_restore_impl.go b/pkg/sentry/devices/nvproxy/save_restore_impl.go new file mode 100644 index 000000000..634d77cd5 --- /dev/null +++ b/pkg/sentry/devices/nvproxy/save_restore_impl.go @@ -0,0 +1,50 @@ +// Copyright 2023 The gVisor Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build !false +// +build !false + +package nvproxy + +import ( + goContext "context" +) + +func (nvp *nvproxy) beforeSaveImpl() { + nvp.objsLock() + defer nvp.objsUnlock() + if len(nvp.clients) != 0 { + panic("can't save with live nvproxy clients") + } +} + +func (nvp *nvproxy) afterLoadImpl(goContext.Context) { + // no-op +} + +func (fd *frontendFD) beforeSaveImpl() { + panic("nvproxy.frontendFD is not saveable") +} + +func (fd *frontendFD) afterLoadImpl(goContext.Context) { + panic("nvproxy.frontendFD is not restorable") +} + +func (fd *uvmFD) beforeSaveImpl() { + panic("nvproxy.uvmFD is not saveable") +} + +func (fd *uvmFD) afterLoadImpl(goContext.Context) { + panic("nvproxy.uvmFD is not restorable") +}