diff options
author | Sowmini Varadhan <sowmini.varadhan@oracle.com> | 2016-06-13 12:44:40 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-06-15 02:50:44 -0400 |
commit | 1c5113cf796bb730abc1798a3649b61e9e022be6 (patch) | |
tree | 59486163d4c94c1a32508710c5df8cc1ab0eca7f /net/rds | |
parent | fb1b3dc43dabd4bf7b57b3d63fd2875a499c81f0 (diff) |
RDS: Initialize all RDS_MPATH_WORKERS in __rds_conn_create
Add a for() loop in __rds_conn_create to initialize all the
conn_paths, in preparate for MP capable transports.
Signed-off-by: Sowmini Varadhan <sowmini.varadhan@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rds')
-rw-r--r-- | net/rds/connection.c | 65 |
1 files changed, 45 insertions, 20 deletions
diff --git a/net/rds/connection.c b/net/rds/connection.c index 57556e615ce2..a99ac69f77ac 100644 --- a/net/rds/connection.c +++ b/net/rds/connection.c | |||
@@ -111,6 +111,32 @@ static void rds_conn_reset(struct rds_connection *conn) | |||
111 | * reliability guarantees of RDS. */ | 111 | * reliability guarantees of RDS. */ |
112 | } | 112 | } |
113 | 113 | ||
114 | static void __rds_conn_path_init(struct rds_connection *conn, | ||
115 | struct rds_conn_path *cp, bool is_outgoing) | ||
116 | { | ||
117 | spin_lock_init(&cp->cp_lock); | ||
118 | cp->cp_next_tx_seq = 1; | ||
119 | init_waitqueue_head(&cp->cp_waitq); | ||
120 | INIT_LIST_HEAD(&cp->cp_send_queue); | ||
121 | INIT_LIST_HEAD(&cp->cp_retrans); | ||
122 | |||
123 | cp->cp_conn = conn; | ||
124 | atomic_set(&cp->cp_state, RDS_CONN_DOWN); | ||
125 | cp->cp_send_gen = 0; | ||
126 | /* cp_outgoing is per-path. So we can only set it here | ||
127 | * for the single-path transports. | ||
128 | */ | ||
129 | if (!conn->c_trans->t_mp_capable) | ||
130 | cp->cp_outgoing = (is_outgoing ? 1 : 0); | ||
131 | cp->cp_reconnect_jiffies = 0; | ||
132 | INIT_DELAYED_WORK(&cp->cp_send_w, rds_send_worker); | ||
133 | INIT_DELAYED_WORK(&cp->cp_recv_w, rds_recv_worker); | ||
134 | INIT_DELAYED_WORK(&cp->cp_conn_w, rds_connect_worker); | ||
135 | INIT_WORK(&cp->cp_down_w, rds_shutdown_worker); | ||
136 | mutex_init(&cp->cp_cm_lock); | ||
137 | cp->cp_flags = 0; | ||
138 | } | ||
139 | |||
114 | /* | 140 | /* |
115 | * There is only every one 'conn' for a given pair of addresses in the | 141 | * There is only every one 'conn' for a given pair of addresses in the |
116 | * system at a time. They contain messages to be retransmitted and so | 142 | * system at a time. They contain messages to be retransmitted and so |
@@ -154,14 +180,8 @@ static struct rds_connection *__rds_conn_create(struct net *net, | |||
154 | INIT_HLIST_NODE(&conn->c_hash_node); | 180 | INIT_HLIST_NODE(&conn->c_hash_node); |
155 | conn->c_laddr = laddr; | 181 | conn->c_laddr = laddr; |
156 | conn->c_faddr = faddr; | 182 | conn->c_faddr = faddr; |
157 | spin_lock_init(&conn->c_lock); | ||
158 | conn->c_next_tx_seq = 1; | ||
159 | conn->c_path[0].cp_conn = conn; | ||
160 | rds_conn_net_set(conn, net); | ||
161 | 183 | ||
162 | init_waitqueue_head(&conn->c_waitq); | 184 | rds_conn_net_set(conn, net); |
163 | INIT_LIST_HEAD(&conn->c_send_queue); | ||
164 | INIT_LIST_HEAD(&conn->c_retrans); | ||
165 | 185 | ||
166 | ret = rds_cong_get_maps(conn); | 186 | ret = rds_cong_get_maps(conn); |
167 | if (ret) { | 187 | if (ret) { |
@@ -197,17 +217,6 @@ static struct rds_connection *__rds_conn_create(struct net *net, | |||
197 | goto out; | 217 | goto out; |
198 | } | 218 | } |
199 | 219 | ||
200 | atomic_set(&conn->c_state, RDS_CONN_DOWN); | ||
201 | conn->c_send_gen = 0; | ||
202 | conn->c_path[0].cp_outgoing = (is_outgoing ? 1 : 0); | ||
203 | conn->c_reconnect_jiffies = 0; | ||
204 | INIT_DELAYED_WORK(&conn->c_send_w, rds_send_worker); | ||
205 | INIT_DELAYED_WORK(&conn->c_recv_w, rds_recv_worker); | ||
206 | INIT_DELAYED_WORK(&conn->c_conn_w, rds_connect_worker); | ||
207 | INIT_WORK(&conn->c_down_w, rds_shutdown_worker); | ||
208 | mutex_init(&conn->c_cm_lock); | ||
209 | conn->c_flags = 0; | ||
210 | |||
211 | rdsdebug("allocated conn %p for %pI4 -> %pI4 over %s %s\n", | 220 | rdsdebug("allocated conn %p for %pI4 -> %pI4 over %s %s\n", |
212 | conn, &laddr, &faddr, | 221 | conn, &laddr, &faddr, |
213 | trans->t_name ? trans->t_name : "[unknown]", | 222 | trans->t_name ? trans->t_name : "[unknown]", |
@@ -224,7 +233,7 @@ static struct rds_connection *__rds_conn_create(struct net *net, | |||
224 | if (parent) { | 233 | if (parent) { |
225 | /* Creating passive conn */ | 234 | /* Creating passive conn */ |
226 | if (parent->c_passive) { | 235 | if (parent->c_passive) { |
227 | trans->conn_free(conn->c_transport_data); | 236 | trans->conn_free(conn->c_path[0].cp_transport_data); |
228 | kmem_cache_free(rds_conn_slab, conn); | 237 | kmem_cache_free(rds_conn_slab, conn); |
229 | conn = parent->c_passive; | 238 | conn = parent->c_passive; |
230 | } else { | 239 | } else { |
@@ -238,10 +247,26 @@ static struct rds_connection *__rds_conn_create(struct net *net, | |||
238 | 247 | ||
239 | found = rds_conn_lookup(net, head, laddr, faddr, trans); | 248 | found = rds_conn_lookup(net, head, laddr, faddr, trans); |
240 | if (found) { | 249 | if (found) { |
241 | trans->conn_free(conn->c_transport_data); | 250 | struct rds_conn_path *cp; |
251 | int i; | ||
252 | |||
253 | for (i = 0; i < RDS_MPATH_WORKERS; i++) { | ||
254 | cp = &conn->c_path[i]; | ||
255 | trans->conn_free(cp->cp_transport_data); | ||
256 | if (!trans->t_mp_capable) | ||
257 | break; | ||
258 | } | ||
242 | kmem_cache_free(rds_conn_slab, conn); | 259 | kmem_cache_free(rds_conn_slab, conn); |
243 | conn = found; | 260 | conn = found; |
244 | } else { | 261 | } else { |
262 | int i; | ||
263 | |||
264 | for (i = 0; i < RDS_MPATH_WORKERS; i++) { | ||
265 | __rds_conn_path_init(conn, &conn->c_path[i], | ||
266 | is_outgoing); | ||
267 | conn->c_path[i].cp_index = i; | ||
268 | } | ||
269 | |||
245 | hlist_add_head_rcu(&conn->c_hash_node, head); | 270 | hlist_add_head_rcu(&conn->c_hash_node, head); |
246 | rds_cong_add_conn(conn); | 271 | rds_cong_add_conn(conn); |
247 | rds_conn_count++; | 272 | rds_conn_count++; |