mirror of
https://github.com/systemd/systemd
synced 2024-09-16 06:43:18 +00:00
Merge pull request #29116 from yuwata/network-sriov-debug
network/sr-iov: ignore EINVAL in reading dev_port sysfs attribute
This commit is contained in:
commit
2d17808200
|
@ -194,29 +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;
|
||||
|
||||
r = sd_device_get_sysattr_value(link->dev, "dev_port", &dev_port);
|
||||
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;
|
||||
|
@ -228,27 +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 < 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;
|
||||
|
||||
|
@ -269,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 (r < 0 && !ERRNO_IS_DEVICE_ABSENT(r))
|
||||
return r;
|
||||
if (!link->dev)
|
||||
return -ENODEV;
|
||||
|
||||
r = link_set_sr_iov_virt_ports(link);
|
||||
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, pci_dev, dev_port);
|
||||
if (r < 0 && !ERRNO_IS_DEVICE_ABSENT(r))
|
||||
return log_link_debug_errno(link, r, "Failed to set SR-IOV virtual ports: %m");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue