From 093e4eb62bc690e82d84f62973a0c9dca6381313 Mon Sep 17 00:00:00 2001 From: Vishal Anarase Date: Fri, 17 Jul 2026 11:52:49 +0530 Subject: [PATCH] Expand nvidia-smi symlink resolution to additional host paths Signed-off-by: Vishal Anarase --- cmd/nvidia-validator/main.go | 45 +++++++++++++++-------- cmd/nvidia-validator/main_test.go | 59 ++++++++++++++++++++++++++++++- 2 files changed, 89 insertions(+), 15 deletions(-) diff --git a/cmd/nvidia-validator/main.go b/cmd/nvidia-validator/main.go index 37962dd93f..b10a5728fa 100644 --- a/cmd/nvidia-validator/main.go +++ b/cmd/nvidia-validator/main.go @@ -245,6 +245,15 @@ const ( NVIDIAPEERMEM = "nvidia-peermem" ) +var hostNvidiaSMISearchPaths = []string{ + "/opt/bin/nvidia-smi", + "/usr/bin/nvidia-smi", + "/usr/sbin/nvidia-smi", + "/bin/nvidia-smi", + "/sbin/nvidia-smi", + wslNvidiaSMIPath, +} + func main() { c := cli.Command{} @@ -744,19 +753,27 @@ func isDriverManagedByOperator(ctx context.Context) (bool, error) { } // resolveHostNvidiaSMI opens and stats nvidia-smi within the mounted host root. -func resolveHostNvidiaSMI(hostRootCtrPath string) (os.FileInfo, error) { - f, err := pathrs.OpenInRoot(hostRootCtrPath, "/usr/bin/nvidia-smi") - if err != nil { - return nil, fmt.Errorf("failed to open 'nvidia-smi' on the host: %w", err) - } - defer f.Close() +// It searches common nvidia-smi locations and returns file info along with the +// resolved path relative to the host root. +func resolveHostNvidiaSMI(hostRootCtrPath string) (os.FileInfo, string, error) { + for _, nvidiaSMIPath := range hostNvidiaSMISearchPaths { + f, err := pathrs.OpenInRoot(hostRootCtrPath, nvidiaSMIPath) + if err != nil { + log.Debugf("failed to open '%s' on the host: %v", nvidiaSMIPath, err) + continue + } - fileInfo, err := f.Stat() - if err != nil { - return nil, fmt.Errorf("failed to stat 'nvidia-smi' on the host: %w", err) + fileInfo, err := f.Stat() + _ = f.Close() + if err != nil { + log.Debugf("failed to stat '%s' on the host: %v", nvidiaSMIPath, err) + continue + } + + return fileInfo, nvidiaSMIPath, nil } - return fileInfo, nil + return nil, "", fmt.Errorf("failed to open 'nvidia-smi' on the host") } func validateHostDriver(silent bool) error { @@ -767,7 +784,7 @@ func validateHostDriver(silent bool) error { return nil } - fileInfo, err := resolveHostNvidiaSMI("/host") + fileInfo, nvidiaSMIPath, err := resolveHostNvidiaSMI("/host") if err != nil { return err } @@ -775,7 +792,7 @@ func validateHostDriver(silent bool) error { return fmt.Errorf("empty 'nvidia-smi' file found on the host") } command := "chroot" - args := []string{"/host", "nvidia-smi"} + args := []string{"/host", nvidiaSMIPath} return runCommand(command, args, silent) } @@ -1771,8 +1788,8 @@ func (v *VGPUManager) runValidation(silent bool) (hostDriver bool, err error) { args := []string{"/run/nvidia/driver", "nvidia-smi"} // check if driver is pre-installed on the host and use host path for validation - if _, err := resolveHostNvidiaSMI("/host"); err == nil { - args = []string{"/host", "nvidia-smi"} + if _, nvidiaSMIPath, err := resolveHostNvidiaSMI("/host"); err == nil { + args = []string{"/host", nvidiaSMIPath} hostDriver = true } diff --git a/cmd/nvidia-validator/main_test.go b/cmd/nvidia-validator/main_test.go index 5c934c196f..87d387aff2 100644 --- a/cmd/nvidia-validator/main_test.go +++ b/cmd/nvidia-validator/main_test.go @@ -32,6 +32,7 @@ func TestResolveHostNvidiaSMI(t *testing.T) { testCases := []struct { description string contents map[string]string + expectedPath string expectsError bool }{ { @@ -39,6 +40,7 @@ func TestResolveHostNvidiaSMI(t *testing.T) { contents: map[string]string{ "/usr/bin/nvidia-smi": "fake nvidia-smi", }, + expectedPath: "/usr/bin/nvidia-smi", }, { description: "nvidia-smi exists through absolute /usr/bin symlink", @@ -46,6 +48,7 @@ func TestResolveHostNvidiaSMI(t *testing.T) { "/run/current-system/sw/bin/nvidia-smi": "fake nvidia-smi", "/usr/bin": "symlink=/run/current-system/sw/bin", }, + expectedPath: "/usr/bin/nvidia-smi", }, { description: "nvidia-smi exists through relative /usr/bin symlink", @@ -53,6 +56,59 @@ func TestResolveHostNvidiaSMI(t *testing.T) { "/run/current-system/sw/bin/nvidia-smi": "fake nvidia-smi", "/usr/bin": "symlink=../run/current-system/sw/bin", }, + expectedPath: "/usr/bin/nvidia-smi", + }, + { + description: "nvidia-smi exists in /opt/bin", + contents: map[string]string{ + "/opt/bin/nvidia-smi": "fake nvidia-smi", + }, + expectedPath: "/opt/bin/nvidia-smi", + }, + { + description: "nvidia-smi exists in /bin", + contents: map[string]string{ + "/bin/nvidia-smi": "fake nvidia-smi", + }, + expectedPath: "/bin/nvidia-smi", + }, + { + description: "nvidia-smi exists in /usr/sbin", + contents: map[string]string{ + "/usr/sbin/nvidia-smi": "fake nvidia-smi", + }, + expectedPath: "/usr/sbin/nvidia-smi", + }, + { + description: "nvidia-smi exists through absolute /usr/sbin symlink", + contents: map[string]string{ + "/run/current-system/sw/bin/nvidia-smi": "fake nvidia-smi", + "/usr/sbin": "symlink=/run/current-system/sw/bin", + }, + expectedPath: "/usr/sbin/nvidia-smi", + }, + { + description: "nvidia-smi exists in WSL path", + contents: map[string]string{ + "/usr/lib/wsl/lib/nvidia-smi": "fake nvidia-smi", + }, + expectedPath: "/usr/lib/wsl/lib/nvidia-smi", + }, + { + description: "nvidia-smi exists through absolute WSL path symlink", + contents: map[string]string{ + "/run/wsl/lib/nvidia-smi": "fake nvidia-smi", + "/usr/lib/wsl/lib": "symlink=/run/wsl/lib", + }, + expectedPath: "/usr/lib/wsl/lib/nvidia-smi", + }, + { + description: "earlier search path is preferred when multiple exist", + contents: map[string]string{ + "/usr/bin/nvidia-smi": "fake nvidia-smi in usr/bin", + "/usr/sbin/nvidia-smi": "fake nvidia-smi in usr/sbin", + }, + expectedPath: "/usr/bin/nvidia-smi", }, { description: "parent dir is symlink to path not within root", @@ -84,13 +140,14 @@ func TestResolveHostNvidiaSMI(t *testing.T) { require.NoError(t, os.WriteFile(target, []byte(contents), 0600)) } - fileInfo, err := resolveHostNvidiaSMI(hostRoot) + fileInfo, nvidiaSMIPath, err := resolveHostNvidiaSMI(hostRoot) if tc.expectsError { require.Error(t, err) return } require.NoError(t, err) + require.Equal(t, tc.expectedPath, nvidiaSMIPath) require.NotZero(t, fileInfo.Size()) }) }