From: Yu Watanabe Date: Thu, 23 Dec 2021 03:59:52 +0000 (+0900) Subject: network: sr-iov: drop conflicting sections X-Git-Tag: v251-rc1~497^2~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e217e22a777da86a35dfb90313214ceb3323729a;p=thirdparty%2Fsystemd.git network: sr-iov: drop conflicting sections --- diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 873ad2e7034..70e8af5bd49 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -321,7 +321,9 @@ int network_verify(Network *network) { network_drop_invalid_route_prefixes(network); network_drop_invalid_routing_policy_rules(network); network_drop_invalid_traffic_control(network); - network_drop_invalid_sr_iov(network); + r = network_drop_invalid_sr_iov(network); + if (r < 0) + return r; network_drop_invalid_static_leases(network); network_adjust_dhcp_server(network); diff --git a/src/network/networkd-sriov.c b/src/network/networkd-sriov.c index 6805987b2b8..da98ef9c8bc 100644 --- a/src/network/networkd-sriov.c +++ b/src/network/networkd-sriov.c @@ -265,14 +265,39 @@ static int sr_iov_section_verify(SRIOV *sr_iov) { return 0; } -void network_drop_invalid_sr_iov(Network *network) { +int network_drop_invalid_sr_iov(Network *network) { + _cleanup_hashmap_free_ Hashmap *hashmap = NULL; SRIOV *sr_iov; + int r; assert(network); - ORDERED_HASHMAP_FOREACH(sr_iov, network->sr_iov_by_section) - if (sr_iov_section_verify(sr_iov) < 0) + ORDERED_HASHMAP_FOREACH(sr_iov, network->sr_iov_by_section) { + SRIOV *dup; + + if (sr_iov_section_verify(sr_iov) < 0) { sr_iov_free(sr_iov); + continue; + } + + assert(sr_iov->vf < INT_MAX); + + dup = hashmap_remove(hashmap, UINT32_TO_PTR(sr_iov->vf + 1)); + if (dup) { + log_warning("%s: Conflicting [SR-IOV] section is specified at line %u and %u, " + "dropping the [SR-IOV] section specified at line %u.", + dup->section->filename, sr_iov->section->line, + dup->section->line, dup->section->line); + sr_iov_free(dup); + } + + r = hashmap_ensure_put(&hashmap, NULL, UINT32_TO_PTR(sr_iov->vf + 1), sr_iov); + if (r < 0) + return log_oom(); + assert(r > 0); + } + + return 0; } int config_parse_sr_iov_uint32( diff --git a/src/network/networkd-sriov.h b/src/network/networkd-sriov.h index 950d1f9c598..be4430a9a04 100644 --- a/src/network/networkd-sriov.h +++ b/src/network/networkd-sriov.h @@ -35,7 +35,7 @@ typedef struct SRIOV { SRIOV *sr_iov_free(SRIOV *sr_iov); int link_configure_sr_iov(Link *link); -void network_drop_invalid_sr_iov(Network *network); +int network_drop_invalid_sr_iov(Network *network); DEFINE_NETWORK_SECTION_FUNCTIONS(SRIOV, sr_iov_free);