diff options
author | Sagi Grimberg <sagig@mellanox.com> | 2014-05-19 10:44:24 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-05-20 14:17:40 -0400 |
commit | 88c4015fda6d014392f76d3b1688347950d7a12d (patch) | |
tree | 344353885fd0c7781c6483cd245724d88fa3a8f7 | |
parent | 9d49f5e284e700576f3b65f1e28dea8539da6661 (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>
-rw-r--r-- | drivers/infiniband/ulp/isert/ib_isert.c | 26 | ||||
-rw-r--r-- | drivers/infiniband/ulp/isert/ib_isert.h | 1 |
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 | ||
801 | static void | 803 | static void |
802 | isert_disconnected_handler(struct rdma_cm_id *cma_id) | 804 | isert_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 | |||
811 | isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) | 814 | isert_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 |