aboutsummaryrefslogtreecommitdiffstats
path: root/net/rds/connection.c
diff options
context:
space:
mode:
authorSowmini Varadhan <sowmini.varadhan@oracle.com>2016-07-14 06:51:03 -0400
committerDavid S. Miller <davem@davemloft.net>2016-07-15 14:36:58 -0400
commit5916e2c1554f3e36f770401c989c3c7fadf619ca (patch)
treee2f85d0d6ad83d6835b131956324d6e30c4eda3e /net/rds/connection.c
parentac3615e7f3cffe2a1a6b25172dfd09e138593d82 (diff)
RDS: TCP: Enable multipath RDS for TCP
Use RDS probe-ping to compute how many paths may be used with the peer, and to synchronously start the multiple paths. If mprds is supported, hash outgoing traffic to one of multiple paths in rds_sendmsg() when multipath RDS is supported by the transport. CC: Santosh Shilimkar <santosh.shilimkar@oracle.com> Signed-off-by: Sowmini Varadhan <sowmini.varadhan@oracle.com> Acked-by: Santosh Shilimkar <santosh.shilimkar@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rds/connection.c')
-rw-r--r--net/rds/connection.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/net/rds/connection.c b/net/rds/connection.c
index 19a4fee5f4dd..f5058559bb08 100644
--- a/net/rds/connection.c
+++ b/net/rds/connection.c
@@ -155,7 +155,7 @@ static struct rds_connection *__rds_conn_create(struct net *net,
155 struct hlist_head *head = rds_conn_bucket(laddr, faddr); 155 struct hlist_head *head = rds_conn_bucket(laddr, faddr);
156 struct rds_transport *loop_trans; 156 struct rds_transport *loop_trans;
157 unsigned long flags; 157 unsigned long flags;
158 int ret; 158 int ret, i;
159 159
160 rcu_read_lock(); 160 rcu_read_lock();
161 conn = rds_conn_lookup(net, head, laddr, faddr, trans); 161 conn = rds_conn_lookup(net, head, laddr, faddr, trans);
@@ -211,6 +211,12 @@ static struct rds_connection *__rds_conn_create(struct net *net,
211 211
212 conn->c_trans = trans; 212 conn->c_trans = trans;
213 213
214 init_waitqueue_head(&conn->c_hs_waitq);
215 for (i = 0; i < RDS_MPATH_WORKERS; i++) {
216 __rds_conn_path_init(conn, &conn->c_path[i],
217 is_outgoing);
218 conn->c_path[i].cp_index = i;
219 }
214 ret = trans->conn_alloc(conn, gfp); 220 ret = trans->conn_alloc(conn, gfp);
215 if (ret) { 221 if (ret) {
216 kmem_cache_free(rds_conn_slab, conn); 222 kmem_cache_free(rds_conn_slab, conn);
@@ -263,14 +269,6 @@ static struct rds_connection *__rds_conn_create(struct net *net,
263 kmem_cache_free(rds_conn_slab, conn); 269 kmem_cache_free(rds_conn_slab, conn);
264 conn = found; 270 conn = found;
265 } else { 271 } else {
266 int i;
267
268 for (i = 0; i < RDS_MPATH_WORKERS; i++) {
269 __rds_conn_path_init(conn, &conn->c_path[i],
270 is_outgoing);
271 conn->c_path[i].cp_index = i;
272 }
273
274 hlist_add_head_rcu(&conn->c_hash_node, head); 272 hlist_add_head_rcu(&conn->c_hash_node, head);
275 rds_cong_add_conn(conn); 273 rds_cong_add_conn(conn);
276 rds_conn_count++; 274 rds_conn_count++;
@@ -668,6 +666,7 @@ EXPORT_SYMBOL_GPL(rds_conn_path_drop);
668 666
669void rds_conn_drop(struct rds_connection *conn) 667void rds_conn_drop(struct rds_connection *conn)
670{ 668{
669 WARN_ON(conn->c_trans->t_mp_capable);
671 rds_conn_path_drop(&conn->c_path[0]); 670 rds_conn_path_drop(&conn->c_path[0]);
672} 671}
673EXPORT_SYMBOL_GPL(rds_conn_drop); 672EXPORT_SYMBOL_GPL(rds_conn_drop);