From 32b2192c4dfcea2cf18cb58bb431ae1fd37b637c Mon Sep 17 00:00:00 2001 From: Santosh Shilimkar Date: Fri, 5 Aug 2016 14:22:53 -0700 Subject: [PATCH] RDS: make rds_conn_drop() take reason argument This removes the need of modifying the conn all over the place and moves it inside rds_conn_drop(). Actually there is almost no need to carry the 'c_drop_source' information as part of rds_connection but since shutdown thread wants to log this info for debug, the field is left as is for now. Orabug: 22347191 Tested-by: Michael Nowak Tested-by: Rafael Alejandro Peralez Tested-by: Liwen Huang Tested-by: Hong Liu Reviewed-by: Mukesh Kacker Signed-off-by: Santosh Shilimkar --- net/rds/af_rds.c | 5 ++-- net/rds/connection.c | 43 ++++++++++------------------------ net/rds/ib.c | 3 +-- net/rds/ib.h | 4 ---- net/rds/ib_cm.c | 50 +++++++++++----------------------------- net/rds/ib_recv.c | 46 ++++++++++++------------------------ net/rds/ib_send.c | 14 ++++------- net/rds/rdma_transport.c | 34 ++++++++++----------------- net/rds/rds.h | 6 +---- net/rds/tcp.c | 3 ++- net/rds/tcp_connect.c | 3 +-- net/rds/tcp_send.c | 3 +-- net/rds/threads.c | 9 +++----- 13 files changed, 69 insertions(+), 154 deletions(-) diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c index 2cf03b2c16fc..7843f0a0a4bd 100644 --- a/net/rds/af_rds.c +++ b/net/rds/af_rds.c @@ -348,7 +348,7 @@ static int rds_user_reset(struct rds_sock *rs, char __user *optval, int optlen) list_for_each_entry(conn, &s_addr_conns, c_laddr_node) if (conn) { conn->c_drop_source = 1; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_USER_RESET); } goto done; } @@ -362,8 +362,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 = DR_USER_RESET; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_USER_RESET); } done: return 0; diff --git a/net/rds/connection.c b/net/rds/connection.c index f2b02bacba0a..7053cbfe07bd 100644 --- a/net/rds/connection.c +++ b/net/rds/connection.c @@ -340,9 +340,9 @@ 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 = DR_INV_CONN_STATE; - rds_conn_error(conn, "shutdown called in state %d\n", - atomic_read(&conn->c_state)); + pr_warn("RDS: shutdown called in state %d\n", + atomic_read(&conn->c_state)); + rds_conn_drop(conn, DR_INV_CONN_STATE); mutex_unlock(&conn->c_cm_lock); return; } @@ -362,12 +362,9 @@ void rds_conn_shutdown(struct rds_connection *conn, int restart) * Quite reproduceable with loopback connections. * Mostly harmless. */ - conn->c_drop_source = DR_DOWN_TRANSITION_FAIL; - rds_conn_error(conn, - "%s: failed to transition to state DOWN, " - "current state is %d\n", - __func__, - atomic_read(&conn->c_state)); + pr_warn("RDS: %s: failed to transition to state DOWN, current state is %d\n", + __func__, atomic_read(&conn->c_state)); + rds_conn_drop(conn, DR_DOWN_TRANSITION_FAIL); return; } } @@ -421,8 +418,7 @@ void rds_conn_destroy(struct rds_connection *conn, int shutdown) synchronize_rcu(); /* shut the connection down */ - conn->c_drop_source = DR_CONN_DESTROY; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_CONN_DESTROY); flush_work(&conn->c_down_w); /* now that conn down worker is flushed; there cannot be any @@ -725,13 +721,12 @@ static void rds_conn_probe_lanes(struct rds_connection *conn) else if (rds_conn_connecting(tmp) && (tmp->c_route_resolved == 0)) { printk(KERN_INFO "RDS/IB: connection " "<%u.%u.%u.%u,%u.%u.%u.%u,%d> " - "connecting, force reset ", + "connecting, force reset\n", NIPQUAD(tmp->c_laddr), NIPQUAD(tmp->c_faddr), tmp->c_tos); - conn->c_drop_source = DR_ZERO_LANE_DOWN; - rds_conn_drop(tmp); + rds_conn_drop(tmp, DR_ZERO_LANE_DOWN); } } } @@ -741,10 +736,11 @@ static void rds_conn_probe_lanes(struct rds_connection *conn) /* * Force a disconnect */ -void rds_conn_drop(struct rds_connection *conn) +void rds_conn_drop(struct rds_connection *conn, int reason) { unsigned long now = get_seconds(); + conn->c_drop_source = reason; if (rds_conn_state(conn) == RDS_CONN_UP) { conn->c_reconnect_start = now; conn->c_reconnect_warn = 1; @@ -756,7 +752,7 @@ void rds_conn_drop(struct rds_connection *conn) NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr), conn->c_tos, - conn_drop_reason_str(conn->c_drop_source)); + conn_drop_reason_str(reason)); if (conn->c_tos == 0) rds_conn_probe_lanes(conn); @@ -812,18 +808,3 @@ void rds_conn_connect_if_down(struct rds_connection *conn) } } EXPORT_SYMBOL_GPL(rds_conn_connect_if_down); - -/* - * An error occurred on the connection - */ -void -__rds_conn_error(struct rds_connection *conn, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vprintk(fmt, ap); - va_end(ap); - - rds_conn_drop(conn); -} diff --git a/net/rds/ib.c b/net/rds/ib.c index bf3adf93138e..a5890fbf1c97 100644 --- a/net/rds/ib.c +++ b/net/rds/ib.c @@ -169,8 +169,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 = DR_IB_UMMOD; - rds_conn_drop(ic->conn); + rds_conn_drop(ic->conn, DR_IB_UMMOD); } spin_unlock_irqrestore(&rds_ibdev->spinlock, flags); } diff --git a/net/rds/ib.h b/net/rds/ib.h index fc71b8acda07..e5d84fba0c3a 100644 --- a/net/rds/ib.h +++ b/net/rds/ib.h @@ -561,7 +561,6 @@ void rds_ib_conn_shutdown(struct rds_connection *conn); void rds_ib_state_change(struct sock *sk); int rds_ib_listen_init(void); void rds_ib_listen_stop(void); -void __rds_ib_conn_error(struct rds_connection *conn, const char *, ...); int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id, struct rdma_cm_event *event); int rds_ib_cm_initiate_connect(struct rdma_cm_id *cm_id); @@ -570,9 +569,6 @@ void rds_ib_cm_connect_complete(struct rds_connection *conn, void rds_ib_init_frag(unsigned int version); void rds_ib_conn_destroy_init(struct rds_connection *conn); -#define rds_ib_conn_error(conn, fmt...) \ - __rds_ib_conn_error(conn, KERN_WARNING "RDS/IB: " fmt) - /* ib_rdma.c */ int rds_ib_update_ipaddr(struct rds_ib_device *rds_ibdev, __be32 ipaddr); void rds_ib_add_conn(struct rds_ib_device *rds_ibdev, struct rds_connection *conn); diff --git a/net/rds/ib_cm.c b/net/rds/ib_cm.c index caa69911d7f2..58d9e49eb499 100644 --- a/net/rds/ib_cm.c +++ b/net/rds/ib_cm.c @@ -294,8 +294,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 = DR_IB_CONN_DROP_RACE; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_CONN_DROP_RACE); return; } @@ -305,8 +304,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 = DR_IB_NOT_CONNECTING_STATE; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_NOT_CONNECTING_STATE); return; } @@ -579,8 +577,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 = DR_IB_QP_EVENT; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_QP_EVENT); break; } } @@ -893,8 +890,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 = DR_IB_BASE_CONN_DOWN; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_BASE_CONN_DOWN); } /* @@ -916,8 +912,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 = DR_IB_REQ_WHILE_CONN_UP; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_REQ_WHILE_CONN_UP); rds_ib_stats_inc(s_ib_listen_closed_stale); } else if (rds_conn_state(conn) == RDS_CONN_CONNECTING) { unsigned long now = get_seconds(); @@ -938,8 +933,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 = DR_IB_REQ_WHILE_CONNECTING; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_REQ_WHILE_CONNECTING); rds_ib_stats_inc(s_ib_listen_closed_stale); } else { /* Wait and see - our connect may still be succeeding */ @@ -982,8 +976,8 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id, err = rds_ib_setup_qp(conn); if (err) { - conn->c_drop_source = DR_IB_PAS_SETUP_QP_FAIL; - rds_ib_conn_error(conn, "rds_ib_setup_qp failed (%d)\n", err); + pr_warn("RDS/IB: rds_ib_setup_qp failed (%d)\n", err); + rds_conn_drop(conn, DR_IB_PAS_SETUP_QP_FAIL); goto out; } @@ -995,8 +989,8 @@ 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 = DR_IB_RDMA_ACCEPT_FAIL; - rds_ib_conn_error(conn, "rdma_accept failed (%d)\n", err); + pr_warn("RDS/IB: rdma_accept failed (%d)\n", err); + rds_conn_drop(conn, DR_IB_RDMA_ACCEPT_FAIL); } out: @@ -1068,8 +1062,8 @@ int rds_ib_cm_initiate_connect(struct rdma_cm_id *cm_id) ret = rds_ib_setup_qp(conn); if (ret) { - conn->c_drop_source = DR_IB_ACT_SETUP_QP_FAIL; - rds_ib_conn_error(conn, "rds_ib_setup_qp failed (%d)\n", ret); + pr_warn("RDS/IB: rds_ib_setup_qp failed (%d)\n", ret); + rds_conn_drop(conn, DR_IB_ACT_SETUP_QP_FAIL); goto out; } @@ -1078,8 +1072,8 @@ 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 = DR_IB_RDMA_CONNECT_FAIL; - rds_ib_conn_error(conn, "rdma_connect failed (%d)\n", ret); + pr_warn("RDS/IB: rdma_connect failed (%d)\n", ret); + rds_conn_drop(conn, DR_IB_RDMA_CONNECT_FAIL); } out: @@ -1370,19 +1364,3 @@ void rds_ib_conn_free(void *arg) kfree(ic); } - - -/* - * An error occurred on the connection - */ -void -__rds_ib_conn_error(struct rds_connection *conn, const char *fmt, ...) -{ - va_list ap; - - rds_conn_drop(conn); - - va_start(ap, fmt); - vprintk(fmt, ap); - va_end(ap); -} diff --git a/net/rds/ib_recv.c b/net/rds/ib_recv.c index 5b2525a09a21..15063fadcbfa 100644 --- a/net/rds/ib_recv.c +++ b/net/rds/ib_recv.c @@ -641,11 +641,9 @@ 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 = DR_IB_POST_RECV_FAIL; - rds_ib_conn_error(conn, "recv post on " - "%pI4 returned %d, disconnecting and " - "reconnecting\n", &conn->c_faddr, - ret); + rds_conn_drop(conn, DR_IB_POST_RECV_FAIL); + pr_warn("RDS/IB: recv post on %pI4 returned %d, disconnecting and reconnecting\n", + &conn->c_faddr, ret); break; } @@ -930,9 +928,7 @@ static void rds_ib_send_ack(struct rds_ib_connection *ic, unsigned int adv_credi set_bit(IB_ACK_REQUESTED, &ic->i_ack_flags); rds_ib_stats_inc(s_ib_ack_send_failure); - - ic->conn->c_drop_source = DR_IB_SEND_ACK_FAIL; - rds_ib_conn_error(ic->conn, "sending ack failed\n"); + rds_conn_drop(ic->conn, DR_IB_SEND_ACK_FAIL); } else rds_ib_stats_inc(s_ib_ack_sent); } @@ -1109,12 +1105,9 @@ static void rds_ib_process_recv(struct rds_connection *conn, data_len); if (data_len < sizeof(struct rds_header)) { - conn->c_drop_source = DR_IB_HEADER_MISSING; - rds_ib_conn_error(conn, "incoming message " - "from %pI4 didn't inclue a " - "header, disconnecting and " - "reconnecting\n", - &conn->c_faddr); + rds_conn_drop(conn, DR_IB_HEADER_MISSING); + pr_warn("RDS/IB: incoming message from %pI4 didn't inclue a header, disconnecting and reconnecting\n", + &conn->c_faddr); return; } data_len -= sizeof(struct rds_header); @@ -1123,11 +1116,9 @@ static void rds_ib_process_recv(struct rds_connection *conn, /* Validate the checksum. */ if (!rds_message_verify_checksum(ihdr)) { - conn->c_drop_source = DR_IB_HEADER_CORRUPTED; - rds_ib_conn_error(conn, "incoming message " - "from %pI4 has corrupted header - " - "forcing a reconnect\n", - &conn->c_faddr); + rds_conn_drop(conn, DR_IB_HEADER_CORRUPTED); + pr_warn("RDS/IB: incoming message from %pI4 has corrupted header - forcing a reconnect\n", + &conn->c_faddr); rds_stats_inc(s_recv_drop_bad_checksum); return; } @@ -1191,9 +1182,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 = DR_IB_FRAG_HEADER_MISMATCH; - rds_ib_conn_error(conn, - "fragment header mismatch; forcing reconnect\n"); + rds_conn_drop(conn, DR_IB_FRAG_HEADER_MISMATCH); return; } } @@ -1352,15 +1341,10 @@ 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 = DR_IB_RECV_COMP_ERR; - rds_ib_conn_error(conn, "recv completion " - "<%pI4,%pI4,%d> had status %u " - "vendor_err 0x%x, disconnecting and " - "reconnecting\n", - &conn->c_laddr, - &conn->c_faddr, - conn->c_tos, - wc->status, wc->vendor_err); + pr_warn("RDS/IB: recv completion <%pI4,%pI4,%d> had status %u vendor_err 0x%x, disconnecting and reconnecting\n", + &conn->c_laddr, &conn->c_faddr, conn->c_tos, + wc->status, wc->vendor_err); + rds_conn_drop(conn, DR_IB_RECV_COMP_ERR); rds_rtd(RDS_RTD_ERR, "status %u => %s\n", wc->status, rds_ib_wc_status_str(wc->status)); } diff --git a/net/rds/ib_send.c b/net/rds/ib_send.c index c4298c503237..df8b0f7a4365 100644 --- a/net/rds/ib_send.c +++ b/net/rds/ib_send.c @@ -341,13 +341,10 @@ 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 = 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 0x%x, disconnecting and reconnecting\n", - NIPQUAD(conn->c_laddr), - NIPQUAD(conn->c_faddr), - conn->c_tos, wc->status, wc->vendor_err); + pr_warn("RDS/IB: send completion <%pI4,%pI4,%d> status %u vendor_err 0x%x, disconnecting and reconnecting\n", + &conn->c_laddr, &conn->c_faddr, conn->c_tos, + wc->status, wc->vendor_err); + rds_conn_drop(conn, DR_IB_SEND_COMP_ERR); rds_rtd(RDS_RTD_ERR, "status %u => %s\n", wc->status, rds_ib_wc_status_str(wc->status)); } @@ -811,8 +808,7 @@ int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm, prev->s_op = NULL; } - ic->conn->c_drop_source = DR_IB_POST_SEND_FAIL; - rds_ib_conn_error(ic->conn, "ib_post_send failed\n"); + rds_conn_drop(ic->conn, DR_IB_POST_SEND_FAIL); goto out; } diff --git a/net/rds/rdma_transport.c b/net/rds/rdma_transport.c index eeac3981c58e..13a5dcfc250b 100644 --- a/net/rds/rdma_transport.c +++ b/net/rds/rdma_transport.c @@ -151,8 +151,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 = DR_IB_SET_IB_PATH_FAIL; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_SET_IB_PATH_FAIL); ret = 0; } @@ -176,8 +175,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 = DR_IB_RESOLVE_ROUTE_FAIL; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_RESOLVE_ROUTE_FAIL); } } else if (conn->c_to_index < (RDS_RDMA_RESOLVE_TO_MAX_INDEX-1)) conn->c_to_index++; @@ -200,8 +198,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 = DR_IB_RDMA_CM_ID_MISMATCH; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_RDMA_CM_ID_MISMATCH); } } break; @@ -228,8 +225,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 = DR_IB_ROUTE_ERR; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_ROUTE_ERR); } break; @@ -243,8 +239,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 = DR_IB_ADDR_ERR; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_ADDR_ERR); } break; @@ -256,8 +251,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 = DR_IB_CONNECT_ERR; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_CONNECT_ERR); } break; @@ -278,8 +272,8 @@ 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 = DR_IB_CONSUMER_DEFINED_REJ; - rds_conn_drop(conn); + rds_conn_drop(conn, + DR_IB_CONSUMER_DEFINED_REJ); } else { if (conn->c_loopback) queue_delayed_work(rds_local_wq, @@ -305,8 +299,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 = DR_IB_REJECTED_EVENT; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_REJECTED_EVENT); } } break; @@ -321,8 +314,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 = DR_IB_ADDR_CHANGE; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_ADDR_CHANGE); } break; @@ -330,8 +322,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 = DR_IB_DISCONNECTED_EVENT; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_DISCONNECTED_EVENT); break; case RDMA_CM_EVENT_TIMEWAIT_EXIT: @@ -340,8 +331,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 = DR_IB_TIMEWAIT_EXIT; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_IB_TIMEWAIT_EXIT); } else printk(KERN_INFO "TIMEWAIT_EXIT event - conn=NULL\n"); break; diff --git a/net/rds/rds.h b/net/rds/rds.h index d3ea4292f4dd..fda614f05549 100644 --- a/net/rds/rds.h +++ b/net/rds/rds.h @@ -852,7 +852,7 @@ struct rds_connection *rds_conn_find(struct net *net, __be32 laddr, void rds_conn_shutdown(struct rds_connection *conn, int restart); 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); +void rds_conn_drop(struct rds_connection *conn, int reason); void rds_conn_laddr_list(__be32 laddr, struct list_head *laddr_conns); void rds_conn_connect_if_down(struct rds_connection *conn); void rds_for_each_conn_info(struct socket *sock, unsigned int len, @@ -861,10 +861,6 @@ void rds_for_each_conn_info(struct socket *sock, unsigned int len, int (*visitor)(struct rds_connection *, void *), size_t item_len); 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...) \ - __rds_conn_error(conn, KERN_WARNING "RDS: " fmt) static inline int rds_conn_transition(struct rds_connection *conn, int old, int new) diff --git a/net/rds/tcp.c b/net/rds/tcp.c index dff1c177e5bf..abd6cb91db3f 100644 --- a/net/rds/tcp.c +++ b/net/rds/tcp.c @@ -556,7 +556,8 @@ static void rds_tcp_sysctl_reset(struct net *net) if (net != c_net || !tc->t_sock) continue; - rds_conn_drop(tc->conn); /* reconnect with new parameters */ + /* reconnect with new parameters */ + rds_conn_drop(tc->conn, DR_USER_RESET); } spin_unlock_irq(&rds_tcp_conn_lock); } diff --git a/net/rds/tcp_connect.c b/net/rds/tcp_connect.c index 41a83d90f0e1..ebffa5b91aff 100644 --- a/net/rds/tcp_connect.c +++ b/net/rds/tcp_connect.c @@ -64,8 +64,7 @@ void rds_tcp_state_change(struct sock *sk) break; case TCP_CLOSE_WAIT: case TCP_CLOSE: - conn->c_drop_source = DR_TCP_STATE_CLOSE; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_TCP_STATE_CLOSE); default: break; } diff --git a/net/rds/tcp_send.c b/net/rds/tcp_send.c index 7406211a627b..edecc4606af6 100644 --- a/net/rds/tcp_send.c +++ b/net/rds/tcp_send.c @@ -152,8 +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 = DR_TCP_SEND_FAIL; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_TCP_SEND_FAIL); } } if (done == 0) diff --git a/net/rds/threads.c b/net/rds/threads.c index e934ec8d19ec..541c0b6e7452 100644 --- a/net/rds/threads.c +++ b/net/rds/threads.c @@ -201,8 +201,7 @@ void rds_connect_worker(struct work_struct *work) "reconnecting..., conn %p\n", conn); rds_queue_reconnect(conn); } else { - conn->c_drop_source = DR_CONN_CONNECT_FAIL; - rds_conn_error(conn, "RDS: connect failed\n"); + rds_conn_drop(conn, DR_CONN_CONNECT_FAIL); } } } else { @@ -292,8 +291,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 = DR_HB_TIMEOUT; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_HB_TIMEOUT); return; } queue_delayed_work(rds_wq, &conn->c_hb_w, HZ); @@ -313,8 +311,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 = DR_RECONNECT_TIMEOUT; - rds_conn_drop(conn); + rds_conn_drop(conn, DR_RECONNECT_TIMEOUT); conn->c_reconnect_racing = 0; } } -- 2.50.1