From: Avinash Repaka Date: Tue, 17 May 2016 21:42:19 +0000 (-0700) Subject: RDS: Change number based conn-drop reasons to enum X-Git-Tag: v4.1.12-92~153^2~8 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=dcfa750d49e1f71c20d0f5f73756e931b6c79091;p=users%2Fjedix%2Flinux-maple.git RDS: Change number based conn-drop reasons to enum This patch converts the number based connection-drop reasons to enums, making it easy to grep the reasons and to develop new patches based on these reasons. Orabug: 23294707 Signed-off-by: Avinash Repaka Acked-by: Santosh Shilimkar --- diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c index 0adf3af3d01d..f3948435c1b9 100644 --- a/net/rds/af_rds.c +++ b/net/rds/af_rds.c @@ -344,7 +344,7 @@ static int rds_user_reset(struct rds_sock *rs, char __user *optval, int optlen) "<%u.%u.%u.%u,%u.%u.%u.%u,%d>\n", NIPQUAD(reset.src.s_addr), NIPQUAD(reset.dst.s_addr), conn->c_tos); - conn->c_drop_source = 1; + conn->c_drop_source = DR_USER_RESET; rds_conn_drop(conn); } diff --git a/net/rds/connection.c b/net/rds/connection.c index e9eecf497ee6..0b7d1e2ee587 100644 --- a/net/rds/connection.c +++ b/net/rds/connection.c @@ -322,7 +322,7 @@ void rds_conn_shutdown(struct rds_connection *conn, int restart) mutex_lock(&conn->c_cm_lock); if (!rds_conn_transition(conn, RDS_CONN_UP, RDS_CONN_DISCONNECTING) && !rds_conn_transition(conn, RDS_CONN_ERROR, RDS_CONN_DISCONNECTING)) { - conn->c_drop_source = 2; + conn->c_drop_source = DR_INV_CONN_STATE; rds_conn_error(conn, "shutdown called in state %d\n", atomic_read(&conn->c_state)); mutex_unlock(&conn->c_cm_lock); @@ -344,7 +344,7 @@ void rds_conn_shutdown(struct rds_connection *conn, int restart) * Quite reproduceable with loopback connections. * Mostly harmless. */ - conn->c_drop_source = 3; + conn->c_drop_source = DR_DOWN_TRANSITION_FAIL; rds_conn_error(conn, "%s: failed to transition to state DOWN, " "current state is %d\n", @@ -400,7 +400,7 @@ void rds_conn_destroy(struct rds_connection *conn) synchronize_rcu(); /* shut the connection down */ - conn->c_drop_source = 4; + conn->c_drop_source = DR_CONN_DESTROY; rds_conn_drop(conn); flush_work(&conn->c_down_w); @@ -613,92 +613,70 @@ void rds_conn_exit(void) rds_conn_message_info_retrans); } -char *conn_drop_reason_str(u8 reason) +static char *conn_drop_reasons[] = { + [DR_DEFAULT] = "unknown reason (default_state)", + [DR_USER_RESET] = "user reset", + [DR_INV_CONN_STATE] = "invalid connection state", + [DR_DOWN_TRANSITION_FAIL] = "failure to move to DOWN state", + [DR_CONN_DESTROY] = "connection destroy", + [DR_ZERO_LANE_DOWN] = "zero lane went down", + [DR_CONN_CONNECT_FAIL] = "conn_connect failure", + [DR_HB_TIMEOUT] = "hb timeout", + [DR_RECONNECT_TIMEOUT] = "reconnect timeout", + [DR_IB_CONN_DROP_RACE] = "race between ESTABLISHED event and drop", + [DR_IB_NOT_CONNECTING_STATE] = "conn is not in CONNECTING state", + [DR_IB_QP_EVENT] = "qp event", + [DR_IB_BASE_CONN_DOWN] = "base conn down", + [DR_IB_REQ_WHILE_CONN_UP] = "incoming REQ in CONN_UP state", + [DR_IB_REQ_WHILE_CONNECTING] = "incoming REQ in CONNECTING state", + [DR_IB_PAS_SETUP_QP_FAIL] = "passive setup_qp failure", + [DR_IB_RDMA_ACCEPT_FAIL] = "rdma_accept failure", + [DR_IB_ACT_SETUP_QP_FAIL] = "active setup_qp failure", + [DR_IB_RDMA_CONNECT_FAIL] = "rdma_connect failure", + [DR_IB_SET_IB_PATH_FAIL] = "rdma_set_ib_paths failure", + [DR_IB_RESOLVE_ROUTE_FAIL] = "resolve_route failure", + [DR_IB_RDMA_CM_ID_MISMATCH] = "detected rdma_cm_id mismatch", + [DR_IB_ROUTE_ERR] = "ROUTE_ERROR event", + [DR_IB_ADDR_ERR] = "ADDR_ERROR event", + [DR_IB_CONNECT_ERR] = "CONNECT_ERROR or UNREACHABLE or DEVICE_REMOVE event", + [DR_IB_CONSUMER_DEFINED_REJ] = "CONSUMER_DEFINED reject", + [DR_IB_REJECTED_EVENT] = "REJECTED event", + [DR_IB_ADDR_CHANGE] = "ADDR_CHANGE event", + [DR_IB_DISCONNECTED_EVENT] = "DISCONNECTED event", + [DR_IB_TIMEWAIT_EXIT] = "TIMEWAIT_EXIT event", + [DR_IB_POST_RECV_FAIL] = "post_recv failure", + [DR_IB_SEND_ACK_FAIL] = "send_ack failure", + [DR_IB_HEADER_MISSING] = "no header in incoming msg", + [DR_IB_HEADER_CORRUPTED] = "corrupted header in incoming msg", + [DR_IB_FRAG_HEADER_MISMATCH] = "fragment header mismatch", + [DR_IB_RECV_COMP_ERR] = "recv completion error", + [DR_IB_SEND_COMP_ERR] = "send completion error", + [DR_IB_POST_SEND_FAIL] = "post_send failure", + [DR_IB_UMMOD] = "rds_rdma module unload", + [DR_IB_ACTIVE_BOND_FAILOVER] = "active bonding failover", + [DR_IB_LOOPBACK_CONN_DROP] = "corresponding loopback conn drop", + [DR_IB_ACTIVE_BOND_FAILBACK] = "active bonding failback", + [DR_IW_QP_EVENT] = "qp_event", + [DR_IW_REQ_WHILE_CONNECTING] = "incoming REQ in connecting state", + [DR_IW_PAS_SETUP_QP_FAIL] = "passive setup_qp failure", + [DR_IW_RDMA_ACCEPT_FAIL] = "rdma_accept failure", + [DR_IW_ACT_SETUP_QP_FAIL] = "active setup_qp failure", + [DR_IW_RDMA_CONNECT_FAIL] = "rdma_connect failure", + [DR_IW_POST_RECV_FAIL] = "post_recv failure", + [DR_IW_SEND_ACK_FAIL] = "send_ack failure", + [DR_IW_HEADER_MISSING] = "no header in incoming msg", + [DR_IW_HEADER_CORRUPTED] = "corrupted header in incoming msg", + [DR_IW_FRAG_HEADER_MISMATCH] = "fragment header mismatch", + [DR_IW_RECV_COMP_ERR] = "recv completion error", + [DR_IW_SEND_COMP_ERR] = "send completion error", + [DR_TCP_STATE_CLOSE] = "sk_state to TCP_CLOSE", + [DR_TCP_SEND_FAIL] = "tcp_send failure", +}; + +char *conn_drop_reason_str(enum rds_conn_drop_src reason) { - /* Here is distribution of drop reason: - * - * 0-19: rds-core - * - * 20-119: IB - * 20-39: ib_cm - * 40-59: event handling - * 60-79: data path - * 80-119: special features like active bonding - * - * 120-139: iWARP - * - * 140-159: TCP - * - * 160-255: any other future additions - * - */ - switch (reason) { - case 1: return "user reset"; - case 2: return "invalid connection state"; - case 3: return "failure to move to DOWN state"; - case 4: return "connection destroy"; - case 5: return "zero lane went down"; - case 6: return "conn_connect failure"; - case 7: return "hb timeout"; - case 8: return "reconnect timeout"; - - case 20: return "race between ESTABLISHED event and drop"; - case 21: return "conn is not in CONNECTING state"; - case 22: return "qp event"; - case 23: return "base conn down"; - case 24: return "incoming REQ in CONN_UP state"; - case 25: return "incoming REQ in CONNECTING state"; - case 26: return "setup_qp failure"; - case 27: return "rdma_accept failure"; - case 28: return "setup_qp failure"; - case 29: return "rdma_connect failure"; - - case 40: return "rdma_set_ib_paths failure"; - case 41: return "resolve_route failure"; - case 42: return "detected rdma_cm_id mismatch"; - case 43: return "ROUTE_ERROR event"; - case 44: return "ADDR_ERROR event"; - case 45: return "CONNECT_ERROR or UNREACHABLE or DEVICE_REMOVE event"; - case 46: return "CONSUMER_DEFINED reject"; - case 47: return "REJECTED event"; - case 48: return "ADDR_CHANGE event"; - case 49: return "DISCONNECTED event"; - case 50: return "TIMEWAIT_EXIT event"; - - case 60: return "post_recv failure"; - case 61: return "send_ack failure"; - case 62: return "no header in incoming msg"; - case 63: return "corrupted header in incoming msg"; - case 64: return "fragment header mismatch"; - case 65: return "recv completion error"; - case 66: return "send completion error"; - case 67: return "post_send failure"; - - case 80: return "rds_rdma module unload"; - case 81: return "active bonding failover"; - case 82: return "corresponding loopback conn drop"; - case 83: return "active bonding failback"; - - case 120: return "qp_event"; - case 121: return "incoming REQ in connecting state"; - case 122: return "setup_qp failure"; - case 123: return "rdma_accept failure"; - case 124: return "setup_qp failure"; - case 125: return "rdma_connect failure"; - - case 130: return "post_recv failure"; - case 131: return "send_ack failure"; - case 132: return "no header in incoming msg"; - case 133: return "corrupted header in incoming msg"; - case 134: return "fragment header mismatch"; - case 135: return "recv completion error"; - case 136: return "send completion error"; - - case 140: return "sk_state to TCP_CLOSE"; - case 141: return "tcp_send failure"; - - default: return "unknown reason"; - } + return rds_str_array(conn_drop_reasons, + ARRAY_SIZE(conn_drop_reasons), reason); } static void rds_conn_probe_lanes(struct rds_connection *conn) @@ -723,7 +701,7 @@ static void rds_conn_probe_lanes(struct rds_connection *conn) NIPQUAD(tmp->c_faddr), tmp->c_tos); - conn->c_drop_source = 5; + conn->c_drop_source = DR_ZERO_LANE_DOWN; rds_conn_drop(tmp); } } diff --git a/net/rds/ib.c b/net/rds/ib.c index e1f7a749d15e..26d5302b0c63 100644 --- a/net/rds/ib.c +++ b/net/rds/ib.c @@ -198,7 +198,7 @@ void rds_ib_dev_shutdown(struct rds_ib_device *rds_ibdev) spin_lock_irqsave(&rds_ibdev->spinlock, flags); list_for_each_entry(ic, &rds_ibdev->conn_list, ib_node) { - ic->conn->c_drop_source = 80; + ic->conn->c_drop_source = DR_IB_UMMOD; rds_conn_drop(ic->conn); } spin_unlock_irqrestore(&rds_ibdev->spinlock, flags); @@ -632,7 +632,7 @@ static void rds_ib_conn_drop(struct work_struct *_work) rds_rtd(RDS_RTD_CM_EXT, "conn: %p, calling rds_conn_drop\n", conn); - conn->c_drop_source = 81; + conn->c_drop_source = DR_IB_ACTIVE_BOND_FAILOVER; rds_conn_drop(conn); kfree(work); @@ -864,7 +864,7 @@ static int rds_ib_move_ip(char *from_dev, "conn:%p, tos %d, calling rds_conn_drop\n", ic2->conn, ic2->conn->c_tos); - ic2->conn->c_drop_source = 82; + ic2->conn->c_drop_source = DR_IB_LOOPBACK_CONN_DROP; rds_conn_drop(ic2->conn); } } @@ -893,7 +893,7 @@ static int rds_ib_move_ip(char *from_dev, rds_rtd(RDS_RTD_CM_EXT, "conn: %p, tos %d, calling rds_conn_drop\n", ic->conn, ic->conn->c_tos); - ic->conn->c_drop_source = 83; + ic->conn->c_drop_source = DR_IB_ACTIVE_BOND_FAILBACK; rds_conn_drop(ic->conn); } } diff --git a/net/rds/ib_cm.c b/net/rds/ib_cm.c index f06a241a7810..42f4fbd1c2bc 100644 --- a/net/rds/ib_cm.c +++ b/net/rds/ib_cm.c @@ -245,7 +245,7 @@ void rds_ib_cm_connect_complete(struct rds_connection *conn, struct rdma_cm_even rds_rtd(RDS_RTD_CM, "ic->i_cm_id is NULL, ic: %p, calling rds_conn_drop\n", ic); - conn->c_drop_source = 20; + conn->c_drop_source = DR_IB_CONN_DROP_RACE; rds_conn_drop(conn); return; } @@ -256,7 +256,7 @@ void rds_ib_cm_connect_complete(struct rds_connection *conn, struct rdma_cm_even rds_rtd(RDS_RTD_CM, "conn is in connecting state, conn: %p, calling rds_conn_drop\n", conn); - conn->c_drop_source = 21; + conn->c_drop_source = DR_IB_NOT_CONNECTING_STATE; rds_conn_drop(conn); return; } @@ -601,7 +601,7 @@ static void rds_ib_qp_event_handler(struct ib_event *event, void *data) "Fatal QP Event %u (%s) - connection %pI4->%pI4 tos %d, reconnecting\n", event->event, rds_ib_event_str(event->event), &conn->c_laddr, &conn->c_faddr, conn->c_tos); - conn->c_drop_source = 22; + conn->c_drop_source = DR_IB_QP_EVENT; rds_conn_drop(conn); break; } @@ -908,7 +908,7 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id, NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr), conn->c_tos); - conn->c_drop_source = 23; + conn->c_drop_source = DR_IB_BASE_CONN_DOWN; rds_conn_drop(conn); } @@ -931,7 +931,7 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id, if (rds_conn_state(conn) == RDS_CONN_UP) { rds_rtd(RDS_RTD_CM_EXT_P, "incoming connect while connecting\n"); - conn->c_drop_source = 24; + conn->c_drop_source = DR_IB_REQ_WHILE_CONN_UP; rds_conn_drop(conn); rds_ib_stats_inc(s_ib_listen_closed_stale); } else if (rds_conn_state(conn) == RDS_CONN_CONNECTING) { @@ -953,7 +953,7 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id, NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr), conn->c_tos); - conn->c_drop_source = 25; + conn->c_drop_source = DR_IB_REQ_WHILE_CONNECTING; rds_conn_drop(conn); rds_ib_stats_inc(s_ib_listen_closed_stale); } else { @@ -997,7 +997,7 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id, err = rds_ib_setup_qp(conn); if (err) { - conn->c_drop_source = 26; + conn->c_drop_source = DR_IB_PAS_SETUP_QP_FAIL; rds_ib_conn_error(conn, "rds_ib_setup_qp failed (%d)\n", err); goto out; } @@ -1014,7 +1014,7 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id, /* rdma_accept() calls rdma_reject() internally if it fails */ err = rdma_accept(cm_id, &conn_param); if (err) { - conn->c_drop_source = 27; + conn->c_drop_source = DR_IB_RDMA_ACCEPT_FAIL; rds_ib_conn_error(conn, "rdma_accept failed (%d)\n", err); } #if RDMA_RDS_APM_SUPPORTED @@ -1065,7 +1065,7 @@ int rds_ib_cm_initiate_connect(struct rdma_cm_id *cm_id) ret = rds_ib_setup_qp(conn); if (ret) { - conn->c_drop_source = 28; + conn->c_drop_source = DR_IB_ACT_SETUP_QP_FAIL; rds_ib_conn_error(conn, "rds_ib_setup_qp failed (%d)\n", ret); goto out; } @@ -1075,7 +1075,7 @@ int rds_ib_cm_initiate_connect(struct rdma_cm_id *cm_id) ib_init_frag_size); ret = rdma_connect(cm_id, &conn_param); if (ret) { - conn->c_drop_source = 29; + conn->c_drop_source = DR_IB_RDMA_CONNECT_FAIL; rds_ib_conn_error(conn, "rdma_connect failed (%d)\n", ret); } diff --git a/net/rds/ib_recv.c b/net/rds/ib_recv.c index ad5bd62ca000..819b27c7ee56 100644 --- a/net/rds/ib_recv.c +++ b/net/rds/ib_recv.c @@ -633,7 +633,7 @@ void rds_ib_recv_refill(struct rds_connection *conn, int prefill, gfp_t gfp) recv->r_ibinc, sg_page(&recv->r_frag->f_sg), (long) sg_dma_address(&recv->r_frag->f_sg), ret); if (ret) { - conn->c_drop_source = 60; + conn->c_drop_source = DR_IB_POST_RECV_FAIL; rds_ib_conn_error(conn, "recv post on " "%pI4 returned %d, disconnecting and " "reconnecting\n", &conn->c_faddr, @@ -923,7 +923,7 @@ static void rds_ib_send_ack(struct rds_ib_connection *ic, unsigned int adv_credi rds_ib_stats_inc(s_ib_ack_send_failure); - ic->conn->c_drop_source = 61; + ic->conn->c_drop_source = DR_IB_SEND_ACK_FAIL; rds_ib_conn_error(ic->conn, "sending ack failed\n"); } else rds_ib_stats_inc(s_ib_ack_sent); @@ -1101,7 +1101,7 @@ static void rds_ib_process_recv(struct rds_connection *conn, data_len); if (data_len < sizeof(struct rds_header)) { - conn->c_drop_source = 62; + conn->c_drop_source = DR_IB_HEADER_MISSING; rds_ib_conn_error(conn, "incoming message " "from %pI4 didn't inclue a " "header, disconnecting and " @@ -1115,7 +1115,7 @@ static void rds_ib_process_recv(struct rds_connection *conn, /* Validate the checksum. */ if (!rds_message_verify_checksum(ihdr)) { - conn->c_drop_source = 63; + conn->c_drop_source = DR_IB_HEADER_CORRUPTED; rds_ib_conn_error(conn, "incoming message " "from %pI4 has corrupted header - " "forcing a reconnect\n", @@ -1183,7 +1183,7 @@ static void rds_ib_process_recv(struct rds_connection *conn, || hdr->h_len != ihdr->h_len || hdr->h_sport != ihdr->h_sport || hdr->h_dport != ihdr->h_dport) { - conn->c_drop_source = 64; + conn->c_drop_source = DR_IB_FRAG_HEADER_MISMATCH; rds_ib_conn_error(conn, "fragment header mismatch; forcing reconnect\n"); return; @@ -1344,7 +1344,7 @@ void rds_ib_recv_cqe_handler(struct rds_ib_connection *ic, } else { /* We expect errors as the qp is drained during shutdown */ if (rds_conn_up(conn) || rds_conn_connecting(conn)) { - conn->c_drop_source = 65; + conn->c_drop_source = DR_IB_RECV_COMP_ERR; rds_ib_conn_error(conn, "recv completion " "<%pI4,%pI4,%d> had status %u " "vendor_err %u, disconnecting and " diff --git a/net/rds/ib_send.c b/net/rds/ib_send.c index 621860fb0917..8f19eb4a93f2 100644 --- a/net/rds/ib_send.c +++ b/net/rds/ib_send.c @@ -341,7 +341,7 @@ void rds_ib_send_cqe_handler(struct rds_ib_connection *ic, struct ib_wc *wc) /* We expect errors as the qp is drained during shutdown */ if (wc->status != IB_WC_SUCCESS && rds_conn_up(conn)) { - conn->c_drop_source = 66; + conn->c_drop_source = DR_IB_SEND_COMP_ERR; rds_ib_conn_error(conn, "send completion <%u.%u.%u.%u,%u.%u.%u.%u,%d> status " "%u vendor_err %u, disconnecting and reconnecting\n", @@ -812,7 +812,7 @@ int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm, prev->s_op = NULL; } - ic->conn->c_drop_source = 67; + ic->conn->c_drop_source = DR_IB_POST_SEND_FAIL; rds_ib_conn_error(ic->conn, "ib_post_send failed\n"); goto out; } diff --git a/net/rds/iw_cm.c b/net/rds/iw_cm.c index ed0f8078b0bd..168c31e8c1b2 100644 --- a/net/rds/iw_cm.c +++ b/net/rds/iw_cm.c @@ -160,7 +160,7 @@ static void rds_iw_qp_event_handler(struct ib_event *event, void *data) "- connection %pI4->%pI4, reconnecting\n", event->event, &conn->c_laddr, &conn->c_faddr); - conn->c_drop_source = 120; + conn->c_drop_source = DR_IW_QP_EVENT; rds_conn_drop(conn); break; } @@ -416,7 +416,7 @@ int rds_iw_cm_handle_connect(struct rdma_cm_id *cm_id, if (!rds_conn_transition(conn, RDS_CONN_DOWN, RDS_CONN_CONNECTING)) { if (rds_conn_state(conn) == RDS_CONN_UP) { rdsdebug("incoming connect while connecting\n"); - conn->c_drop_source = 121; + conn->c_drop_source = DR_IW_REQ_WHILE_CONNECTING; rds_conn_drop(conn); rds_iw_stats_inc(s_iw_listen_closed_stale); } else @@ -453,7 +453,7 @@ int rds_iw_cm_handle_connect(struct rdma_cm_id *cm_id, err = rds_iw_setup_qp(conn); if (err) { - conn->c_drop_source = 122; + conn->c_drop_source = DR_IW_PAS_SETUP_QP_FAIL; rds_iw_conn_error(conn, "rds_iw_setup_qp failed (%d)\n", err); goto out; } @@ -464,7 +464,7 @@ int rds_iw_cm_handle_connect(struct rdma_cm_id *cm_id, err = rdma_accept(cm_id, &conn_param); mutex_unlock(&conn->c_cm_lock); if (err) { - conn->c_drop_source = 123; + conn->c_drop_source = DR_IW_RDMA_ACCEPT_FAIL; rds_iw_conn_error(conn, "rdma_accept failed (%d)\n", err); goto out; } @@ -492,7 +492,7 @@ int rds_iw_cm_initiate_connect(struct rdma_cm_id *cm_id) ret = rds_iw_setup_qp(conn); if (ret) { - conn->c_drop_source = 124; + conn->c_drop_source = DR_IW_ACT_SETUP_QP_FAIL; rds_iw_conn_error(conn, "rds_iw_setup_qp failed (%d)\n", ret); goto out; } @@ -501,7 +501,7 @@ int rds_iw_cm_initiate_connect(struct rdma_cm_id *cm_id) ret = rdma_connect(cm_id, &conn_param); if (ret) { - conn->c_drop_source = 125; + conn->c_drop_source = DR_IW_RDMA_CONNECT_FAIL; rds_iw_conn_error(conn, "rdma_connect failed (%d)\n", ret); } out: diff --git a/net/rds/iw_recv.c b/net/rds/iw_recv.c index 7da890685c55..cb2d87a96551 100644 --- a/net/rds/iw_recv.c +++ b/net/rds/iw_recv.c @@ -252,7 +252,7 @@ int rds_iw_recv_refill(struct rds_connection *conn, gfp_t kptr_gfp, recv->r_iwinc, recv->r_frag->f_page, (long) recv->r_frag->f_mapped, ret); if (ret) { - conn->c_drop_source = 130; + conn->c_drop_source = DR_IW_POST_RECV_FAIL; rds_iw_conn_error(conn, "recv post on " "%pI4 returned %d, disconnecting and " "reconnecting\n", &conn->c_faddr, @@ -455,7 +455,7 @@ static void rds_iw_send_ack(struct rds_iw_connection *ic, unsigned int adv_credi rds_iw_stats_inc(s_iw_ack_send_failure); - ic->conn->c_drop_source = 131; + ic->conn->c_drop_source = DR_IW_SEND_ACK_FAIL; rds_iw_conn_error(ic->conn, "sending ack failed\n"); } else rds_iw_stats_inc(s_iw_ack_sent); @@ -646,7 +646,7 @@ static void rds_iw_process_recv(struct rds_connection *conn, byte_len); if (byte_len < sizeof(struct rds_header)) { - conn->c_drop_source = 132; + conn->c_drop_source = DR_IW_HEADER_MISSING; rds_iw_conn_error(conn, "incoming message " "from %pI4 didn't inclue a " "header, disconnecting and " @@ -660,7 +660,7 @@ static void rds_iw_process_recv(struct rds_connection *conn, /* Validate the checksum. */ if (!rds_message_verify_checksum(ihdr)) { - conn->c_drop_source = 133; + conn->c_drop_source = DR_IW_HEADER_CORRUPTED; rds_iw_conn_error(conn, "incoming message " "from %pI4 has corrupted header - " "forcing a reconnect\n", @@ -723,7 +723,7 @@ static void rds_iw_process_recv(struct rds_connection *conn, || hdr->h_len != ihdr->h_len || hdr->h_sport != ihdr->h_sport || hdr->h_dport != ihdr->h_dport) { - conn->c_drop_source = 134; + conn->c_drop_source = DR_IW_FRAG_HEADER_MISMATCH; rds_iw_conn_error(conn, "fragment header mismatch; forcing reconnect\n"); return; @@ -808,7 +808,7 @@ static inline void rds_poll_cq(struct rds_iw_connection *ic, if (wc.status == IB_WC_SUCCESS) { rds_iw_process_recv(conn, recv, wc.byte_len, state); } else { - conn->c_drop_source = 135; + conn->c_drop_source = DR_IW_RECV_COMP_ERR; rds_iw_conn_error(conn, "recv completion on " "%pI4 had status %u, disconnecting and " "reconnecting\n", &conn->c_faddr, diff --git a/net/rds/iw_send.c b/net/rds/iw_send.c index 0820c4abc2eb..7541ddbfc0ba 100644 --- a/net/rds/iw_send.c +++ b/net/rds/iw_send.c @@ -293,7 +293,7 @@ void rds_iw_send_cq_comp_handler(struct ib_cq *cq, void *context) /* We expect errors as the qp is drained during shutdown */ if (wc.status != IB_WC_SUCCESS && rds_conn_up(conn)) { - conn->c_drop_source = 136; + conn->c_drop_source = DR_IW_SEND_COMP_ERR; rds_iw_conn_error(conn, "send completion on %pI4 " "had status %u, disconnecting and reconnecting\n", diff --git a/net/rds/rdma_transport.c b/net/rds/rdma_transport.c index c5d5011b15ad..483905d58eca 100644 --- a/net/rds/rdma_transport.c +++ b/net/rds/rdma_transport.c @@ -166,7 +166,7 @@ int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id, "ADDR_RESOLVED: ret %d, calling rds_conn_drop <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n", ret, NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr), conn->c_tos); - conn->c_drop_source = 40; + conn->c_drop_source = DR_IB_SET_IB_PATH_FAIL; rds_conn_drop(conn); ret = 0; } @@ -191,7 +191,7 @@ int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id, ibic = conn->c_transport_data; if (ibic && ibic->i_cm_id == cm_id) ibic->i_cm_id = NULL; - conn->c_drop_source = 41; + conn->c_drop_source = DR_IB_RESOLVE_ROUTE_FAIL; rds_conn_drop(conn); } } else if (conn->c_to_index < (RDS_RDMA_RESOLVE_TO_MAX_INDEX-1)) @@ -215,7 +215,7 @@ int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id, "ROUTE_RESOLVED: calling rds_conn_drop, conn %p <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n", conn, NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr), conn->c_tos); - conn->c_drop_source = 42; + conn->c_drop_source = DR_IB_RDMA_CM_ID_MISMATCH; rds_conn_drop(conn); } } @@ -259,7 +259,7 @@ int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id, "ROUTE_ERROR: conn %p, calling rds_conn_drop <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n", conn, NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr), conn->c_tos); - conn->c_drop_source = 43; + conn->c_drop_source = DR_IB_ROUTE_ERR; rds_conn_drop(conn); } break; @@ -274,7 +274,7 @@ int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id, "ADDR_ERROR: conn %p, calling rds_conn_drop <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n", conn, NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr), conn->c_tos); - conn->c_drop_source = 44; + conn->c_drop_source = DR_IB_ADDR_ERR; rds_conn_drop(conn); } break; @@ -287,7 +287,7 @@ int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id, "CONN/UNREACHABLE/RMVAL ERR: conn %p, calling rds_conn_drop <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n", conn, NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr), conn->c_tos); - conn->c_drop_source = 45; + conn->c_drop_source = DR_IB_CONNECT_ERR; rds_conn_drop(conn); } break; @@ -309,7 +309,7 @@ int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id, if (!conn->c_tos) { conn->c_proposed_version = RDS_PROTOCOL_COMPAT_VERSION; - conn->c_drop_source = 46; + conn->c_drop_source = DR_IB_CONSUMER_DEFINED_REJ; rds_conn_drop(conn); } else { if (conn->c_loopback) @@ -328,7 +328,7 @@ int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id, NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr), conn->c_tos); - conn->c_drop_source = 47; + conn->c_drop_source = DR_IB_REJECTED_EVENT; rds_conn_drop(conn); } } @@ -345,7 +345,7 @@ int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id, "ADDR_CHANGE: 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); - conn->c_drop_source = 48; + conn->c_drop_source = DR_IB_ADDR_CHANGE; rds_conn_drop(conn); } #else @@ -354,7 +354,7 @@ int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id, "ADDR_CHANGE: 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); - conn->c_drop_source = 48; + conn->c_drop_source = DR_IB_ADDR_CHANGE; rds_conn_drop(conn); } #endif @@ -364,7 +364,7 @@ int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id, rds_rtd(RDS_RTD_CM, "DISCONNECT event - dropping connection %pI4->%pI4 tos %d\n", &conn->c_laddr, &conn->c_faddr, conn->c_tos); - conn->c_drop_source = 49; + conn->c_drop_source = DR_IB_DISCONNECTED_EVENT; rds_conn_drop(conn); break; @@ -374,7 +374,7 @@ int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id, "dropping connection " "%pI4->%pI4\n", &conn->c_laddr, &conn->c_faddr); - conn->c_drop_source = 50; + conn->c_drop_source = DR_IB_TIMEWAIT_EXIT; rds_conn_drop(conn); } else printk(KERN_INFO "TIMEWAIT_EXIT event - conn=NULL\n"); diff --git a/net/rds/rds.h b/net/rds/rds.h index b18ce4848cb8..f856c55b8aca 100644 --- a/net/rds/rds.h +++ b/net/rds/rds.h @@ -134,6 +134,80 @@ enum { #define RDS_RDMA_RESOLVE_TO_MAX_INDEX 5 #define RDS_ADDR_RES_TM_INDEX_MAX 5 +enum rds_conn_drop_src { + /* rds-core */ + DR_DEFAULT, + DR_USER_RESET, + DR_INV_CONN_STATE, + DR_DOWN_TRANSITION_FAIL, + DR_CONN_DESTROY, + DR_ZERO_LANE_DOWN, + DR_CONN_CONNECT_FAIL, + DR_HB_TIMEOUT, + DR_RECONNECT_TIMEOUT, + + /* ib_cm */ + DR_IB_CONN_DROP_RACE, + DR_IB_NOT_CONNECTING_STATE, + DR_IB_QP_EVENT, + DR_IB_BASE_CONN_DOWN, + DR_IB_REQ_WHILE_CONN_UP, + DR_IB_REQ_WHILE_CONNECTING, + DR_IB_PAS_SETUP_QP_FAIL, + DR_IB_RDMA_ACCEPT_FAIL, + DR_IB_ACT_SETUP_QP_FAIL, + DR_IB_RDMA_CONNECT_FAIL, + + /* event handling */ + DR_IB_SET_IB_PATH_FAIL, + DR_IB_RESOLVE_ROUTE_FAIL, + DR_IB_RDMA_CM_ID_MISMATCH, + DR_IB_ROUTE_ERR, + DR_IB_ADDR_ERR, + DR_IB_CONNECT_ERR, + DR_IB_CONSUMER_DEFINED_REJ, + DR_IB_REJECTED_EVENT, + DR_IB_ADDR_CHANGE, + DR_IB_DISCONNECTED_EVENT, + DR_IB_TIMEWAIT_EXIT, + + /* data path */ + DR_IB_POST_RECV_FAIL, + DR_IB_SEND_ACK_FAIL, + DR_IB_HEADER_MISSING, + DR_IB_HEADER_CORRUPTED, + DR_IB_FRAG_HEADER_MISMATCH, + DR_IB_RECV_COMP_ERR, + DR_IB_SEND_COMP_ERR, + DR_IB_POST_SEND_FAIL, + + /* special features like active bonding */ + DR_IB_UMMOD, + DR_IB_ACTIVE_BOND_FAILOVER, + DR_IB_LOOPBACK_CONN_DROP, + DR_IB_ACTIVE_BOND_FAILBACK, + + /* iWARP */ + DR_IW_QP_EVENT, + DR_IW_REQ_WHILE_CONNECTING, + DR_IW_PAS_SETUP_QP_FAIL, + DR_IW_RDMA_ACCEPT_FAIL, + DR_IW_ACT_SETUP_QP_FAIL, + DR_IW_RDMA_CONNECT_FAIL, + + DR_IW_POST_RECV_FAIL, + DR_IW_SEND_ACK_FAIL, + DR_IW_HEADER_MISSING, + DR_IW_HEADER_CORRUPTED, + DR_IW_FRAG_HEADER_MISMATCH, + DR_IW_RECV_COMP_ERR, + DR_IW_SEND_COMP_ERR, + + /* TCP */ + DR_TCP_STATE_CLOSE, + DR_TCP_SEND_FAIL, +}; + struct rds_connection { struct hlist_node c_hash_node; __be32 c_laddr; @@ -214,7 +288,8 @@ struct rds_connection { unsigned int c_reconnect_racing; unsigned int c_route_resolved; - u8 c_drop_source; + + enum rds_conn_drop_src c_drop_source; }; static inline @@ -772,7 +847,7 @@ void rds_for_each_conn_info(struct socket *sock, unsigned int len, struct rds_info_lengths *lens, int (*visitor)(struct rds_connection *, void *), size_t item_len); -char *conn_drop_reason_str(u8 reason); +char *conn_drop_reason_str(enum rds_conn_drop_src reason); void __rds_conn_error(struct rds_connection *conn, const char *, ...) __attribute__ ((format (printf, 2, 3))); #define rds_conn_error(conn, fmt...) \ diff --git a/net/rds/tcp_connect.c b/net/rds/tcp_connect.c index b57a5fb16692..ecf289cf6fd7 100644 --- a/net/rds/tcp_connect.c +++ b/net/rds/tcp_connect.c @@ -64,7 +64,7 @@ void rds_tcp_state_change(struct sock *sk) break; case TCP_CLOSE_WAIT: case TCP_CLOSE: - conn->c_drop_source = 140; + conn->c_drop_source = DR_TCP_STATE_CLOSE; rds_conn_drop(conn); default: break; diff --git a/net/rds/tcp_send.c b/net/rds/tcp_send.c index 6e8e5a7b42af..7406211a627b 100644 --- a/net/rds/tcp_send.c +++ b/net/rds/tcp_send.c @@ -152,7 +152,7 @@ out: printk(KERN_WARNING "RDS/tcp: send to %u.%u.%u.%u " "returned %d, disconnecting and reconnecting\n", NIPQUAD(conn->c_faddr), ret); - conn->c_drop_source = 141; + conn->c_drop_source = DR_TCP_SEND_FAIL; rds_conn_drop(conn); } } diff --git a/net/rds/threads.c b/net/rds/threads.c index 55a1b48240c9..d1c364b2864b 100644 --- a/net/rds/threads.c +++ b/net/rds/threads.c @@ -182,7 +182,7 @@ void rds_connect_worker(struct work_struct *work) * drop the connection if it doesn't work out after a while */ conn->c_connection_start = get_seconds(); - conn->c_drop_source = 0; + conn->c_drop_source = DR_DEFAULT; ret = conn->c_trans->conn_connect(conn); rds_rtd(RDS_RTD_CM_EXT, @@ -195,7 +195,7 @@ void rds_connect_worker(struct work_struct *work) "reconnecting..., conn %p\n", conn); rds_queue_reconnect(conn); } else { - conn->c_drop_source = 6; + conn->c_drop_source = DR_CONN_CONNECT_FAIL; rds_conn_error(conn, "RDS: connect failed\n"); } } @@ -286,7 +286,7 @@ void rds_hb_worker(struct work_struct *work) "RDS/IB: connection <%u.%u.%u.%u,%u.%u.%u.%u,%d> timed out (0x%lx,0x%lx)..discon and recon\n", NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr), conn->c_tos, conn->c_hb_start, now); - conn->c_drop_source = 7; + conn->c_drop_source = DR_HB_TIMEOUT; rds_conn_drop(conn); return; } @@ -307,7 +307,7 @@ void rds_reconnect_timeout(struct work_struct *work) "conn not up, 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); - conn->c_drop_source = 8; + conn->c_drop_source = DR_RECONNECT_TIMEOUT; rds_conn_drop(conn); conn->c_reconnect_racing = 0; }