Lines Matching refs:conn
78 struct rds_connection *conn, *ret = NULL; in rds_conn_lookup() local
80 hlist_for_each_entry_rcu(conn, head, c_hash_node) { in rds_conn_lookup()
81 if (conn->c_faddr == faddr && conn->c_laddr == laddr && in rds_conn_lookup()
82 conn->c_trans == trans && net == rds_conn_net(conn)) { in rds_conn_lookup()
83 ret = conn; in rds_conn_lookup()
98 static void rds_conn_reset(struct rds_connection *conn) in rds_conn_reset() argument
101 &conn->c_laddr, &conn->c_faddr); in rds_conn_reset()
104 rds_send_reset(conn); in rds_conn_reset()
105 conn->c_flags = 0; in rds_conn_reset()
126 struct rds_connection *conn, *parent = NULL; in __rds_conn_create() local
133 conn = rds_conn_lookup(net, head, laddr, faddr, trans); in __rds_conn_create()
134 if (conn && conn->c_loopback && conn->c_trans != &rds_loop_transport && in __rds_conn_create()
140 parent = conn; in __rds_conn_create()
141 conn = parent->c_passive; in __rds_conn_create()
144 if (conn) in __rds_conn_create()
147 conn = kmem_cache_zalloc(rds_conn_slab, gfp); in __rds_conn_create()
148 if (!conn) { in __rds_conn_create()
149 conn = ERR_PTR(-ENOMEM); in __rds_conn_create()
153 INIT_HLIST_NODE(&conn->c_hash_node); in __rds_conn_create()
154 conn->c_laddr = laddr; in __rds_conn_create()
155 conn->c_faddr = faddr; in __rds_conn_create()
156 spin_lock_init(&conn->c_lock); in __rds_conn_create()
157 conn->c_next_tx_seq = 1; in __rds_conn_create()
158 rds_conn_net_set(conn, net); in __rds_conn_create()
160 init_waitqueue_head(&conn->c_waitq); in __rds_conn_create()
161 INIT_LIST_HEAD(&conn->c_send_queue); in __rds_conn_create()
162 INIT_LIST_HEAD(&conn->c_retrans); in __rds_conn_create()
164 ret = rds_cong_get_maps(conn); in __rds_conn_create()
166 kmem_cache_free(rds_conn_slab, conn); in __rds_conn_create()
167 conn = ERR_PTR(ret); in __rds_conn_create()
179 conn->c_loopback = 1; in __rds_conn_create()
189 conn->c_trans = trans; in __rds_conn_create()
191 ret = trans->conn_alloc(conn, gfp); in __rds_conn_create()
193 kmem_cache_free(rds_conn_slab, conn); in __rds_conn_create()
194 conn = ERR_PTR(ret); in __rds_conn_create()
198 atomic_set(&conn->c_state, RDS_CONN_DOWN); in __rds_conn_create()
199 conn->c_send_gen = 0; in __rds_conn_create()
200 conn->c_outgoing = (is_outgoing ? 1 : 0); in __rds_conn_create()
201 conn->c_reconnect_jiffies = 0; in __rds_conn_create()
202 INIT_DELAYED_WORK(&conn->c_send_w, rds_send_worker); in __rds_conn_create()
203 INIT_DELAYED_WORK(&conn->c_recv_w, rds_recv_worker); in __rds_conn_create()
204 INIT_DELAYED_WORK(&conn->c_conn_w, rds_connect_worker); in __rds_conn_create()
205 INIT_WORK(&conn->c_down_w, rds_shutdown_worker); in __rds_conn_create()
206 mutex_init(&conn->c_cm_lock); in __rds_conn_create()
207 conn->c_flags = 0; in __rds_conn_create()
210 conn, &laddr, &faddr, in __rds_conn_create()
225 trans->conn_free(conn->c_transport_data); in __rds_conn_create()
226 kmem_cache_free(rds_conn_slab, conn); in __rds_conn_create()
227 conn = parent->c_passive; in __rds_conn_create()
229 parent->c_passive = conn; in __rds_conn_create()
230 rds_cong_add_conn(conn); in __rds_conn_create()
239 trans->conn_free(conn->c_transport_data); in __rds_conn_create()
240 kmem_cache_free(rds_conn_slab, conn); in __rds_conn_create()
241 conn = found; in __rds_conn_create()
243 hlist_add_head_rcu(&conn->c_hash_node, head); in __rds_conn_create()
244 rds_cong_add_conn(conn); in __rds_conn_create()
251 return conn; in __rds_conn_create()
270 void rds_conn_shutdown(struct rds_connection *conn) in rds_conn_shutdown() argument
273 if (!rds_conn_transition(conn, RDS_CONN_DOWN, RDS_CONN_DOWN)) { in rds_conn_shutdown()
281 mutex_lock(&conn->c_cm_lock); in rds_conn_shutdown()
282 if (!rds_conn_transition(conn, RDS_CONN_UP, RDS_CONN_DISCONNECTING) in rds_conn_shutdown()
283 && !rds_conn_transition(conn, RDS_CONN_ERROR, RDS_CONN_DISCONNECTING)) { in rds_conn_shutdown()
284 rds_conn_error(conn, "shutdown called in state %d\n", in rds_conn_shutdown()
285 atomic_read(&conn->c_state)); in rds_conn_shutdown()
286 mutex_unlock(&conn->c_cm_lock); in rds_conn_shutdown()
289 mutex_unlock(&conn->c_cm_lock); in rds_conn_shutdown()
291 wait_event(conn->c_waitq, in rds_conn_shutdown()
292 !test_bit(RDS_IN_XMIT, &conn->c_flags)); in rds_conn_shutdown()
293 wait_event(conn->c_waitq, in rds_conn_shutdown()
294 !test_bit(RDS_RECV_REFILL, &conn->c_flags)); in rds_conn_shutdown()
296 conn->c_trans->conn_shutdown(conn); in rds_conn_shutdown()
297 rds_conn_reset(conn); in rds_conn_shutdown()
299 if (!rds_conn_transition(conn, RDS_CONN_DISCONNECTING, RDS_CONN_DOWN)) { in rds_conn_shutdown()
305 rds_conn_error(conn, in rds_conn_shutdown()
309 atomic_read(&conn->c_state)); in rds_conn_shutdown()
318 cancel_delayed_work_sync(&conn->c_conn_w); in rds_conn_shutdown()
320 if (!hlist_unhashed(&conn->c_hash_node)) { in rds_conn_shutdown()
322 if (conn->c_trans->t_type != RDS_TRANS_TCP || in rds_conn_shutdown()
323 conn->c_outgoing == 1) in rds_conn_shutdown()
324 rds_queue_reconnect(conn); in rds_conn_shutdown()
337 void rds_conn_destroy(struct rds_connection *conn) in rds_conn_destroy() argument
343 "%pI4\n", conn, &conn->c_laddr, in rds_conn_destroy()
344 &conn->c_faddr); in rds_conn_destroy()
348 hlist_del_init_rcu(&conn->c_hash_node); in rds_conn_destroy()
353 rds_conn_drop(conn); in rds_conn_destroy()
354 flush_work(&conn->c_down_w); in rds_conn_destroy()
357 cancel_delayed_work_sync(&conn->c_send_w); in rds_conn_destroy()
358 cancel_delayed_work_sync(&conn->c_recv_w); in rds_conn_destroy()
362 &conn->c_send_queue, in rds_conn_destroy()
368 if (conn->c_xmit_rm) in rds_conn_destroy()
369 rds_message_put(conn->c_xmit_rm); in rds_conn_destroy()
371 conn->c_trans->conn_free(conn->c_transport_data); in rds_conn_destroy()
378 rds_cong_remove_conn(conn); in rds_conn_destroy()
380 BUG_ON(!list_empty(&conn->c_retrans)); in rds_conn_destroy()
381 kmem_cache_free(rds_conn_slab, conn); in rds_conn_destroy()
396 struct rds_connection *conn; in rds_conn_message_info() local
408 hlist_for_each_entry_rcu(conn, head, c_hash_node) { in rds_conn_message_info()
410 list = &conn->c_send_queue; in rds_conn_message_info()
412 list = &conn->c_retrans; in rds_conn_message_info()
414 spin_lock_irqsave(&conn->c_lock, flags); in rds_conn_message_info()
421 conn->c_laddr, in rds_conn_message_info()
422 conn->c_faddr, 0); in rds_conn_message_info()
425 spin_unlock_irqrestore(&conn->c_lock, flags); in rds_conn_message_info()
457 struct rds_connection *conn; in rds_for_each_conn_info() local
467 hlist_for_each_entry_rcu(conn, head, c_hash_node) { in rds_for_each_conn_info()
470 if (!visitor(conn, buffer)) in rds_for_each_conn_info()
487 static int rds_conn_info_visitor(struct rds_connection *conn, in rds_conn_info_visitor() argument
492 cinfo->next_tx_seq = conn->c_next_tx_seq; in rds_conn_info_visitor()
493 cinfo->next_rx_seq = conn->c_next_rx_seq; in rds_conn_info_visitor()
494 cinfo->laddr = conn->c_laddr; in rds_conn_info_visitor()
495 cinfo->faddr = conn->c_faddr; in rds_conn_info_visitor()
496 strncpy(cinfo->transport, conn->c_trans->t_name, in rds_conn_info_visitor()
500 rds_conn_info_set(cinfo->flags, test_bit(RDS_IN_XMIT, &conn->c_flags), in rds_conn_info_visitor()
504 atomic_read(&conn->c_state) == RDS_CONN_CONNECTING, in rds_conn_info_visitor()
507 atomic_read(&conn->c_state) == RDS_CONN_UP, in rds_conn_info_visitor()
556 void rds_conn_drop(struct rds_connection *conn) in rds_conn_drop() argument
558 atomic_set(&conn->c_state, RDS_CONN_ERROR); in rds_conn_drop()
559 queue_work(rds_wq, &conn->c_down_w); in rds_conn_drop()
567 void rds_conn_connect_if_down(struct rds_connection *conn) in rds_conn_connect_if_down() argument
569 if (rds_conn_state(conn) == RDS_CONN_DOWN && in rds_conn_connect_if_down()
570 !test_and_set_bit(RDS_RECONNECT_PENDING, &conn->c_flags)) in rds_conn_connect_if_down()
571 queue_delayed_work(rds_wq, &conn->c_conn_w, 0); in rds_conn_connect_if_down()
579 __rds_conn_error(struct rds_connection *conn, const char *fmt, ...) in __rds_conn_error() argument
587 rds_conn_drop(conn); in __rds_conn_error()