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 ;
0 commit comments