From: Yu Watanabe Date: Thu, 7 Sep 2023 15:56:16 +0000 (+0900) Subject: network/sr-iov: move common parts to link_set_sr_iov_ifindices() X-Git-Tag: v255-rc1~541^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b9962da63f45fd82e200b871f807d9448ae5631e;p=thirdparty%2Fsystemd.git network/sr-iov: move common parts to link_set_sr_iov_ifindices() This also adds several debugging logs. No functional change, just refactoring. --- diff --git a/src/network/networkd-sriov.c b/src/network/networkd-sriov.c index 562a53b7ddb..78d8cefe7cf 100644 --- a/src/network/networkd-sriov.c +++ b/src/network/networkd-sriov.c @@ -194,33 +194,18 @@ static int manager_update_sr_iov_ifindices(Manager *manager, int phys_port_ifind return 0; } -static int link_set_sr_iov_phys_port(Link *link) { +static int link_set_sr_iov_phys_port(Link *link, sd_device *pci_dev, const char *dev_port) { _cleanup_(sd_device_unrefp) sd_device *pci_physfn_dev = NULL; - const char *dev_port; - sd_device *pci_dev; int r; assert(link); assert(link->manager); + assert(pci_dev); + assert(dev_port); if (link->sr_iov_phys_port_ifindex > 0) return 0; - if (!link->dev) - return -ENODEV; - - /* This may return -EINVAL or -ENODEV, instead of -ENOENT, if the device has been removed or is being - * removed. Let's map -EINVAL to -ENODEV, as the caller will ignore -ENODEV. */ - r = sd_device_get_sysattr_value(link->dev, "dev_port", &dev_port); - if (r == -EINVAL) - return -ENODEV; - if (r < 0) - return r; - - r = sd_device_get_parent_with_subsystem_devtype(link->dev, "pci", NULL, &pci_dev); - if (r < 0) - return r; - r = sd_device_new_child(&pci_physfn_dev, pci_dev, "physfn"); if (r < 0) return r; @@ -232,29 +217,17 @@ static int link_set_sr_iov_phys_port(Link *link) { return manager_update_sr_iov_ifindices(link->manager, r, link->ifindex); } -static int link_set_sr_iov_virt_ports(Link *link) { - const char *dev_port, *name; - sd_device *pci_dev; +static int link_set_sr_iov_virt_ports(Link *link, sd_device *pci_dev, const char *dev_port) { + const char *name; int r; assert(link); assert(link->manager); + assert(pci_dev); + assert(dev_port); set_clear(link->sr_iov_virt_port_ifindices); - if (!link->dev) - return -ENODEV; - - r = sd_device_get_sysattr_value(link->dev, "dev_port", &dev_port); - if (r == -EINVAL) - return -ENODEV; - if (r < 0) - return r; - - r = sd_device_get_parent_with_subsystem_devtype(link->dev, "pci", NULL, &pci_dev); - if (r < 0) - return r; - FOREACH_DEVICE_CHILD_WITH_SUFFIX(pci_dev, child, name) { const char *n; @@ -275,17 +248,36 @@ static int link_set_sr_iov_virt_ports(Link *link) { } int link_set_sr_iov_ifindices(Link *link) { + const char *dev_port; + sd_device *pci_dev; int r; assert(link); - r = link_set_sr_iov_phys_port(link); + if (!link->dev) + return -ENODEV; + + r = sd_device_get_parent_with_subsystem_devtype(link->dev, "pci", NULL, &pci_dev); + if (ERRNO_IS_NEG_DEVICE_ABSENT(r)) + return 0; + if (r < 0) + return log_link_debug_errno(link, r, "Failed to get parent PCI device: %m"); + + /* This may return -EINVAL or -ENODEV, instead of -ENOENT, if the device has been removed or is being + * removed. Let's ignore the error codes here. */ + r = sd_device_get_sysattr_value(link->dev, "dev_port", &dev_port); + if (ERRNO_IS_NEG_DEVICE_ABSENT(r) || r == -EINVAL) + return 0; + if (r < 0) + return log_link_debug_errno(link, r, "Failed to get 'dev_port' sysfs attribute: %m"); + + r = link_set_sr_iov_phys_port(link, pci_dev, dev_port); if (r < 0 && !ERRNO_IS_DEVICE_ABSENT(r)) - return r; + return log_link_debug_errno(link, r, "Failed to set SR-IOV physical port: %m"); - r = link_set_sr_iov_virt_ports(link); + r = link_set_sr_iov_virt_ports(link, pci_dev, dev_port); if (r < 0 && !ERRNO_IS_DEVICE_ABSENT(r)) - return r; + return log_link_debug_errno(link, r, "Failed to set SR-IOV virtual ports: %m"); return 0; }