INIT_DELAYED_WORK(&cp->cp_conn_w, rds_connect_worker);
INIT_DELAYED_WORK(&cp->cp_hb_w, rds_hb_worker);
INIT_DELAYED_WORK(&cp->cp_reconn_w, rds_reconnect_timeout);
- INIT_DELAYED_WORK(&cp->cp_reject_w, rds_reject_worker);
INIT_WORK(&cp->cp_down_w, rds_shutdown_worker);
mutex_init(&cp->cp_cm_lock);
cp->cp_flags = 0;
}
EXPORT_SYMBOL_GPL(rds_conn_find);
-void rds_conn_shutdown(struct rds_conn_path *cp, int restart)
+void rds_conn_shutdown(struct rds_conn_path *cp)
{
struct rds_connection *conn = cp->cp_conn;
* conn - the reconnect is always triggered by the active peer. */
cancel_delayed_work_sync(&cp->cp_conn_w);
rcu_read_lock();
- if (!hlist_unhashed(&conn->c_hash_node) && restart) {
+ if (!hlist_unhashed(&conn->c_hash_node)) {
rcu_read_unlock();
rds_queue_reconnect(cp);
} else {
conn->c_acl_en = acl_ret;
conn->c_acl_init = 1;
- if (dp->dp_tos && !conn->c_base_conn) {
- conn->c_base_conn = rds_conn_create(&init_net,
- dp->dp_daddr, dp->dp_saddr,
- &rds_ib_transport, 0, GFP_KERNEL);
- if (IS_ERR(conn->c_base_conn)) {
- conn = NULL;
- goto out;
- }
- }
-
/*
* The connection request may occur while the
* previous connection exist, e.g. in case of failover.
pr_warn("Rejected: CSR_DEF err 0, calling rds_conn_drop <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n",
NIPQUAD(conn->c_laddr),
NIPQUAD(conn->c_faddr), conn->c_tos);
- if (!conn->c_tos) {
+ if (!conn->c_tos)
conn->c_proposed_version =
RDS_PROTOCOL_COMPAT_VERSION;
- rds_conn_drop(conn,
- DR_IB_CONSUMER_DEFINED_REJ);
- } else {
- queue_delayed_work(conn->c_path[0].cp_wq,
- &conn->c_reject_w,
- msecs_to_jiffies(10));
- }
+ rds_conn_drop(conn,
+ DR_IB_CONSUMER_DEFINED_REJ);
} else if (event->status == RDS_REJ_CONSUMER_DEFINED &&
(*err) == RDS_ACL_FAILURE) {
/* Rejection due to ACL violation */
struct delayed_work cp_send_w;
struct delayed_work cp_recv_w;
struct delayed_work cp_conn_w;
- struct delayed_work cp_reject_w;
struct delayed_work cp_hb_w;
struct delayed_work cp_reconn_w;
struct work_struct cp_down_w;
unsigned long cp_hb_start;
- struct rds_connection *cp_base_conn;
-
- unsigned int cp_route_to_base;
-
unsigned int cp_rdsinfo_pending;
unsigned int cp_reconnect_racing;
struct rds_connection *rds_conn_find(struct net *net, __be32 laddr,
__be32 faddr,
struct rds_transport *trans, u8 tos);
-void rds_conn_shutdown(struct rds_conn_path *cp, int restart);
+void rds_conn_shutdown(struct rds_conn_path *cp);
void rds_conn_destroy(struct rds_connection *conn, int shutdown);
void rds_conn_reset(struct rds_connection *conn);
void rds_conn_drop(struct rds_connection *conn, int reason);
struct rm_rdma_op *);
int rds_send_internal(struct rds_connection *conn, struct rds_sock *rs,
struct sk_buff *skb, gfp_t gfp);
-void rds_route_to_base(struct rds_connection *conn);
extern unsigned int rds_async_send_enabled;
void rds_connect_worker(struct work_struct *);
void rds_shutdown_worker(struct work_struct *);
void rds_send_worker(struct work_struct *);
-void rds_reject_worker(struct work_struct *);
void rds_recv_worker(struct work_struct *);
void rds_hb_worker(struct work_struct *);
void rds_reconnect_timeout(struct work_struct *);
#define c_reconn_flags c_path[0].cp_reconn_flags
#define c_reconnect c_path[0].cp_reconnect
#define c_to_index c_path[0].cp_to_index
-#define c_base_conn c_path[0].cp_base_conn
#define c_acl_en c_path[0].cp_acl_en
#define c_reconnect_err c_path[0].cp_reconnect_err
-#define c_reject_w c_path[0].cp_reject_w
#endif /* _RDS_RDS_SINGLE_H */
ret = PTR_ERR(conn);
goto out;
}
-
- if (rs->rs_tos && !conn->c_path[0].cp_base_conn) {
- struct rds_conn_path *cp0 = &conn->c_path[0];
-
- WARN_ON(conn->c_trans->t_mp_capable);
- cp0->cp_base_conn = rds_conn_create_outgoing(
- sock_net(sock->sk),
- rs->rs_bound_addr, daddr,
- rs->rs_transport, 0,
- sock->sk->sk_allocation);
- if (IS_ERR(cp0->cp_base_conn)) {
- ret = PTR_ERR(cp0->cp_base_conn);
- goto out;
- }
- rds_rtd(RDS_RTD_CM_EXT, "checking conn %p\n",
- cp0->cp_base_conn);
- rds_conn_connect_if_down(cp0->cp_base_conn);
- }
rs->rs_conn = conn;
}
- if (conn->c_tos && !rds_conn_up(conn)) {
- struct rds_conn_path *cp0 = &conn->c_path[0];
-
- WARN_ON(conn->c_trans->t_mp_capable);
- if (!rds_conn_up(cp0->cp_base_conn)) {
- ret = -EAGAIN;
- goto out;
- } else if (cp0->cp_base_conn->c_version ==
- RDS_PROTOCOL_COMPAT_VERSION) {
- if (!cp0->cp_reconnect || cp0->cp_route_to_base)
- conn = cp0->cp_base_conn;
- else {
- ret = -EAGAIN;
- goto out;
- }
- }
- }
-
/* Parse any control messages the user may have included. */
ret = rds_cmsg_send(rs, rm, msg, &allocated_mr);
if (ret) {
return 0;
}
-void rds_route_to_base(struct rds_connection *conn)
-{
- struct rds_message *rm, *tmp;
- struct rds_conn_path *cp = &conn->c_path[0];
- struct rds_connection *base_conn = cp->cp_base_conn;
- unsigned long flags;
-
- WARN_ON(conn->c_trans->t_mp_capable);
- BUG_ON(!conn->c_tos || rds_conn_up(conn) || !base_conn ||
- !list_empty(&cp->cp_retrans));
-
- spin_lock_irqsave(&base_conn->c_path[0].cp_lock, flags);
- list_for_each_entry_safe(rm, tmp, &cp->cp_send_queue, m_conn_item) {
- list_del_init(&rm->m_conn_item);
- rm->m_inc.i_conn = base_conn;
- rm->m_inc.i_hdr.h_sequence =
- cpu_to_be64(base_conn->c_path[0].cp_next_tx_seq++);
- list_add_tail(&rm->m_conn_item,
- &base_conn->c_path[0].cp_send_queue);
- }
- spin_unlock_irqrestore(&base_conn->c_path[0].cp_lock, flags);
- cp->cp_route_to_base = 1;
- queue_delayed_work(rds_wq, &base_conn->c_path[0].cp_send_w, 0);
-}
-
int
rds_send_pong(struct rds_conn_path *cp, __be16 dport)
{
cp->cp_connection_start = get_seconds();
cp->cp_reconnect = 1;
conn->c_proposed_version = RDS_PROTOCOL_VERSION;
- cp->cp_route_to_base = 0;
}
EXPORT_SYMBOL_GPL(rds_connect_path_complete);
}
}
-void rds_reject_worker(struct work_struct *work)
-{
- struct rds_conn_path *cp = container_of(work,
- struct rds_conn_path,
- cp_reject_w.work);
-
- WARN_ON(cp->cp_conn->c_trans->t_mp_capable);
- atomic_set(&cp->cp_state, RDS_CONN_ERROR);
- rds_rtd(RDS_RTD_CM, "calling rds_conn_shutdown, conn %p:0\n",
- cp->cp_conn);
- rds_conn_shutdown(cp, 0);
- rds_route_to_base(cp->cp_conn);
-}
-
void rds_hb_worker(struct work_struct *work)
{
struct rds_conn_path *cp = container_of(work,
conn->c_tos,
conn_drop_reason_str(cp->cp_drop_source));
- rds_conn_shutdown(cp, 1);
+ rds_conn_shutdown(cp);
}
void rds_threads_exit(void)