The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6200

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===

From 5253892f7241356bd2f8ab58bedbd0767b9b82a2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Sat, 14 Sep 2019 12:58:02 +0200
Subject: [PATCH 1/2] shared/api: Make some NVIDIA fields omitempty
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 shared/api/resource.go | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/shared/api/resource.go b/shared/api/resource.go
index eea1b86f6e..6590398848 100644
--- a/shared/api/resource.go
+++ b/shared/api/resource.go
@@ -119,13 +119,13 @@ type ResourcesGPUCardSRIOV struct {
 // ResourcesGPUCardNvidia represents additional information for NVIDIA GPUs
 // API extension: resources_gpu
 type ResourcesGPUCardNvidia struct {
-       CUDAVersion string `json:"cuda_version" yaml:"cuda_version"`
-       NVRMVersion string `json:"nvrm_version" yaml:"nvrm_version"`
+       CUDAVersion string `json:"cuda_version,omitempty" 
yaml:"cuda_version,omitempty"`
+       NVRMVersion string `json:"nvrm_version,omitempty" 
yaml:"nvrm_version,omitempty"`
 
        Brand        string `json:"brand" yaml:"brand"`
        Model        string `json:"model" yaml:"model"`
-       UUID         string `json:"uuid" yaml:"uuid"`
-       Architecture string `json:"architecture" yaml:"architecture"`
+       UUID         string `json:"uuid,omitempty" yaml:"uuid,omitempty"`
+       Architecture string `json:"architecture,omitempty" 
yaml:"architecture,omitempty"`
 
        // API extension: resources_v2
        CardName   string `json:"card_name" yaml:"card_name"`

From b40089ed83d765f4812e9d7409d8c6377ada9ce4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Sat, 14 Sep 2019 12:58:14 +0200
Subject: [PATCH 2/2] lxd/resources: Implement NVIDIA device fallback
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #6195

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/resources/gpu.go | 67 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 66 insertions(+), 1 deletion(-)

diff --git a/lxd/resources/gpu.go b/lxd/resources/gpu.go
index f2963e6ece..a2d972d5e1 100644
--- a/lxd/resources/gpu.go
+++ b/lxd/resources/gpu.go
@@ -1,10 +1,12 @@
 package resources
 
 import (
+       "bufio"
        "encoding/csv"
        "fmt"
        "io"
        "io/ioutil"
+       "os"
        "os/exec"
        "path/filepath"
        "strconv"
@@ -18,6 +20,66 @@ import (
 )
 
 var sysClassDrm = "/sys/class/drm"
+var procDriverNvidia = "/proc/driver/nvidia"
+
+func loadNvidiaProc() (map[string]*api.ResourcesGPUCardNvidia, error) {
+       nvidiaCards := map[string]*api.ResourcesGPUCardNvidia{}
+
+       gpusPath := filepath.Join(procDriverNvidia, "gpus")
+       if !sysfsExists(gpusPath) {
+               return nil, fmt.Errorf("No NVIDIA GPU proc driver")
+       }
+
+       // List the GPUs from /proc
+       entries, err := ioutil.ReadDir(gpusPath)
+       if err != nil {
+               return nil, errors.Wrapf(err, "Failed to list \"%s\"", gpusPath)
+       }
+
+       for _, entry := range entries {
+               entryName := entry.Name()
+               entryPath := filepath.Join(gpusPath, entryName)
+
+               if !sysfsExists(filepath.Join(entryPath, "information")) {
+                       continue
+               }
+
+               // Get the GPU information
+               f, err := os.Open(filepath.Join(entryPath, "information"))
+               if err != nil {
+                       return nil, errors.Wrapf(err, "Failed to open \"%s\"", 
filepath.Join(entryPath, "information"))
+               }
+               defer f.Close()
+
+               gpuInfo := bufio.NewScanner(f)
+               nvidiaCard := &api.ResourcesGPUCardNvidia{}
+               for gpuInfo.Scan() {
+                       line := strings.TrimSpace(gpuInfo.Text())
+
+                       fields := strings.SplitN(line, ":", 2)
+                       if len(fields) != 2 {
+                               continue
+                       }
+
+                       key := strings.TrimSpace(fields[0])
+                       value := strings.TrimSpace(fields[1])
+
+                       if key == "Model" {
+                               nvidiaCard.Model = value
+                               nvidiaCard.Brand = strings.Split(value, " ")[0]
+                       }
+
+                       if key == "Device Minor" {
+                               nvidiaCard.CardName = fmt.Sprintf("nvidia%s", 
value)
+                               nvidiaCard.CardDevice = fmt.Sprintf("195:%s", 
value)
+                       }
+               }
+
+               nvidiaCards[entryName] = nvidiaCard
+       }
+
+       return nvidiaCards, nil
+}
 
 func loadNvidiaContainer() (map[string]*api.ResourcesGPUCardNvidia, error) {
        // Check for nvidia-container-cli
@@ -271,7 +333,10 @@ func GetGPU() (*api.ResourcesGPU, error) {
        // Load NVIDIA information
        nvidiaCards, err := loadNvidiaContainer()
        if err != nil {
-               nvidiaCards = map[string]*api.ResourcesGPUCardNvidia{}
+               nvidiaCards, err = loadNvidiaProc()
+               if err != nil {
+                       nvidiaCards = map[string]*api.ResourcesGPUCardNvidia{}
+               }
        }
 
        // Temporary variables
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to