mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Add GoferClientProvider to devutil.
Also introduce CtxDevGoferClientProvider, which is provided in restore context. PiperOrigin-RevId: 631237657
This commit is contained in:
+12
-1
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user