mirror of
				https://github.com/NVIDIA/nvidia-container-toolkit
				synced 2025-06-26 18:18:24 +00:00 
			
		
		
		
	Add internal proc package for processing GPU information files
Signed-off-by: Evan Lezar <elezar@nvidia.com>
This commit is contained in:
		
							parent
							
								
									aca0c7bc5a
								
							
						
					
					
						commit
						9d6e2ff1b0
					
				
							
								
								
									
										89
									
								
								internal/info/proc/information_files.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								internal/info/proc/information_files.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,89 @@ | ||||
| /** | ||||
| # Copyright (c) 2022, NVIDIA CORPORATION.  All rights reserved. | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| #     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
| **/ | ||||
| 
 | ||||
| package proc | ||||
| 
 | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| // GPUInfoField represents the field name for information specified in a GPU's information file
 | ||||
| type GPUInfoField string | ||||
| 
 | ||||
| // The following constants define the fields of interest from the GPU information file
 | ||||
| const ( | ||||
| 	GPUInfoModel       = GPUInfoField("Model") | ||||
| 	GPUInfoGPUUUID     = GPUInfoField("GPU UUID") | ||||
| 	GPUInfoBusLocation = GPUInfoField("Bus Location") | ||||
| 	GPUInfoDeviceMinor = GPUInfoField("Device Minor") | ||||
| ) | ||||
| 
 | ||||
| // GPUInfo stores the information for a GPU as determined from its associated information file
 | ||||
| type GPUInfo map[GPUInfoField]string | ||||
| 
 | ||||
| // GetInformationFilePaths returns the list of information files associated with NVIDIA GPUs.
 | ||||
| func GetInformationFilePaths(root string) ([]string, error) { | ||||
| 	return filepath.Glob(filepath.Join(root, "/proc/driver/nvidia/gpus/*/information")) | ||||
| } | ||||
| 
 | ||||
| // ParseGPUInformationFile parses the specified GPU information file and constructs a GPUInfo structure
 | ||||
| func ParseGPUInformationFile(path string) (GPUInfo, error) { | ||||
| 	infoFile, err := os.Open(path) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("failed to open %v: %v", path, err) | ||||
| 	} | ||||
| 	defer infoFile.Close() | ||||
| 
 | ||||
| 	return gpuInfoFrom(infoFile), nil | ||||
| } | ||||
| 
 | ||||
| // gpuInfoFrom parses a GPUInfo struct from the specified reader
 | ||||
| // An information file has the following strucutre:
 | ||||
| // $ cat /proc/driver/nvidia/gpus/0000\:06\:00.0/information
 | ||||
| // Model:           Tesla V100-SXM2-16GB
 | ||||
| // IRQ:             408
 | ||||
| // GPU UUID:        GPU-edfee158-11c1-52b8-0517-92f30e7fac88
 | ||||
| // Video BIOS:      88.00.41.00.01
 | ||||
| // Bus Type:        PCIe
 | ||||
| // DMA Size:        47 bits
 | ||||
| // DMA Mask:        0x7fffffffffff
 | ||||
| // Bus Location:    0000:06:00.0
 | ||||
| // Device Minor:    0
 | ||||
| // GPU Excluded:    No
 | ||||
| func gpuInfoFrom(reader io.Reader) GPUInfo { | ||||
| 	info := make(GPUInfo) | ||||
| 	scanner := bufio.NewScanner(reader) | ||||
| 	for scanner.Scan() { | ||||
| 		line := scanner.Text() | ||||
| 
 | ||||
| 		parts := strings.SplitN(line, ":", 2) | ||||
| 		if len(parts) != 2 { | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		field := GPUInfoField(parts[0]) | ||||
| 		value := strings.TrimSpace(parts[1]) | ||||
| 
 | ||||
| 		info[field] = value | ||||
| 	} | ||||
| 
 | ||||
| 	return info | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user