The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/8224
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 efabc7ee81743706ac3134d17da55e05cdd8c8ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Mon, 7 Dec 2020 18:26:59 -0500 Subject: [PATCH 1/3] api: Add resources_network_usb and resources_disk_address MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- doc/api-extensions.md | 10 ++++++++-- shared/version/api.go | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/doc/api-extensions.md b/doc/api-extensions.md index 5fdc480d10..12c78e6eb5 100644 --- a/doc/api-extensions.md +++ b/doc/api-extensions.md @@ -1225,7 +1225,13 @@ send/receive on top of that. ## gpu\_mdev This adds support for virtual GPUs. It introduces the `mdev` config key for GPU devices which takes -a supported mdev type, e.g. i915-GVTg_V5_4. +a supported mdev type, e.g. i915-GVTg\_V5\_4. ## resources\_pci\_iommu -This adds the IOMMUGroup field for PCI entries in the resources API. \ No newline at end of file +This adds the IOMMUGroup field for PCI entries in the resources API. + +## resources\_network\_usb +Adds the usb\_address field to the network card entries in the resources API. + +## resources\_disk\_address +Adds the usb\_address and pci\_address fields to the disk entries in the resources API. diff --git a/shared/version/api.go b/shared/version/api.go index 12ae55eb2d..427249d08b 100644 --- a/shared/version/api.go +++ b/shared/version/api.go @@ -237,6 +237,8 @@ var APIExtensions = []string{ "storage_zfs_clone_copy_rebase", "gpu_mdev", "resources_pci_iommu", + "resources_network_usb", + "resources_disk_address", } // APIExtensionsCount returns the number of available API extensions. From 89a5672ef40061d1bbcab952cba241deccc0fb97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Mon, 7 Dec 2020 18:27:41 -0500 Subject: [PATCH 2/3] lxd/resources: Add PCIAddress/USBAddress for networks and disks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #8215 Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/resources/network.go | 6 ++++++ lxd/resources/storage.go | 31 +++++++++++++++++++++++++++++ lxd/resources/usb.go | 42 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/lxd/resources/network.go b/lxd/resources/network.go index 034e5b8190..b6bf773e71 100644 --- a/lxd/resources/network.go +++ b/lxd/resources/network.go @@ -59,6 +59,12 @@ func networkAddDeviceInfo(devicePath string, pciDB *pcidb.PCIDB, uname unix.Utsn } } + // USB address + usbAddr, err := parseUSBAddress(devicePath) + if err == nil { + card.USBAddress = usbAddr + } + // Vendor and product deviceVendorPath := filepath.Join(devicePath, "vendor") if sysfsExists(deviceVendorPath) { diff --git a/lxd/resources/storage.go b/lxd/resources/storage.go index b051957f76..8a07c1c2a0 100644 --- a/lxd/resources/storage.go +++ b/lxd/resources/storage.go @@ -160,6 +160,37 @@ func GetStorage() (*api.ResourcesStorage, error) { } disk.Device = strings.TrimSpace(string(diskDev)) + // PCI address + deviceDevicePath := filepath.Join(devicePath, "device") + if sysfsExists(deviceDevicePath) { + linkTarget, err := filepath.EvalSymlinks(deviceDevicePath) + if err != nil { + return nil, errors.Wrapf(err, "Failed to track down \"%s\"", deviceDevicePath) + } + + if strings.Contains(linkTarget, "/pci") && sysfsExists(filepath.Join(deviceDevicePath, "subsystem")) { + virtio := strings.HasPrefix(filepath.Base(linkTarget), "virtio") + if virtio { + linkTarget = filepath.Dir(linkTarget) + } + + subsystem, err := filepath.EvalSymlinks(filepath.Join(deviceDevicePath, "subsystem")) + if err != nil { + return nil, errors.Wrapf(err, "Failed to track down \"%s\"", filepath.Join(deviceDevicePath, "subsystem")) + } + + if filepath.Base(subsystem) == "pci" || virtio { + disk.PCIAddress = filepath.Base(linkTarget) + } + } + } + + // USB address + usbAddr, err := parseUSBAddress(devicePath) + if err == nil { + disk.USBAddress = usbAddr + } + // NUMA node if sysfsExists(filepath.Join(devicePath, "numa_node")) { numaNode, err := readInt(filepath.Join(devicePath, "numa_node")) diff --git a/lxd/resources/usb.go b/lxd/resources/usb.go index fc88c459dc..3d38c2b8ff 100644 --- a/lxd/resources/usb.go +++ b/lxd/resources/usb.go @@ -1,6 +1,7 @@ package resources import ( + "fmt" "io/ioutil" "path/filepath" "strconv" @@ -15,6 +16,47 @@ import ( var sysBusUSB = "/sys/bus/usb/devices" +// parseUSBAddress returns the suspected USB address (bus:dev) for the device. +func parseUSBAddress(devicePath string) (string, error) { + // Resolve symlink. + devicePath, err := filepath.EvalSymlinks(devicePath) + if err != nil { + return "", errors.Wrap(err, "Failed to resolve device symlink") + } + + // Parse the path looking for a usb address. + baseIndex := -1 + parts := strings.Split(devicePath, "/") + for i, name := range parts { + if strings.HasPrefix(name, "usb") { + baseIndex = i + break + } + } + + // Check that we have found an entry starting with "usb" and we have at least 2 sub-entries. + if baseIndex < 0 || len(parts) < baseIndex+2 { + return "", fmt.Errorf("No match") + } + + // Device path for the USB device. + usbPath := strings.Join(parts[0:baseIndex+2], "/") + + // Bus address. + bus, err := readUint(filepath.Join(usbPath, "busnum")) + if err != nil { + return "", errors.Wrap(err, "Unable to parse USB bus addr") + } + + // Device address. + dev, err := readUint(filepath.Join(usbPath, "devnum")) + if err != nil { + return "", errors.Wrap(err, "Unable to parse USB device addr") + } + + return fmt.Sprintf("%d:%d", bus, dev), nil +} + // GetUSB returns a filled api.ResourcesUSB struct ready for use by LXD func GetUSB() (*api.ResourcesUSB, error) { // Load the USB database. From ffc46a2278eb072403c62f148443cf864de1fd2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Mon, 7 Dec 2020 18:49:49 -0500 Subject: [PATCH 3/3] shared/api: Add PCIAddress/USBAddress on network and storage 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 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/shared/api/resource.go b/shared/api/resource.go index d9fd419542..adaf241026 100644 --- a/shared/api/resource.go +++ b/shared/api/resource.go @@ -184,6 +184,9 @@ type ResourcesNetworkCard struct { // API extension: resources_network_firmware FirmwareVersion string `json:"firmware_version,omitempty" yaml:"firmware_version,omitempty"` + + // API extension: resources_network_usb + USBAddress string `json:"usb_address,omitempty" yaml:"usb_address,omitempty"` } // ResourcesNetworkCardPort represents a network port on the system @@ -263,6 +266,10 @@ type ResourcesStorageDisk struct { DeviceID string `json:"device_id" yaml:"device_id"` Partitions []ResourcesStorageDiskPartition `json:"partitions" yaml:"partitions"` + + // API extension: resources_disk_address + PCIAddress string `json:"pci_address,omitempty" yaml:"pci_address,omitempty"` + USBAddress string `json:"usb_address,omitempty" yaml:"usb_address,omitempty"` } // ResourcesStorageDiskPartition represents a partition on a disk
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel