Add GoferClientProvider to devutil.

Also introduce CtxDevGoferClientProvider, which is provided in restore context.

PiperOrigin-RevId: 631237657
This commit is contained in:
Ayush Ranjan
2024-05-06 17:37:13 -07:00
committed by gVisor bot
parent 8a1514cca8
commit db6ee959df
5 changed files with 24 additions and 4 deletions
+12 -1
View File
@@ -14,7 +14,7 @@
package devutil
import "gvisor.dev/gvisor/pkg/context"
import "context"
// contextID is this package's type for context.Context.Value keys.
type contextID int
@@ -22,6 +22,9 @@ type contextID int
const (
// CtxDevGoferClient is a Context.Value key for a /dev gofer client.
CtxDevGoferClient contextID = iota
// CtxDevGoferClientProvider is a Context.Value key for GoferClientProvider.
CtxDevGoferClientProvider
)
// GoferClientFromContext returns the device gofer client used by ctx.
@@ -31,3 +34,11 @@ func GoferClientFromContext(ctx context.Context) *GoferClient {
}
return nil
}
// GoferClientProviderFromContext returns the GoferClientProvider used by ctx.
func GoferClientProviderFromContext(ctx context.Context) GoferClientProvider {
if v := ctx.Value(CtxDevGoferClientProvider); v != nil {
return v.(GoferClientProvider)
}
return nil
}
+5
View File
@@ -122,3 +122,8 @@ func (g *GoferClient) OpenAt(ctx context.Context, name string, flags uint32) (in
client.CloseFD(ctx, childOpenFD, true /* flush */)
return childHostFD, nil
}
// GoferClientProvider provides a GoferClient for a given container.
type GoferClientProvider interface {
GetDevGoferClient(contName string) *GoferClient
}
+4 -2
View File
@@ -943,7 +943,7 @@ func (ctx *createProcessContext) Value(key any) any {
mntns.IncRef()
return mntns
case devutil.CtxDevGoferClient:
return ctx.kernel.getDevGoferClient(ctx.kernel.ContainerName(ctx.args.ContainerID))
return ctx.kernel.GetDevGoferClient(ctx.kernel.ContainerName(ctx.args.ContainerID))
case inet.CtxStack:
return ctx.kernel.RootNetworkNamespace().Stack()
case ktime.CtxRealtimeClock:
@@ -2004,7 +2004,9 @@ func (k *Kernel) RemoveDevGofer(contName string) {
delete(k.devGofers, contName)
}
func (k *Kernel) getDevGoferClient(contName string) *devutil.GoferClient {
// GetDevGoferClient implements
// devutil.GoferClientProviderFromContext.GetDevGoferClient.
func (k *Kernel) GetDevGoferClient(contName string) *devutil.GoferClient {
k.devGofersMu.Lock()
defer k.devGofersMu.Unlock()
return k.devGofers[contName]
+1 -1
View File
@@ -105,7 +105,7 @@ func (t *Task) contextValue(key any, isTaskGoroutine bool) any {
t.mountNamespace.IncRef()
return t.mountNamespace
case devutil.CtxDevGoferClient:
return t.k.getDevGoferClient(t.k.ContainerName(t.containerID))
return t.k.GetDevGoferClient(t.k.ContainerName(t.containerID))
case inet.CtxStack:
return t.NetworkContext()
case ktime.CtxRealtimeClock:
+2
View File
@@ -25,6 +25,7 @@ import (
"gvisor.dev/gvisor/pkg/abi/linux"
"gvisor.dev/gvisor/pkg/cleanup"
"gvisor.dev/gvisor/pkg/context"
"gvisor.dev/gvisor/pkg/devutil"
"gvisor.dev/gvisor/pkg/fd"
"gvisor.dev/gvisor/pkg/log"
"gvisor.dev/gvisor/pkg/sentry/control"
@@ -226,6 +227,7 @@ func (r *restorer) restore(l *Loader) error {
ctx = context.WithValue(ctx, vfs.CtxRestoreFilesystemFDMap, fdmap)
log.Debugf("Restore using mfmap: %v", fdmap)
ctx = context.WithValue(ctx, pgalloc.CtxMemoryFileMap, mfmap)
ctx = context.WithValue(ctx, devutil.CtxDevGoferClientProvider, l.k)
// Load the state.
loadOpts := state.LoadOpts{Source: r.stateFile, PagesMetadata: r.pagesMetadata, PagesFile: r.pagesFile}