From: Yu Watanabe Date: Fri, 14 Jan 2022 22:03:20 +0000 (+0900) Subject: udev/net: check if the requested SR-IOV virtual function exists before configuring it X-Git-Tag: v251-rc1~497^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=252e96eaa9e939ed0055bc55b84456a7dd25de38;p=thirdparty%2Fsystemd.git udev/net: check if the requested SR-IOV virtual function exists before configuring it --- diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 5bd029ecc50..7e2da6088c4 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -871,6 +871,7 @@ static int sr_iov_configure(Link *link, sd_netlink **rtnl, SRIOV *sr_iov) { static int link_apply_sr_iov_config(Link *link, sd_netlink **rtnl) { SRIOV *sr_iov; + uint32_t n; int r; assert(link); @@ -881,7 +882,25 @@ static int link_apply_sr_iov_config(Link *link, sd_netlink **rtnl) { if (r < 0) log_link_warning_errno(link, r, "Failed to set the number of SR-IOV virtual functions, ignoring: %m"); + if (ordered_hashmap_isempty(link->config->sr_iov_by_section)) + return 0; + + r = sr_iov_get_num_vfs(link->device, &n); + if (r < 0) { + log_link_warning_errno(link, r, "Failed to get the number of SR-IOV virtual functions, ignoring [SR-IOV] sections: %m"); + return 0; + } + if (n == 0) { + log_link_warning(link, "No SR-IOV virtual function exists, ignoring [SR-IOV] sections: %m"); + return 0; + } + ORDERED_HASHMAP_FOREACH(sr_iov, link->config->sr_iov_by_section) { + if (sr_iov->vf >= n) { + log_link_warning(link, "SR-IOV virtual function %"PRIu32" does not exist, ignoring.", sr_iov->vf); + continue; + } + r = sr_iov_configure(link, rtnl, sr_iov); if (r < 0) log_link_warning_errno(link, r,