Commit 704315f0 authored by Or Gerlitz's avatar Or Gerlitz Committed by Roland Dreier

IB/iser: Remove atomic counter for posted receive buffers

Now that both the posting and reaping of receive buffers is done in
the completion path, the counter of outstanding buffers not be atomic.
Signed-off-by: default avatarOr Gerlitz <ogerlitz@voltaire.com>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent bcc60c38
...@@ -266,7 +266,7 @@ struct iser_conn { ...@@ -266,7 +266,7 @@ struct iser_conn {
struct ib_fmr_pool *fmr_pool; /* pool of IB FMRs */ struct ib_fmr_pool *fmr_pool; /* pool of IB FMRs */
int disc_evt_flag; /* disconn event delivered */ int disc_evt_flag; /* disconn event delivered */
wait_queue_head_t wait; /* waitq for conn/disconn */ wait_queue_head_t wait; /* waitq for conn/disconn */
atomic_t post_recv_buf_count; /* posted rx count */ int post_recv_buf_count; /* posted rx count */
atomic_t post_send_buf_count; /* posted tx count */ atomic_t post_send_buf_count; /* posted tx count */
char name[ISER_OBJECT_NAME_SIZE]; char name[ISER_OBJECT_NAME_SIZE];
struct iser_page_vec *page_vec; /* represents SG to fmr maps* struct iser_page_vec *page_vec; /* represents SG to fmr maps*
......
...@@ -268,7 +268,7 @@ int iser_conn_set_full_featured_mode(struct iscsi_conn *conn) ...@@ -268,7 +268,7 @@ int iser_conn_set_full_featured_mode(struct iscsi_conn *conn)
/* Check that there is no posted recv or send buffers left - */ /* Check that there is no posted recv or send buffers left - */
/* they must be consumed during the login phase */ /* they must be consumed during the login phase */
BUG_ON(atomic_read(&iser_conn->ib_conn->post_recv_buf_count) != 0); BUG_ON(iser_conn->ib_conn->post_recv_buf_count != 0);
BUG_ON(atomic_read(&iser_conn->ib_conn->post_send_buf_count) != 0); BUG_ON(atomic_read(&iser_conn->ib_conn->post_send_buf_count) != 0);
if (iser_alloc_rx_descriptors(iser_conn->ib_conn)) if (iser_alloc_rx_descriptors(iser_conn->ib_conn))
...@@ -569,12 +569,12 @@ void iser_rcv_completion(struct iser_rx_desc *rx_desc, ...@@ -569,12 +569,12 @@ void iser_rcv_completion(struct iser_rx_desc *rx_desc,
* task eliminates the need to worry on tasks which are completed in * * task eliminates the need to worry on tasks which are completed in *
* parallel to the execution of iser_conn_term. So the code that waits * * parallel to the execution of iser_conn_term. So the code that waits *
* for the posted rx bufs refcount to become zero handles everything */ * for the posted rx bufs refcount to become zero handles everything */
atomic_dec(&conn->ib_conn->post_recv_buf_count); conn->ib_conn->post_recv_buf_count--;
if (rx_dma == ib_conn->login_dma) if (rx_dma == ib_conn->login_dma)
return; return;
outstanding = atomic_read(&ib_conn->post_recv_buf_count); outstanding = ib_conn->post_recv_buf_count;
if (outstanding + ISER_MIN_POSTED_RX <= ISER_QP_MAX_RECV_DTOS) { if (outstanding + ISER_MIN_POSTED_RX <= ISER_QP_MAX_RECV_DTOS) {
count = min(ISER_QP_MAX_RECV_DTOS - outstanding, count = min(ISER_QP_MAX_RECV_DTOS - outstanding,
ISER_MIN_POSTED_RX); ISER_MIN_POSTED_RX);
......
...@@ -453,7 +453,7 @@ static void iser_disconnected_handler(struct rdma_cm_id *cma_id) ...@@ -453,7 +453,7 @@ static void iser_disconnected_handler(struct rdma_cm_id *cma_id)
ISCSI_ERR_CONN_FAILED); ISCSI_ERR_CONN_FAILED);
/* Complete the termination process if no posts are pending */ /* Complete the termination process if no posts are pending */
if ((atomic_read(&ib_conn->post_recv_buf_count) == 0) && if (ib_conn->post_recv_buf_count == 0 &&
(atomic_read(&ib_conn->post_send_buf_count) == 0)) { (atomic_read(&ib_conn->post_send_buf_count) == 0)) {
ib_conn->state = ISER_CONN_DOWN; ib_conn->state = ISER_CONN_DOWN;
wake_up_interruptible(&ib_conn->wait); wake_up_interruptible(&ib_conn->wait);
...@@ -500,7 +500,7 @@ void iser_conn_init(struct iser_conn *ib_conn) ...@@ -500,7 +500,7 @@ void iser_conn_init(struct iser_conn *ib_conn)
{ {
ib_conn->state = ISER_CONN_INIT; ib_conn->state = ISER_CONN_INIT;
init_waitqueue_head(&ib_conn->wait); init_waitqueue_head(&ib_conn->wait);
atomic_set(&ib_conn->post_recv_buf_count, 0); ib_conn->post_recv_buf_count = 0;
atomic_set(&ib_conn->post_send_buf_count, 0); atomic_set(&ib_conn->post_send_buf_count, 0);
atomic_set(&ib_conn->refcount, 1); atomic_set(&ib_conn->refcount, 1);
INIT_LIST_HEAD(&ib_conn->conn_list); INIT_LIST_HEAD(&ib_conn->conn_list);
...@@ -651,11 +651,11 @@ int iser_post_recvl(struct iser_conn *ib_conn) ...@@ -651,11 +651,11 @@ int iser_post_recvl(struct iser_conn *ib_conn)
rx_wr.num_sge = 1; rx_wr.num_sge = 1;
rx_wr.next = NULL; rx_wr.next = NULL;
atomic_inc(&ib_conn->post_recv_buf_count); ib_conn->post_recv_buf_count++;
ib_ret = ib_post_recv(ib_conn->qp, &rx_wr, &rx_wr_failed); ib_ret = ib_post_recv(ib_conn->qp, &rx_wr, &rx_wr_failed);
if (ib_ret) { if (ib_ret) {
iser_err("ib_post_recv failed ret=%d\n", ib_ret); iser_err("ib_post_recv failed ret=%d\n", ib_ret);
atomic_dec(&ib_conn->post_recv_buf_count); ib_conn->post_recv_buf_count--;
} }
return ib_ret; return ib_ret;
} }
...@@ -679,11 +679,11 @@ int iser_post_recvm(struct iser_conn *ib_conn, int count) ...@@ -679,11 +679,11 @@ int iser_post_recvm(struct iser_conn *ib_conn, int count)
rx_wr--; rx_wr--;
rx_wr->next = NULL; /* mark end of work requests list */ rx_wr->next = NULL; /* mark end of work requests list */
atomic_add(count, &ib_conn->post_recv_buf_count); ib_conn->post_recv_buf_count += count;
ib_ret = ib_post_recv(ib_conn->qp, ib_conn->rx_wr, &rx_wr_failed); ib_ret = ib_post_recv(ib_conn->qp, ib_conn->rx_wr, &rx_wr_failed);
if (ib_ret) { if (ib_ret) {
iser_err("ib_post_recv failed ret=%d\n", ib_ret); iser_err("ib_post_recv failed ret=%d\n", ib_ret);
atomic_sub(count, &ib_conn->post_recv_buf_count); ib_conn->post_recv_buf_count -= count;
} else } else
ib_conn->rx_desc_head = my_rx_head; ib_conn->rx_desc_head = my_rx_head;
return ib_ret; return ib_ret;
...@@ -778,14 +778,14 @@ static void iser_handle_comp_error(struct iser_desc *desc, ...@@ -778,14 +778,14 @@ static void iser_handle_comp_error(struct iser_desc *desc,
if ((char *)desc == ib_conn->login_buf || if ((char *)desc == ib_conn->login_buf ||
(rx_first <= rx && rx <= rx_last)) (rx_first <= rx && rx <= rx_last))
atomic_dec(&ib_conn->post_recv_buf_count); ib_conn->post_recv_buf_count--;
else { /* type is TX control/command/dataout */ else { /* type is TX control/command/dataout */
if (desc->type == ISCSI_TX_DATAOUT) if (desc->type == ISCSI_TX_DATAOUT)
kmem_cache_free(ig.desc_cache, desc); kmem_cache_free(ig.desc_cache, desc);
atomic_dec(&ib_conn->post_send_buf_count); atomic_dec(&ib_conn->post_send_buf_count);
} }
if (atomic_read(&ib_conn->post_recv_buf_count) == 0 && if (ib_conn->post_recv_buf_count == 0 &&
atomic_read(&ib_conn->post_send_buf_count) == 0) { atomic_read(&ib_conn->post_send_buf_count) == 0) {
/* getting here when the state is UP means that the conn is * /* getting here when the state is UP means that the conn is *
* being terminated asynchronously from the iSCSI layer's * * being terminated asynchronously from the iSCSI layer's *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment