Skip to content

Commit aff1a37

Browse files
zkoopmansgvisor-bot
authored andcommitted
Update driver installer for ARM64 compatibility
PiperOrigin-RevId: 775436401
1 parent e996186 commit aff1a37

File tree

9 files changed

+209
-71
lines changed

9 files changed

+209
-71
lines changed

pkg/sentry/devices/nvproxy/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ go_test(
118118
"//pkg/abi/nvgpu",
119119
"//pkg/sentry/devices/nvproxy/nvconf",
120120
"//pkg/test/testutil",
121+
"//tools/gpu/drivers",
121122
"//tools/nvidia_driver_differ/parser",
122123
],
123124
)

pkg/sentry/devices/nvproxy/nvproxy_driver_parity_test.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package nvproxy_driver_parity_test
2121

2222
import (
23+
"context"
2324
"fmt"
2425
"os"
2526
"reflect"
@@ -33,6 +34,7 @@ import (
3334

3435
"gvisor.dev/gvisor/pkg/sentry/devices/nvproxy"
3536
"gvisor.dev/gvisor/pkg/sentry/devices/nvproxy/nvconf"
37+
"gvisor.dev/gvisor/tools/gpu/drivers"
3638
"gvisor.dev/gvisor/tools/nvidia_driver_differ/parser"
3739
)
3840

@@ -85,7 +87,7 @@ func TestSupportedStructNames(t *testing.T) {
8587
nvproxy.Init()
8688

8789
// Run the parser on all supported driver versions
88-
nvproxy.ForEachSupportDriver(func(version nvconf.DriverVersion, checksum string) {
90+
nvproxy.ForEachSupportDriver(func(version nvconf.DriverVersion, _, _ string) {
8991
t.Run(version.String(), func(t *testing.T) {
9092
t.Parallel()
9193
f, runner := createParserRunner(t)
@@ -110,7 +112,7 @@ func TestSupportedStructNames(t *testing.T) {
110112
func TestStructDefinitionParity(t *testing.T) {
111113
nvproxy.Init()
112114

113-
nvproxy.ForEachSupportDriver(func(version nvconf.DriverVersion, checksum string) {
115+
nvproxy.ForEachSupportDriver(func(version nvconf.DriverVersion, _, _ string) {
114116
t.Run(version.String(), func(t *testing.T) {
115117
t.Parallel()
116118
f, runner := createParserRunner(t)
@@ -437,3 +439,18 @@ func compareTypes(t *testing.T, nvproxyType reflect.Type, driverTypeName string,
437439
t.Fatalf("unknown driver type %q", driverTypeName)
438440
return nil
439441
}
442+
443+
// TestDriverChecksums tests that the checksums of all drivers are correct.
444+
func TestDriverChecksums(t *testing.T) {
445+
ctx := context.Background()
446+
nvproxy.Init()
447+
nvproxy.ForEachSupportDriver(func(version nvconf.DriverVersion, checksumX86_64, checksumARM64 string) {
448+
t.Run(version.String(), func(t *testing.T) {
449+
t.Parallel()
450+
if err := drivers.ValidateChecksum(ctx, version.String(), checksumX86_64, checksumARM64); err != nil {
451+
t.Errorf("checksum mismatch for driver %q: %v", version.String(), err)
452+
}
453+
})
454+
})
455+
456+
}

pkg/sentry/devices/nvproxy/nvproxy_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func TestInit(t *testing.T) {
3838
func TestAllSupportedHashesPresent(t *testing.T) {
3939
Init()
4040
for version, abi := range abis {
41-
if abi.checksum == "" {
41+
if abi.checksums.checksumX86_64 == "" || abi.checksums.checksumARM64 == "" {
4242
t.Errorf("unexpected empty value for driver %q", version.String())
4343
}
4444
}

pkg/sentry/devices/nvproxy/version.go

Lines changed: 76 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,20 @@ package nvproxy
1717
import (
1818
"fmt"
1919
"reflect"
20+
"runtime"
2021
"sort"
2122

2223
"gvisor.dev/gvisor/pkg/abi/nvgpu"
2324
"gvisor.dev/gvisor/pkg/sentry/devices/nvproxy/nvconf"
2425
"gvisor.dev/gvisor/pkg/sync"
2526
)
2627

28+
const (
29+
// ChecksumNoDriver is a special value that indicates that the driver runfile does not exist. This
30+
// is mostly for ARM drivers that NVIDIA does not provide a driver installer.
31+
ChecksumNoDriver = "NO_DRIVER"
32+
)
33+
2734
// A driverABIFunc constructs and returns a driverABI.
2835
// This indirection exists to avoid memory usage from unused driver ABIs.
2936
type driverABIFunc func() *driverABI
@@ -32,11 +39,49 @@ type driverABIFunc func() *driverABI
3239
// This indirection exists to avoid the memory usage from struct name maps if they are not used.
3340
type driverABIStructsFunc func() *driverABIStructs
3441

42+
// Checksums is a struct containing the SHA256 checksum of the linux .run driver installer file from
43+
// NVIDIA.
44+
type Checksums struct {
45+
checksumX86_64 string
46+
checksumARM64 string
47+
}
48+
49+
// NewChecksums creates a new Checksums struct.
50+
func NewChecksums(checksumX86_64, checksumARM64 string) *Checksums {
51+
return &Checksums{
52+
checksumX86_64: checksumX86_64,
53+
checksumARM64: checksumARM64,
54+
}
55+
}
56+
57+
// Checksum returns the SHA256 checksum of the linux .run driver installer file from NVIDIA for the
58+
// given architecture.
59+
func (c *Checksums) Checksum() (string, error) {
60+
switch runtime.GOARCH {
61+
case "amd64":
62+
return c.checksumX86_64, nil
63+
case "arm64":
64+
return c.checksumARM64, nil
65+
default:
66+
return "", nil
67+
}
68+
}
69+
70+
// X86_64 returns the SHA256 checksum of the linux .run driver installer file from NVIDIA for X86_64.
71+
func (c *Checksums) X86_64() string {
72+
return c.checksumX86_64
73+
}
74+
75+
// Arm64 returns the SHA256 checksum of the linux .run driver installer file from NVIDIA for ARM64.
76+
func (c *Checksums) Arm64() string {
77+
return c.checksumARM64
78+
}
79+
3580
// abiConAndChecksum couples the driver's abiConstructor to the SHA256 checksum of its linux .run
3681
// driver installer file from NVIDIA.
3782
type abiConAndChecksum struct {
38-
cons driverABIFunc
39-
checksum string
83+
cons driverABIFunc
84+
checksums *Checksums
4085
}
4186

4287
// driverABI defines the Nvidia kernel driver ABI proxied at a given version.
@@ -89,12 +134,15 @@ var abisOnce sync.Once
89134
// nvidia.
90135
// To add a new version, add in support as normal and add the "addDriverABI" call for your version.
91136
// Run `make sudo TARGETS=//tools/gpu:main ARGS="checksum --version={}"` to get checksum.
92-
func addDriverABI(major, minor, patch int, runfileChecksum string, cons driverABIFunc) driverABIFunc {
137+
func addDriverABI(major, minor, patch int, checksumX86_64, checksumARM64 string, cons driverABIFunc) driverABIFunc {
93138
if abis == nil {
94139
abis = make(map[nvconf.DriverVersion]abiConAndChecksum)
95140
}
96141
version := nvconf.NewDriverVersion(major, minor, patch)
97-
abis[version] = abiConAndChecksum{cons: cons, checksum: runfileChecksum}
142+
abis[version] = abiConAndChecksum{
143+
cons: cons,
144+
checksums: NewChecksums(checksumX86_64, checksumARM64),
145+
}
98146
return cons
99147
}
100148

@@ -634,12 +682,12 @@ func Init() {
634682

635683
// The following exist on the "535" branch. They branched off the main
636684
// branch at 535.113.01.
637-
v535_129_03 := addDriverABI(535, 129, 03, "e6dca5626a2608c6bb2a046cfcb7c1af338b9e961a7dd90ac09bb8a126ff002e", v535_113_01)
638-
v535_183_01 := addDriverABI(535, 183, 01, "f6707afbdda9407e3cbc2e5128e60bcbcdbf02fae29958c72fafb5d405e8b883", v535_129_03)
639-
v535_183_06 := addDriverABI(535, 183, 06, "c7bb0a0569c5347845479ed4e3e4d885c6ee3b8adf068c3401cdf754d5ba3d3b", v535_183_01)
640-
v535_216_01 := addDriverABI(535, 216, 01, "5ddea1147810012e33967c3181341bcd6624bd3d654c63f845df833b4ece6af7", v535_183_06)
641-
v535_230_02 := addDriverABI(535, 230, 02, "20cca9118083fcc8083158466e9cb2b616a7922206bcb7296b1fa5cc9af2e0fd", v535_216_01)
642-
_ = addDriverABI(535, 247, 01, "c250e686494cb0c1b5eeea58ba2003707510b2766df05b06ba20b11b3445466b", v535_230_02)
685+
v535_129_03 := addDriverABI(535, 129, 03, "e6dca5626a2608c6bb2a046cfcb7c1af338b9e961a7dd90ac09bb8a126ff002e", "8ba8d961457a241bcdf91b76d6fe2f36cb473c8bbdb02fb6650a622ce2e85b33", v535_113_01)
686+
v535_183_01 := addDriverABI(535, 183, 01, "f6707afbdda9407e3cbc2e5128e60bcbcdbf02fae29958c72fafb5d405e8b883", "c9d13b6250d24b76ef87a49b179f234564184a9f6d6414184668958b7f6d21e6", v535_129_03)
687+
v535_183_06 := addDriverABI(535, 183, 06, "c7bb0a0569c5347845479ed4e3e4d885c6ee3b8adf068c3401cdf754d5ba3d3b", ChecksumNoDriver, v535_183_01)
688+
v535_216_01 := addDriverABI(535, 216, 01, "5ddea1147810012e33967c3181341bcd6624bd3d654c63f845df833b4ece6af7", "4869ae0345b5892b2a50aed566c8226d3e07813d1190aa466feba5e9e21b33b9", v535_183_06)
689+
v535_230_02 := addDriverABI(535, 230, 02, "20cca9118083fcc8083158466e9cb2b616a7922206bcb7296b1fa5cc9af2e0fd", "ea000e6ff481f55e9bfedbea93b739368c635fe4be6156fdad560524ac7f363b", v535_216_01)
690+
_ = addDriverABI(535, 247, 01, "c250e686494cb0c1b5eeea58ba2003707510b2766df05b06ba20b11b3445466b", "bd8ea5c3747a588ff1a29b4f59300d2eba69402a605cb95fce10a30f535993d0", v535_230_02)
643691

644692
// 545.23.06 is an intermediate unqualified version from the main branch.
645693
v545_23_06 := func() *driverABI {
@@ -703,7 +751,7 @@ func Init() {
703751
return abi
704752
}
705753

706-
v550_54_14 := addDriverABI(550, 54, 14, "8c497ff1cfc7c310fb875149bc30faa4fd26d2237b2cba6cd2e8b0780157cfe3", func() *driverABI {
754+
v550_54_14 := addDriverABI(550, 54, 14, "8c497ff1cfc7c310fb875149bc30faa4fd26d2237b2cba6cd2e8b0780157cfe3", "b0fae8061633885c24f6b0c047649b46249a3bb44cadffbf658af28f80642c1d", func() *driverABI {
707755
abi := v550_40_07()
708756
abi.uvmIoctl[nvgpu.UVM_ALLOC_SEMAPHORE_POOL] = uvmHandler(uvmIoctlSimple[nvgpu.UVM_ALLOC_SEMAPHORE_POOL_PARAMS_V550], compUtil)
709757
abi.uvmIoctl[nvgpu.UVM_MAP_EXTERNAL_ALLOCATION] = uvmHandler(uvmIoctlHasFrontendFD[nvgpu.UVM_MAP_EXTERNAL_ALLOCATION_PARAMS_V550], compUtil)
@@ -719,9 +767,9 @@ func Init() {
719767
return abi
720768
})
721769

722-
v550_54_15 := addDriverABI(550, 54, 15, "2e859ae5f912a9a47aaa9b2d40a94a14f6f486b5d3b67c0ddf8b72c1c9650385", v550_54_14)
770+
v550_54_15 := addDriverABI(550, 54, 15, "2e859ae5f912a9a47aaa9b2d40a94a14f6f486b5d3b67c0ddf8b72c1c9650385", ChecksumNoDriver, v550_54_14)
723771

724-
v550_90_07 := addDriverABI(550, 90, 07, "51acf579d5a9884f573a1d3f522e7fafa5e7841e22a9cec0b4bbeae31b0b9733", func() *driverABI {
772+
v550_90_07 := addDriverABI(550, 90, 07, "51acf579d5a9884f573a1d3f522e7fafa5e7841e22a9cec0b4bbeae31b0b9733", "b896b76ae465307afc5b269c40bd8ccb279e6ea7d3ecae95534a91ecb1971572", func() *driverABI {
725773
abi := v550_54_15()
726774
abi.controlCmd[nvgpu.NV_CONF_COMPUTE_CTRL_CMD_GPU_GET_KEY_ROTATION_STATE] = ctrlHandler(rmControlSimple, compUtil)
727775

@@ -736,14 +784,14 @@ func Init() {
736784
})
737785

738786
// This version does not belong on any branch, but it is a child of 550.90.07.
739-
_ = addDriverABI(550, 90, 12, "391883846713b9e700af2ae87f8ac671f5527508ce3f9f60058deb363e05162a", v550_90_07)
787+
_ = addDriverABI(550, 90, 12, "391883846713b9e700af2ae87f8ac671f5527508ce3f9f60058deb363e05162a", ChecksumNoDriver, v550_90_07)
740788

741789
// 550.100 is an intermediate unqualified version from the main branch.
742790
v550_100 := v550_90_07
743791

744792
// The following exist on the "550" branch. They branched off the main
745793
// branch at 550.100.
746-
_ = addDriverABI(550, 127, 05, "d384f34f5d2a896bd7536d3deb6a6d973d8094a3ad485a1c2ee3bf5192086ae9", v550_100)
794+
_ = addDriverABI(550, 127, 05, "d384f34f5d2a896bd7536d3deb6a6d973d8094a3ad485a1c2ee3bf5192086ae9", "df0b06a89bc37fc8a8e2a152a9ba5a7de1c70636dab0ae62fd6f94e937847816", v550_100)
747795

748796
// 555.42.02 is an intermediate unqualified version.
749797
v555_42_02 := func() *driverABI {
@@ -785,10 +833,10 @@ func Init() {
785833
return abi
786834
}
787835

788-
v560_35_03 := addDriverABI(560, 35, 03, "f2932c92fadd43c5b2341be453fc4f73f0ad7185c26bb7a43fbde81ae29f1fe3", v560_28_03)
789-
v565_57_01 := addDriverABI(565, 57, 01, "6eebe94e585e385e8804f5a74152df414887bf819cc21bd95b72acd0fb182c7a", v560_35_03)
836+
v560_35_03 := addDriverABI(560, 35, 03, "f2932c92fadd43c5b2341be453fc4f73f0ad7185c26bb7a43fbde81ae29f1fe3", "b3c64054abd1357a63c5162a337139a2cb3915da96fadbf5a900b6a438df1beb", v560_28_03)
837+
v565_57_01 := addDriverABI(565, 57, 01, "6eebe94e585e385e8804f5a74152df414887bf819cc21bd95b72acd0fb182c7a", "68355cdec3531b83b7cbebca5bcee6c3e8bd02a5c2636f4656a108525b2f61f1", v560_35_03)
790838

791-
v570_86_15 := addDriverABI(570, 86, 15, "87709c19c7401243136bc0ec9e7f147c6803070a11449ae8f0819dee7963f76b", func() *driverABI {
839+
v570_86_15 := addDriverABI(570, 86, 15, "87709c19c7401243136bc0ec9e7f147c6803070a11449ae8f0819dee7963f76b", ChecksumNoDriver, func() *driverABI {
792840
abi := v565_57_01()
793841
abi.controlCmd[nvgpu.NV2080_CTRL_CMD_FB_QUERY_DRAM_ENCRYPTION_INFOROM_SUPPORT] = ctrlHandler(rmControlSimple, compUtil)
794842
abi.allocationClass[nvgpu.TURING_CHANNEL_GPFIFO_A] = allocHandler(rmAllocChannelV570, compUtil)
@@ -816,8 +864,8 @@ func Init() {
816864
return abi
817865
})
818866

819-
v570_124_06 := addDriverABI(570, 124, 06, "1818c90657d17e510de9fa032385ff7e99063e848e901cb4636ee71c8b339313", v570_86_15)
820-
v570_133_20 := addDriverABI(570, 133, 20, "1253d17b1528e8a24bf1f34a8ac6591c924b98ad7a32344bde253aa622ac1605", v570_124_06)
867+
v570_124_06 := addDriverABI(570, 124, 06, "1818c90657d17e510de9fa032385ff7e99063e848e901cb4636ee71c8b339313", ChecksumNoDriver, v570_86_15)
868+
v570_133_20 := addDriverABI(570, 133, 20, "1253d17b1528e8a24bf1f34a8ac6591c924b98ad7a32344bde253aa622ac1605", ChecksumNoDriver, v570_124_06)
821869

822870
// 575.51.02 is an intermediate unqualified version from the main branch.
823871
v575_51_02 := func() *driverABI {
@@ -832,7 +880,7 @@ func Init() {
832880
return abi
833881
}
834882

835-
_ = addDriverABI(575, 57, 8, "2aa701dac180a7b20a6e578cccd901ded8d44e57d60580f08f9d28dd1fffc6f2", v575_51_02)
883+
_ = addDriverABI(575, 57, 8, "2aa701dac180a7b20a6e578cccd901ded8d44e57d60580f08f9d28dd1fffc6f2", "549e73e4f7402f66275ee665b6e3a2ae5d7bf57296b743b824d713f205203bdf", v575_51_02)
836884
})
837885
}
838886

@@ -878,9 +926,10 @@ func newDriverStruct(paramType reflect.Type, name string) DriverStruct {
878926

879927
// ForEachSupportDriver calls f on all supported drivers.
880928
// Precondition: Init() must have been called.
881-
func ForEachSupportDriver(f func(version nvconf.DriverVersion, checksum string)) {
929+
func ForEachSupportDriver(f func(version nvconf.DriverVersion, checksums *Checksums)) {
882930
for version, abi := range abis {
883-
f(version, abi.checksum)
931+
var c Checksums = *abi.checksums
932+
f(version, &c)
884933
}
885934
}
886935

@@ -911,12 +960,13 @@ func SupportedDrivers() []nvconf.DriverVersion {
911960

912961
// ExpectedDriverChecksum returns the expected checksum for a given version.
913962
// Precondition: Init() must have been called.
914-
func ExpectedDriverChecksum(version nvconf.DriverVersion) (string, bool) {
963+
func ExpectedDriverChecksum(version nvconf.DriverVersion) (*Checksums, bool) {
915964
abi, ok := abis[version]
916965
if !ok {
917-
return "", false
966+
return nil, false
918967
}
919-
return abi.checksum, true
968+
var c Checksums = *abi.checksums
969+
return &c, true
920970
}
921971

922972
// SupportedIoctls returns the ioctl numbers that are supported by nvproxy at

tools/gpu/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@ go_binary(
1414
"//pkg/sentry/devices/nvproxy/nvconf",
1515
"//runsc/flag",
1616
"//tools/gpu/drivers",
17+
"@org_golang_x_sync//errgroup:go_default_library",
1718
],
1819
)

tools/gpu/drivers/BUILD

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,8 @@ go_test(
2020
name = "drivers_test",
2121
srcs = ["install_driver_test.go"],
2222
library = ":drivers",
23-
deps = ["//pkg/sentry/devices/nvproxy/nvconf"],
23+
deps = [
24+
"//pkg/sentry/devices/nvproxy",
25+
"//pkg/sentry/devices/nvproxy/nvconf",
26+
],
2427
)

0 commit comments

Comments
 (0)