mirror of
https://github.com/lingble/meta-tegra.git
synced 2025-10-30 20:07:55 +00:00
external/virtualization-layer: refresh alt-roots patch for nvidia-container-toolkit
to cover the symlink creation hooks as well as the passthrough mounts. Signed-off-by: Matt Madison <matt@madison.systems>
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
From 4af28f6ae3cc08e28db4a498c9d35b526e5f0374 Mon Sep 17 00:00:00 2001
|
From 606ec8e73ff2efbe08105a8c91108eb42c83d835 Mon Sep 17 00:00:00 2001
|
||||||
From: Matt Madison <matt@madison.systems>
|
From: Matt Madison <matt@madison.systems>
|
||||||
Date: Sat, 9 Mar 2024 06:17:17 -0800
|
Date: Sat, 9 Mar 2024 06:17:17 -0800
|
||||||
Subject: [PATCH 1/2] Add support for 'alternate' roots for tegra CSV handling
|
Subject: [PATCH 1/2] Add support for 'alternate' roots for tegra CSV handling
|
||||||
@@ -7,20 +7,20 @@ So the host OS can provide one or more trees of libraries that
|
|||||||
should be mounted into containers, overriding the copies in
|
should be mounted into containers, overriding the copies in
|
||||||
the main rootfs of the host OS.
|
the main rootfs of the host OS.
|
||||||
|
|
||||||
Upstream-Status: Inappropriate [oe-specific]
|
Upstream-Status: Inappropriate [OE-specific]
|
||||||
|
|
||||||
Signed-off-by: Matt Madison <matt@madison.systems>
|
Signed-off-by: Matt Madison <matt@madison.systems>
|
||||||
---
|
---
|
||||||
cmd/nvidia-ctk/cdi/generate/generate.go | 7 +++
|
cmd/nvidia-ctk/cdi/generate/generate.go | 7 +++
|
||||||
internal/config/runtime.go | 3 +-
|
internal/config/runtime.go | 3 +-
|
||||||
internal/config/toml_test.go | 1 +
|
internal/config/toml_test.go | 1 +
|
||||||
internal/modifier/csv.go | 1 +
|
internal/modifier/csv.go | 1 +
|
||||||
internal/platform-support/tegra/csv.go | 62 +++++++++++++++++-------
|
internal/platform-support/tegra/csv.go | 66 ++++++++++++++++-----
|
||||||
internal/platform-support/tegra/tegra.go | 8 +++
|
internal/platform-support/tegra/symlinks.go | 26 +++++---
|
||||||
pkg/nvcdi/lib-csv.go | 1 +
|
internal/platform-support/tegra/tegra.go | 24 +++++++-
|
||||||
pkg/nvcdi/lib.go | 1 +
|
pkg/nvcdi/lib-csv.go | 1 +
|
||||||
pkg/nvcdi/options.go | 8 +++
|
pkg/nvcdi/lib.go | 1 +
|
||||||
9 files changed, 74 insertions(+), 18 deletions(-)
|
pkg/nvcdi/options.go | 8 +++
|
||||||
|
10 files changed, 111 insertions(+), 27 deletions(-)
|
||||||
|
|
||||||
diff --git a/cmd/nvidia-ctk/cdi/generate/generate.go b/cmd/nvidia-ctk/cdi/generate/generate.go
|
diff --git a/cmd/nvidia-ctk/cdi/generate/generate.go b/cmd/nvidia-ctk/cdi/generate/generate.go
|
||||||
index fd46962..89ff4cc 100644
|
index fd46962..89ff4cc 100644
|
||||||
@@ -93,10 +93,10 @@ index 56adcdc..c55b6f7 100644
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to construct CDI library: %v", err)
|
return nil, fmt.Errorf("failed to construct CDI library: %v", err)
|
||||||
diff --git a/internal/platform-support/tegra/csv.go b/internal/platform-support/tegra/csv.go
|
diff --git a/internal/platform-support/tegra/csv.go b/internal/platform-support/tegra/csv.go
|
||||||
index ff2f493..45a5dca 100644
|
index ff2f493..be3bf3a 100644
|
||||||
--- a/internal/platform-support/tegra/csv.go
|
--- a/internal/platform-support/tegra/csv.go
|
||||||
+++ b/internal/platform-support/tegra/csv.go
|
+++ b/internal/platform-support/tegra/csv.go
|
||||||
@@ -43,38 +43,66 @@ func (o tegraOptions) newDiscovererFromCSVFiles() (discover.Discover, error) {
|
@@ -43,39 +43,73 @@ func (o tegraOptions) newDiscovererFromCSVFiles() (discover.Discover, error) {
|
||||||
targetsByType[csv.MountSpecDev],
|
targetsByType[csv.MountSpecDev],
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -104,6 +104,7 @@ index ff2f493..45a5dca 100644
|
|||||||
+ var directories []discover.Discover
|
+ var directories []discover.Discover
|
||||||
+ var libraries []discover.Discover
|
+ var libraries []discover.Discover
|
||||||
+ var symlinks []discover.Discover
|
+ var symlinks []discover.Discover
|
||||||
|
+ var symlinkHooks []discover.Discover
|
||||||
+
|
+
|
||||||
+ symlinkTargets := o.ignorePatterns.Apply(targetsByType[csv.MountSpecSym]...)
|
+ symlinkTargets := o.ignorePatterns.Apply(targetsByType[csv.MountSpecSym]...)
|
||||||
+ o.logger.Debugf("Filtered symlink targets: %v", symlinkTargets)
|
+ o.logger.Debugf("Filtered symlink targets: %v", symlinkTargets)
|
||||||
@@ -117,19 +118,22 @@ index ff2f493..45a5dca 100644
|
|||||||
+ ))
|
+ ))
|
||||||
+
|
+
|
||||||
+ // Libraries and symlinks use the same locator.
|
+ // Libraries and symlinks use the same locator.
|
||||||
+ libraries = append(libraries, discover.NewMounts(
|
+ l := discover.NewMounts(
|
||||||
+ o.logger,
|
+ o.logger,
|
||||||
+ lookup.NewSymlinkLocator(lookup.WithLogger(o.logger), lookup.WithRoot(altRoot)),
|
+ lookup.NewSymlinkLocator(lookup.WithLogger(o.logger), lookup.WithRoot(altRoot)),
|
||||||
+ altRoot,
|
+ altRoot,
|
||||||
+ targetsByType[csv.MountSpecLib],
|
+ targetsByType[csv.MountSpecLib],
|
||||||
+ ))
|
+ )
|
||||||
|
+ libraries = append(libraries, l)
|
||||||
+
|
+
|
||||||
+ symlinks = append(symlinks, discover.NewMounts(
|
+ s := discover.NewMounts(
|
||||||
+ o.logger,
|
+ o.logger,
|
||||||
+ lookup.NewSymlinkLocator(lookup.WithLogger(o.logger), lookup.WithRoot(altRoot)),
|
+ lookup.NewSymlinkLocator(lookup.WithLogger(o.logger), lookup.WithRoot(altRoot)),
|
||||||
+ altRoot,
|
+ altRoot,
|
||||||
+ symlinkTargets,
|
+ symlinkTargets,
|
||||||
+ ))
|
+ )
|
||||||
|
+ symlinks = append(symlinks, s)
|
||||||
|
+ symlinkHooks = append(symlinkHooks, o.createCSVSymlinkHooks(symlinkTargets, l, altRoot))
|
||||||
+ }
|
+ }
|
||||||
+ directories = append(directories, discover.NewMounts(
|
+ directories = append(directories, discover.NewMounts(
|
||||||
o.logger,
|
o.logger,
|
||||||
@@ -152,12 +156,12 @@ index ff2f493..45a5dca 100644
|
|||||||
- o.logger.Debugf("Filtered symlink targets: %v", symlinkTargets)
|
- o.logger.Debugf("Filtered symlink targets: %v", symlinkTargets)
|
||||||
- symlinks := discover.NewMounts(
|
- symlinks := discover.NewMounts(
|
||||||
+ libraries = append(libraries, librariesInDriverRoot)
|
+ libraries = append(libraries, librariesInDriverRoot)
|
||||||
+ symlinks = append(symlinks, discover.NewMounts(
|
+ symlinksInDriverRoot := discover.NewMounts(
|
||||||
o.logger,
|
o.logger,
|
||||||
o.symlinkLocator,
|
o.symlinkLocator,
|
||||||
o.driverRoot,
|
o.driverRoot,
|
||||||
symlinkTargets,
|
symlinkTargets,
|
||||||
- )
|
)
|
||||||
- createSymlinks := o.createCSVSymlinkHooks(symlinkTargets, libraries)
|
- createSymlinks := o.createCSVSymlinkHooks(symlinkTargets, libraries)
|
||||||
-
|
-
|
||||||
- d := discover.Merge(
|
- d := discover.Merge(
|
||||||
@@ -167,24 +171,92 @@ index ff2f493..45a5dca 100644
|
|||||||
- symlinks,
|
- symlinks,
|
||||||
- createSymlinks,
|
- createSymlinks,
|
||||||
- )
|
- )
|
||||||
+ ))
|
+ symlinks = append(symlinks, symlinksInDriverRoot)
|
||||||
+ createSymlinks := o.createCSVSymlinkHooks(symlinkTargets, librariesInDriverRoot)
|
+ symlinkHooks = append(symlinkHooks, o.createCSVSymlinkHooks(symlinkTargets,
|
||||||
+
|
+ librariesInDriverRoot,
|
||||||
|
+ o.driverRoot))
|
||||||
|
|
||||||
+ var allDiscoverers []discover.Discover
|
+ var allDiscoverers []discover.Discover
|
||||||
+ allDiscoverers = append(allDiscoverers, devices)
|
+ allDiscoverers = append(allDiscoverers, devices)
|
||||||
+ allDiscoverers = append(allDiscoverers, directories...)
|
+ allDiscoverers = append(allDiscoverers, directories...)
|
||||||
+ allDiscoverers = append(allDiscoverers, libraries...)
|
+ allDiscoverers = append(allDiscoverers, libraries...)
|
||||||
+ allDiscoverers = append(allDiscoverers, symlinks...)
|
+ allDiscoverers = append(allDiscoverers, symlinks...)
|
||||||
+ allDiscoverers = append(allDiscoverers, createSymlinks)
|
+ allDiscoverers = append(allDiscoverers, symlinkHooks...)
|
||||||
+ d := discover.Merge(allDiscoverers...)
|
+ d := discover.Merge(allDiscoverers...)
|
||||||
|
|
||||||
return d, nil
|
return d, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
diff --git a/internal/platform-support/tegra/symlinks.go b/internal/platform-support/tegra/symlinks.go
|
||||||
|
index c64138d..f4d92a1 100644
|
||||||
|
--- a/internal/platform-support/tegra/symlinks.go
|
||||||
|
+++ b/internal/platform-support/tegra/symlinks.go
|
||||||
|
@@ -39,13 +39,17 @@ type symlinkHook struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
// createCSVSymlinkHooks creates a discoverer for a hook that creates required symlinks in the container
|
||||||
|
-func (o tegraOptions) createCSVSymlinkHooks(targets []string, mounts discover.Discover) discover.Discover {
|
||||||
|
+func (o tegraOptions) createCSVSymlinkHooks(targets []string, mounts discover.Discover, root string) discover.Discover {
|
||||||
|
+ l := o.symlinkChainLocators[root]
|
||||||
|
+ if l == nil {
|
||||||
|
+ l = o.symlinkChainLocator
|
||||||
|
+ }
|
||||||
|
return symlinkHook{
|
||||||
|
logger: o.logger,
|
||||||
|
nvidiaCTKPath: o.nvidiaCTKPath,
|
||||||
|
targets: targets,
|
||||||
|
mountsFrom: mounts,
|
||||||
|
- symlinkChainLocator: o.symlinkChainLocator,
|
||||||
|
+ symlinkChainLocator: l,
|
||||||
|
resolveSymlink: o.resolveSymlink,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -116,7 +120,13 @@ func (d symlinkHook) getSymlinkCandidates() []string {
|
||||||
|
d.logger.Warningf("Failed to locate symlink %v", target)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
- candidates = append(candidates, reslovedSymlinkChain...)
|
||||||
|
+ d.logger.Debugf("getSymlinkCandidates: resolved target %v -> %v", target, reslovedSymlinkChain)
|
||||||
|
+ // When the
|
||||||
|
+ if target != reslovedSymlinkChain[0] {
|
||||||
|
+ candidates = append(candidates, reslovedSymlinkChain[0]+"::"+target)
|
||||||
|
+ } else {
|
||||||
|
+ candidates = append(candidates, reslovedSymlinkChain...)
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
return candidates
|
||||||
|
}
|
||||||
|
@@ -126,20 +136,22 @@ func (d symlinkHook) getCSVFileSymlinks() []string {
|
||||||
|
created := make(map[string]bool)
|
||||||
|
// candidates is a list of absolute paths to symlinks in a chain, or the final target of the chain.
|
||||||
|
for _, candidate := range d.getSymlinkCandidates() {
|
||||||
|
- target, err := d.resolveSymlink(candidate)
|
||||||
|
+ paths := strings.Split(candidate, "::")
|
||||||
|
+ target, err := d.resolveSymlink(paths[0])
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Debugf("Skipping invalid link: %v", err)
|
||||||
|
continue
|
||||||
|
- } else if target == candidate {
|
||||||
|
- d.logger.Debugf("%v is not a symlink", candidate)
|
||||||
|
+ } else if target == paths[0] {
|
||||||
|
+ d.logger.Debugf("%v is not a symlink", paths[0])
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
- link := fmt.Sprintf("%v::%v", target, candidate)
|
||||||
|
+ link := fmt.Sprintf("%v::%v", target, paths[len(paths)-1])
|
||||||
|
if created[link] {
|
||||||
|
d.logger.Debugf("skipping duplicate link: %v", link)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
+ d.logger.Debugf("getCSVFileSymlinks: for candidate %v, make link %v", candidate, link)
|
||||||
|
created[link] = true
|
||||||
|
|
||||||
|
links = append(links, link)
|
||||||
diff --git a/internal/platform-support/tegra/tegra.go b/internal/platform-support/tegra/tegra.go
|
diff --git a/internal/platform-support/tegra/tegra.go b/internal/platform-support/tegra/tegra.go
|
||||||
index ad5c5b6..12ccfce 100644
|
index ad5c5b6..ae09245 100644
|
||||||
--- a/internal/platform-support/tegra/tegra.go
|
--- a/internal/platform-support/tegra/tegra.go
|
||||||
+++ b/internal/platform-support/tegra/tegra.go
|
+++ b/internal/platform-support/tegra/tegra.go
|
||||||
@@ -29,6 +29,7 @@ type tegraOptions struct {
|
@@ -29,13 +29,15 @@ type tegraOptions struct {
|
||||||
logger logger.Interface
|
logger logger.Interface
|
||||||
csvFiles []string
|
csvFiles []string
|
||||||
driverRoot string
|
driverRoot string
|
||||||
@@ -192,7 +264,39 @@ index ad5c5b6..12ccfce 100644
|
|||||||
nvidiaCTKPath string
|
nvidiaCTKPath string
|
||||||
librarySearchPaths []string
|
librarySearchPaths []string
|
||||||
ignorePatterns ignoreMountSpecPatterns
|
ignorePatterns ignoreMountSpecPatterns
|
||||||
@@ -113,6 +114,13 @@ func WithDriverRoot(driverRoot string) Option {
|
|
||||||
|
// The following can be overridden for testing
|
||||||
|
- symlinkLocator lookup.Locator
|
||||||
|
- symlinkChainLocator lookup.Locator
|
||||||
|
+ symlinkLocator lookup.Locator
|
||||||
|
+ symlinkChainLocator lookup.Locator
|
||||||
|
+ symlinkChainLocators map[string]lookup.Locator
|
||||||
|
// TODO: This should be replaced by a regular mock
|
||||||
|
resolveSymlink func(string) (string, error)
|
||||||
|
}
|
||||||
|
@@ -59,11 +61,20 @@ func New(opts ...Option) (discover.Discover, error) {
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
+ o.symlinkChainLocators = make(map[string]lookup.Locator)
|
||||||
|
if o.symlinkChainLocator == nil {
|
||||||
|
- o.symlinkChainLocator = lookup.NewSymlinkChainLocator(
|
||||||
|
+ for _, altRoot := range o.altRoots {
|
||||||
|
+ o.symlinkChainLocators[altRoot] = lookup.NewSymlinkChainLocator(
|
||||||
|
+ lookup.WithLogger(o.logger),
|
||||||
|
+ lookup.WithRoot(altRoot),
|
||||||
|
+ )
|
||||||
|
+ }
|
||||||
|
+ o.symlinkChainLocators[o.driverRoot] = lookup.NewSymlinkChainLocator(
|
||||||
|
lookup.WithLogger(o.logger),
|
||||||
|
lookup.WithRoot(o.driverRoot),
|
||||||
|
)
|
||||||
|
+ } else {
|
||||||
|
+ o.symlinkChainLocators[o.driverRoot] = o.symlinkChainLocator
|
||||||
|
}
|
||||||
|
|
||||||
|
if o.resolveSymlink == nil {
|
||||||
|
@@ -113,6 +124,13 @@ func WithDriverRoot(driverRoot string) Option {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user