]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/networkd-sriov.c
Merge pull request #21865 from yuwata/network-sr-iov
[thirdparty/systemd.git] / src / network / networkd-sriov.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later
2 * Copyright © 2020 VMware, Inc. */
3
4 #include "netlink-util.h"
5 #include "networkd-link.h"
6 #include "networkd-manager.h"
7 #include "networkd-sriov.h"
8
9 static int sr_iov_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
10 int r;
11
12 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;
18
19 r = sd_netlink_message_get_errno(m);
20 if (r < 0 && r != -EEXIST) {
21 log_link_message_error_errno(link, m, r, "Could not set up SR-IOV");
22 link_enter_failed(link);
23 return 1;
24 }
25
26 if (link->sr_iov_messages == 0) {
27 log_link_debug(link, "SR-IOV configured");
28 link->sr_iov_configured = true;
29 link_check_ready(link);
30 }
31
32 return 1;
33 }
34
35 static int sr_iov_configure(Link *link, SRIOV *sr_iov) {
36 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
37 int r;
38
39 assert(link);
40 assert(link->manager);
41 assert(link->manager->rtnl);
42 assert(link->ifindex > 0);
43
44 log_link_debug(link, "Setting SR-IOV virtual function %"PRIu32, sr_iov->vf);
45
46 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
47 if (r < 0)
48 return r;
49
50 r = sr_iov_set_netlink_message(sr_iov, req);
51 if (r < 0)
52 return r;
53
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;
58
59 link_ref(link);
60 link->sr_iov_messages++;
61
62 return 0;
63 }
64
65 int link_configure_sr_iov(Link *link) {
66 SRIOV *sr_iov;
67 int r;
68
69 assert(link);
70 assert(link->network);
71
72 if (link->sr_iov_messages != 0) {
73 log_link_debug(link, "SR-IOV is configuring.");
74 return 0;
75 }
76
77 link->sr_iov_configured = false;
78
79 ORDERED_HASHMAP_FOREACH(sr_iov, link->network->sr_iov_by_section) {
80 r = sr_iov_configure(link, sr_iov);
81 if (r < 0)
82 return log_link_warning_errno(link, r,
83 "Failed to configure SR-IOV virtual function %"PRIu32": %m",
84 sr_iov->vf);
85 }
86
87 if (link->sr_iov_messages == 0)
88 link->sr_iov_configured = true;
89 else
90 log_link_debug(link, "Configuring SR-IOV");
91
92 return 0;
93 }