]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network/sr-iov: move common parts to link_set_sr_iov_ifindices() 29116/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 7 Sep 2023 15:56:16 +0000 (00:56 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 8 Sep 2023 11:09:15 +0000 (20:09 +0900)
This also adds several debugging logs.
No functional change, just refactoring.

src/network/networkd-sriov.c

index 562a53b7ddb5df2b471a0617ab031cb94bc28124..78d8cefe7cf6801937e798d25aa51b216251a00a 100644 (file)
@@ -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;
 }