@@ -19,8 +19,6 @@ package devchar
1919import (
2020 "context"
2121 "fmt"
22- "os"
23- "path/filepath"
2422
2523 "github.com/urfave/cli/v3"
2624
@@ -155,14 +153,15 @@ func (m command) run(cfg *config) error {
155153
156154type linkCreator struct {
157155 logger logger.Interface
158- lister nodeLister
159156 driverRoot string
160157 devRoot string
161158 devCharPath string
162159 dryRun bool
163160 createAll bool
164161 createDeviceNodes bool
165162 loadKernelModules bool
163+
164+ devicesLib * nvdevices.Interface
166165}
167166
168167// Creator is an interface for creating symlinks to /dev/nv* devices in /dev/char.
@@ -174,6 +173,8 @@ type Creator interface {
174173type Option func (* linkCreator )
175174
176175// NewSymlinkCreator creates a new linkCreator.
176+ //
177+ // Deprecated: Use the `nvdevices` package instead.
177178func NewSymlinkCreator (opts ... Option ) (Creator , error ) {
178179 c := linkCreator {}
179180 for _ , opt := range opts {
@@ -192,52 +193,34 @@ func NewSymlinkCreator(opts ...Option) (Creator, error) {
192193 c .devCharPath = defaultDevCharPath
193194 }
194195
195- if err := c .setup (); err != nil {
196- return nil , err
197- }
198-
199- if c .createAll {
200- lister , err := newAllPossible (c .logger , c .devRoot )
201- if err != nil {
202- return nil , fmt .Errorf ("failed to create all possible device lister: %v" , err )
203- }
204- c .lister = lister
205- } else {
206- c .lister = existing {c .logger , c .devRoot }
207- }
208- return c , nil
209- }
210-
211- func (m linkCreator ) setup () error {
212- if ! m .loadKernelModules && ! m .createDeviceNodes {
213- return nil
214- }
215-
216- if m .loadKernelModules {
196+ if c .loadKernelModules {
217197 modules := nvmodules .New (
218- nvmodules .WithLogger (m .logger ),
219- nvmodules .WithDryRun (m .dryRun ),
220- nvmodules .WithRoot (m .driverRoot ),
198+ nvmodules .WithLogger (c .logger ),
199+ nvmodules .WithDryRun (c .dryRun ),
200+ nvmodules .WithRoot (c .driverRoot ),
221201 )
222202 if err := modules .LoadAll (); err != nil {
223- return fmt .Errorf ("failed to load NVIDIA kernel modules: %v" , err )
203+ return nil , fmt .Errorf ("failed to load NVIDIA kernel modules: %v" , err )
224204 }
225205 }
226206
227- if m .createDeviceNodes {
228- devices , err := nvdevices .New (
229- nvdevices .WithLogger (m .logger ),
230- nvdevices .WithDryRun (m .dryRun ),
231- nvdevices .WithDevRoot (m .devRoot ),
232- )
233- if err != nil {
234- return err
235- }
207+ devices , err := nvdevices .New (
208+ nvdevices .WithLogger (c .logger ),
209+ nvdevices .WithDryRun (c .dryRun ),
210+ nvdevices .WithDevRoot (c .driverRoot ),
211+ )
212+ if err != nil {
213+ return nil , err
214+ }
215+ c .devicesLib = devices
216+
217+ if c .createDeviceNodes {
236218 if err := devices .CreateNVIDIAControlDevices (); err != nil {
237- return fmt .Errorf ("failed to create NVIDIA device nodes: %v" , err )
219+ return nil , fmt .Errorf ("failed to create NVIDIA device nodes: %v" , err )
238220 }
239221 }
240- return nil
222+
223+ return c , nil
241224}
242225
243226// WithDriverRoot sets the driver root path.
@@ -299,42 +282,5 @@ func WithCreateDeviceNodes(createDeviceNodes bool) Option {
299282
300283// CreateLinks creates symlinks for all NVIDIA device nodes found in the driver root.
301284func (m linkCreator ) CreateLinks () error {
302- deviceNodes , err := m .lister .DeviceNodes ()
303- if err != nil {
304- return fmt .Errorf ("failed to get device nodes: %v" , err )
305- }
306-
307- if len (deviceNodes ) != 0 && ! m .dryRun {
308- err := os .MkdirAll (m .devCharPath , 0755 )
309- if err != nil {
310- return fmt .Errorf ("failed to create directory %s: %v" , m .devCharPath , err )
311- }
312- }
313-
314- for _ , deviceNode := range deviceNodes {
315- target := deviceNode .path
316- linkPath := filepath .Join (m .devCharPath , deviceNode .devCharName ())
317-
318- m .logger .Infof ("Creating link %s => %s" , linkPath , target )
319- if m .dryRun {
320- continue
321- }
322-
323- err = os .Symlink (target , linkPath )
324- if err != nil {
325- m .logger .Warningf ("Could not create symlink: %v" , err )
326- }
327- }
328-
329- return nil
330- }
331-
332- type deviceNode struct {
333- path string
334- major uint32
335- minor uint32
336- }
337-
338- func (d deviceNode ) devCharName () string {
339- return fmt .Sprintf ("%d:%d" , d .major , d .minor )
285+ return m .devicesLib .CreateDevCharSymlinks (m .devCharPath , ! m .createAll )
340286}
0 commit comments