aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2014-05-19 10:44:24 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2014-05-20 14:17:40 -0400
commit88c4015fda6d014392f76d3b1688347950d7a12d (patch)
tree344353885fd0c7781c6483cd245724d88fa3a8f7 /drivers/infiniband
parent9d49f5e284e700576f3b65f1e28dea8539da6661 (diff)
Target/iser: Improve cm events handling
There are 4 RDMA_CM events that all basically mean that the user should teardown the IB connection: - DISCONNECTED - ADDR_CHANGE - DEVICE_REMOVAL - TIMEWAIT_EXIT Only in DISCONNECTED/ADDR_CHANGE it makes sense to call rdma_disconnect (send DREQ/DREP to our initiator). So we keep the same teardown handler for all of them but only indicate calling rdma_disconnect for the relevant events. This patch also removes redundant debug prints for each single event. v2 changes: - Call isert_disconnected_handler() for DEVICE_REMOVAL (Or + Sag) Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Cc: stable@vger.kernel.org # 3.10+ Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/ulp/isert/ib_isert.c26
-rw-r--r--drivers/infiniband/ulp/isert/ib_isert.h1
2 files changed, 15 insertions, 12 deletions
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c
index ef73a38bcb6b..ef47ff66f8df 100644
--- a/drivers/infiniband/ulp/isert/ib_isert.c
+++ b/drivers/infiniband/ulp/isert/ib_isert.c
@@ -788,8 +788,10 @@ isert_disconnect_work(struct work_struct *work)
788 return; 788 return;
789 } 789 }
790 790
791 /* Send DREQ/DREP towards our initiator */ 791 if (isert_conn->disconnect) {
792 rdma_disconnect(isert_conn->conn_cm_id); 792 /* Send DREQ/DREP towards our initiator */
793 rdma_disconnect(isert_conn->conn_cm_id);
794 }
793 795
794 mutex_unlock(&isert_conn->conn_mutex); 796 mutex_unlock(&isert_conn->conn_mutex);
795 797
@@ -799,10 +801,11 @@ wake_up:
799} 801}
800 802
801static void 803static void
802isert_disconnected_handler(struct rdma_cm_id *cma_id) 804isert_disconnected_handler(struct rdma_cm_id *cma_id, bool disconnect)
803{ 805{
804 struct isert_conn *isert_conn = (struct isert_conn *)cma_id->context; 806 struct isert_conn *isert_conn = (struct isert_conn *)cma_id->context;
805 807
808 isert_conn->disconnect = disconnect;
806 INIT_WORK(&isert_conn->conn_logout_work, isert_disconnect_work); 809 INIT_WORK(&isert_conn->conn_logout_work, isert_disconnect_work);
807 schedule_work(&isert_conn->conn_logout_work); 810 schedule_work(&isert_conn->conn_logout_work);
808} 811}
@@ -811,29 +814,28 @@ static int
811isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) 814isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
812{ 815{
813 int ret = 0; 816 int ret = 0;
817 bool disconnect = false;
814 818
815 pr_debug("isert_cma_handler: event %d status %d conn %p id %p\n", 819 pr_debug("isert_cma_handler: event %d status %d conn %p id %p\n",
816 event->event, event->status, cma_id->context, cma_id); 820 event->event, event->status, cma_id->context, cma_id);
817 821
818 switch (event->event) { 822 switch (event->event) {
819 case RDMA_CM_EVENT_CONNECT_REQUEST: 823 case RDMA_CM_EVENT_CONNECT_REQUEST:
820 pr_debug("RDMA_CM_EVENT_CONNECT_REQUEST: >>>>>>>>>>>>>>>\n");
821 ret = isert_connect_request(cma_id, event); 824 ret = isert_connect_request(cma_id, event);
822 break; 825 break;
823 case RDMA_CM_EVENT_ESTABLISHED: 826 case RDMA_CM_EVENT_ESTABLISHED:
824 pr_debug("RDMA_CM_EVENT_ESTABLISHED >>>>>>>>>>>>>>\n");
825 isert_connected_handler(cma_id); 827 isert_connected_handler(cma_id);
826 break; 828 break;
827 case RDMA_CM_EVENT_DISCONNECTED: 829 case RDMA_CM_EVENT_ADDR_CHANGE: /* FALLTHRU */
828 pr_debug("RDMA_CM_EVENT_DISCONNECTED: >>>>>>>>>>>>>>\n"); 830 case RDMA_CM_EVENT_DISCONNECTED: /* FALLTHRU */
829 isert_disconnected_handler(cma_id); 831 case RDMA_CM_EVENT_DEVICE_REMOVAL: /* FALLTHRU */
830 break; 832 disconnect = true;
831 case RDMA_CM_EVENT_DEVICE_REMOVAL: 833 case RDMA_CM_EVENT_TIMEWAIT_EXIT: /* FALLTHRU */
832 case RDMA_CM_EVENT_ADDR_CHANGE: 834 isert_disconnected_handler(cma_id, disconnect);
833 break; 835 break;
834 case RDMA_CM_EVENT_CONNECT_ERROR: 836 case RDMA_CM_EVENT_CONNECT_ERROR:
835 default: 837 default:
836 pr_err("Unknown RDMA CMA event: %d\n", event->event); 838 pr_err("Unhandled RDMA CMA event: %d\n", event->event);
837 break; 839 break;
838 } 840 }
839 841
diff --git a/drivers/infiniband/ulp/isert/ib_isert.h b/drivers/infiniband/ulp/isert/ib_isert.h
index a2e926452f76..04f51f7bf614 100644
--- a/drivers/infiniband/ulp/isert/ib_isert.h
+++ b/drivers/infiniband/ulp/isert/ib_isert.h
@@ -150,6 +150,7 @@ struct isert_conn {
150#define ISERT_COMP_BATCH_COUNT 8 150#define ISERT_COMP_BATCH_COUNT 8
151 int conn_comp_batch; 151 int conn_comp_batch;
152 struct llist_head conn_comp_llist; 152 struct llist_head conn_comp_llist;
153 bool disconnect;
153}; 154};
154 155
155#define ISERT_MAX_CQ 64 156#define ISERT_MAX_CQ 64