Skip to content

Commit d13ce74

Browse files
authored
Merge pull request systemd#22834 from yuwata/network-sriov-request-queue
network: sriov: use request queue
2 parents 6b72105 + cb8453c commit d13ce74

File tree

7 files changed

+70
-36
lines changed

7 files changed

+70
-36
lines changed

src/network/networkd-link.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1045,7 +1045,7 @@ static int link_configure(Link *link) {
10451045
return link_request_to_activate(link);
10461046
}
10471047

1048-
r = link_configure_sr_iov(link);
1048+
r = link_request_sr_iov_vfs(link);
10491049
if (r < 0)
10501050
return r;
10511051

src/network/networkd-queue.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ static const char *const request_type_table[_REQUEST_TYPE_MAX] = {
295295
[REQUEST_TYPE_SET_LINK_MAC] = "MAC address",
296296
[REQUEST_TYPE_SET_LINK_MASTER] = "master interface",
297297
[REQUEST_TYPE_SET_LINK_MTU] = "MTU",
298+
[REQUEST_TYPE_SRIOV] = "SR-IOV",
298299
[REQUEST_TYPE_TC_QDISC] = "QDisc",
299300
[REQUEST_TYPE_TC_CLASS] = "TClass",
300301
[REQUEST_TYPE_UP_DOWN] = "bring link up or down",

src/network/networkd-queue.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ typedef enum RequestType {
4444
REQUEST_TYPE_SET_LINK_MAC, /* Setting MAC address. */
4545
REQUEST_TYPE_SET_LINK_MASTER, /* Setting IFLA_MASTER. */
4646
REQUEST_TYPE_SET_LINK_MTU, /* Setting MTU. */
47+
REQUEST_TYPE_SRIOV,
4748
REQUEST_TYPE_TC_CLASS,
4849
REQUEST_TYPE_TC_QDISC,
4950
REQUEST_TYPE_UP_DOWN,

src/network/networkd-sriov.c

Lines changed: 41 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
/* SPDX-License-Identifier: LGPL-2.1-or-later
22
* Copyright © 2020 VMware, Inc. */
33

4-
#include "netlink-util.h"
54
#include "networkd-link.h"
65
#include "networkd-manager.h"
6+
#include "networkd-queue.h"
77
#include "networkd-sriov.h"
88

9-
static int sr_iov_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
9+
static int sr_iov_handler(sd_netlink *rtnl, sd_netlink_message *m, Request *req, Link *link, SRIOV *sr_iov) {
1010
int r;
1111

12+
assert(m);
1213
assert(link);
13-
assert(link->sr_iov_messages > 0);
14-
link->sr_iov_messages--;
15-
16-
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
17-
return 1;
1814

1915
r = sd_netlink_message_get_errno(m);
2016
if (r < 0 && r != -EEXIST) {
@@ -32,61 +28,77 @@ static int sr_iov_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
3228
return 1;
3329
}
3430

35-
static int sr_iov_configure(Link *link, SRIOV *sr_iov) {
36-
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
31+
static int sr_iov_configure(SRIOV *sr_iov, Link *link, Request *req) {
32+
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
3733
int r;
3834

35+
assert(sr_iov);
3936
assert(link);
4037
assert(link->manager);
4138
assert(link->manager->rtnl);
4239
assert(link->ifindex > 0);
40+
assert(req);
4341

44-
log_link_debug(link, "Setting SR-IOV virtual function %"PRIu32, sr_iov->vf);
42+
log_link_debug(link, "Setting SR-IOV virtual function %"PRIu32".", sr_iov->vf);
4543

46-
r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
44+
r = sd_rtnl_message_new_link(link->manager->rtnl, &m, RTM_SETLINK, link->ifindex);
4745
if (r < 0)
4846
return r;
4947

50-
r = sr_iov_set_netlink_message(sr_iov, req);
48+
r = sr_iov_set_netlink_message(sr_iov, m);
5149
if (r < 0)
5250
return r;
5351

54-
r = netlink_call_async(link->manager->rtnl, NULL, req, sr_iov_handler,
55-
link_netlink_destroy_callback, link);
56-
if (r < 0)
57-
return r;
52+
return request_call_netlink_async(link->manager->rtnl, m, req);
53+
}
5854

59-
link_ref(link);
60-
link->sr_iov_messages++;
55+
static int sr_iov_process_request(Request *req, Link *link, SRIOV *sr_iov) {
56+
int r;
6157

62-
return 0;
58+
assert(req);
59+
assert(link);
60+
assert(sr_iov);
61+
62+
if (!IN_SET(link->state, LINK_STATE_CONFIGURING, LINK_STATE_CONFIGURED))
63+
return 0;
64+
65+
r = sr_iov_configure(sr_iov, link, req);
66+
if (r < 0)
67+
return log_link_warning_errno(link, r,
68+
"Failed to configure SR-IOV virtual function %"PRIu32": %m",
69+
sr_iov->vf);
70+
71+
return 1;
6372
}
6473

65-
int link_configure_sr_iov(Link *link) {
74+
int link_request_sr_iov_vfs(Link *link) {
6675
SRIOV *sr_iov;
6776
int r;
6877

6978
assert(link);
7079
assert(link->network);
7180

72-
if (link->sr_iov_messages != 0) {
73-
log_link_debug(link, "SR-IOV is configuring.");
74-
return 0;
75-
}
76-
7781
link->sr_iov_configured = false;
7882

7983
ORDERED_HASHMAP_FOREACH(sr_iov, link->network->sr_iov_by_section) {
80-
r = sr_iov_configure(link, sr_iov);
84+
r = link_queue_request_safe(link, REQUEST_TYPE_SRIOV,
85+
sr_iov, NULL,
86+
sr_iov_hash_func,
87+
sr_iov_compare_func,
88+
sr_iov_process_request,
89+
&link->sr_iov_messages,
90+
sr_iov_handler,
91+
NULL);
8192
if (r < 0)
8293
return log_link_warning_errno(link, r,
83-
"Failed to configure SR-IOV virtual function %"PRIu32": %m",
94+
"Failed to request SR-IOV virtual function %"PRIu32": %m",
8495
sr_iov->vf);
8596
}
8697

87-
if (link->sr_iov_messages == 0)
98+
if (link->sr_iov_messages == 0) {
8899
link->sr_iov_configured = true;
89-
else
100+
link_check_ready(link);
101+
} else
90102
log_link_debug(link, "Configuring SR-IOV");
91103

92104
return 0;

src/network/networkd-sriov.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@
66

77
typedef struct Link Link;
88

9-
int link_configure_sr_iov(Link *link);
9+
int link_request_sr_iov_vfs(Link *link);

src/shared/netif-sriov.c

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,26 @@ SRIOV *sr_iov_free(SRIOV *sr_iov) {
8080
return mfree(sr_iov);
8181
}
8282

83+
void sr_iov_hash_func(const SRIOV *sr_iov, struct siphash *state) {
84+
assert(sr_iov);
85+
assert(state);
86+
87+
siphash24_compress(&sr_iov->vf, sizeof(sr_iov->vf), state);
88+
}
89+
90+
int sr_iov_compare_func(const SRIOV *s1, const SRIOV *s2) {
91+
assert(s1);
92+
assert(s2);
93+
94+
return CMP(s1->vf, s2->vf);
95+
}
96+
97+
DEFINE_PRIVATE_HASH_OPS(
98+
sr_iov_hash_ops,
99+
SRIOV,
100+
sr_iov_hash_func,
101+
sr_iov_compare_func);
102+
83103
int sr_iov_set_netlink_message(SRIOV *sr_iov, sd_netlink_message *req) {
84104
int r;
85105

@@ -296,7 +316,7 @@ static int sr_iov_section_verify(uint32_t num_vfs, SRIOV *sr_iov) {
296316
}
297317

298318
int sr_iov_drop_invalid_sections(uint32_t num_vfs, OrderedHashmap *sr_iov_by_section) {
299-
_cleanup_hashmap_free_ Hashmap *hashmap = NULL;
319+
_cleanup_set_free_ Set *set = NULL;
300320
SRIOV *sr_iov;
301321
int r;
302322

@@ -308,9 +328,7 @@ int sr_iov_drop_invalid_sections(uint32_t num_vfs, OrderedHashmap *sr_iov_by_sec
308328
continue;
309329
}
310330

311-
assert(sr_iov->vf < INT_MAX);
312-
313-
dup = hashmap_remove(hashmap, UINT32_TO_PTR(sr_iov->vf + 1));
331+
dup = set_remove(set, sr_iov);
314332
if (dup) {
315333
log_warning("%s: Conflicting [SR-IOV] section is specified at line %u and %u, "
316334
"dropping the [SR-IOV] section specified at line %u.",
@@ -319,7 +337,7 @@ int sr_iov_drop_invalid_sections(uint32_t num_vfs, OrderedHashmap *sr_iov_by_sec
319337
sr_iov_free(dup);
320338
}
321339

322-
r = hashmap_ensure_put(&hashmap, NULL, UINT32_TO_PTR(sr_iov->vf + 1), sr_iov);
340+
r = set_ensure_put(&set, &sr_iov_hash_ops, sr_iov);
323341
if (r < 0)
324342
return log_oom();
325343
assert(r > 0);

src/shared/netif-sriov.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ typedef struct SRIOV {
3333
} SRIOV;
3434

3535
SRIOV *sr_iov_free(SRIOV *sr_iov);
36+
void sr_iov_hash_func(const SRIOV *sr_iov, struct siphash *state);
37+
int sr_iov_compare_func(const SRIOV *s1, const SRIOV *s2);
3638
int sr_iov_set_netlink_message(SRIOV *sr_iov, sd_netlink_message *req);
3739
int sr_iov_get_num_vfs(sd_device *device, uint32_t *ret);
3840
int sr_iov_set_num_vfs(sd_device *device, uint32_t num_vfs, OrderedHashmap *sr_iov_by_section);

0 commit comments

Comments
 (0)