]> Git Repo - linux.git/commitdiff
Merge branch 'wr-cleanup' of git://git.infradead.org/users/hch/rdma into wr-cleanup
authorDoug Ledford <[email protected]>
Thu, 29 Oct 2015 02:21:09 +0000 (22:21 -0400)
committerDoug Ledford <[email protected]>
Thu, 29 Oct 2015 02:21:09 +0000 (22:21 -0400)
Signed-off-by: Doug Ledford <[email protected]>
Conflicts:
drivers/infiniband/ulp/isert/ib_isert.c - Commit 4366b19ca5eb
(iser-target: Change the recv buffers posting logic) changed the
logic in isert_put_datain() and had to be hand merged

1  2 
drivers/infiniband/ulp/isert/ib_isert.c
drivers/infiniband/ulp/isert/ib_isert.h

index aa59037d75040b7d6e1126bb620339c1c603bc89,02c4c0b4569d862811ac135c1e2cf35915da3a40..70d55d381515f608d9917afe6cf44561b6b97009
@@@ -238,6 -238,8 +238,6 @@@ isert_alloc_rx_descriptors(struct isert
                rx_sg->lkey = device->pd->local_dma_lkey;
        }
  
 -      isert_conn->rx_desc_head = 0;
 -
        return 0;
  
  dma_map_fail:
@@@ -632,7 -634,7 +632,7 @@@ static voi
  isert_init_conn(struct isert_conn *isert_conn)
  {
        isert_conn->state = ISER_CONN_INIT;
 -      INIT_LIST_HEAD(&isert_conn->accept_node);
 +      INIT_LIST_HEAD(&isert_conn->node);
        init_completion(&isert_conn->login_comp);
        init_completion(&isert_conn->login_req_comp);
        init_completion(&isert_conn->wait);
@@@ -760,15 -762,28 +760,15 @@@ isert_connect_request(struct rdma_cm_i
        ret = isert_rdma_post_recvl(isert_conn);
        if (ret)
                goto out_conn_dev;
 -      /*
 -       * Obtain the second reference now before isert_rdma_accept() to
 -       * ensure that any initiator generated REJECT CM event that occurs
 -       * asynchronously won't drop the last reference until the error path
 -       * in iscsi_target_login_sess_out() does it's ->iscsit_free_conn() ->
 -       * isert_free_conn() -> isert_put_conn() -> kref_put().
 -       */
 -      if (!kref_get_unless_zero(&isert_conn->kref)) {
 -              isert_warn("conn %p connect_release is running\n", isert_conn);
 -              goto out_conn_dev;
 -      }
  
        ret = isert_rdma_accept(isert_conn);
        if (ret)
                goto out_conn_dev;
  
 -      mutex_lock(&isert_np->np_accept_mutex);
 -      list_add_tail(&isert_conn->accept_node, &isert_np->np_accept_list);
 -      mutex_unlock(&isert_np->np_accept_mutex);
 +      mutex_lock(&isert_np->mutex);
 +      list_add_tail(&isert_conn->node, &isert_np->accepted);
 +      mutex_unlock(&isert_np->mutex);
  
 -      isert_info("np %p: Allow accept_np to continue\n", np);
 -      up(&isert_np->np_sem);
        return 0;
  
  out_conn_dev:
@@@ -816,21 -831,13 +816,21 @@@ static voi
  isert_connected_handler(struct rdma_cm_id *cma_id)
  {
        struct isert_conn *isert_conn = cma_id->qp->qp_context;
 +      struct isert_np *isert_np = cma_id->context;
  
        isert_info("conn %p\n", isert_conn);
  
        mutex_lock(&isert_conn->mutex);
 -      if (isert_conn->state != ISER_CONN_FULL_FEATURE)
 -              isert_conn->state = ISER_CONN_UP;
 +      isert_conn->state = ISER_CONN_UP;
 +      kref_get(&isert_conn->kref);
        mutex_unlock(&isert_conn->mutex);
 +
 +      mutex_lock(&isert_np->mutex);
 +      list_move_tail(&isert_conn->node, &isert_np->pending);
 +      mutex_unlock(&isert_np->mutex);
 +
 +      isert_info("np %p: Allow accept_np to continue\n", isert_np);
 +      up(&isert_np->sem);
  }
  
  static void
@@@ -896,14 -903,14 +896,14 @@@ isert_np_cma_handler(struct isert_np *i
  
        switch (event) {
        case RDMA_CM_EVENT_DEVICE_REMOVAL:
 -              isert_np->np_cm_id = NULL;
 +              isert_np->cm_id = NULL;
                break;
        case RDMA_CM_EVENT_ADDR_CHANGE:
 -              isert_np->np_cm_id = isert_setup_id(isert_np);
 -              if (IS_ERR(isert_np->np_cm_id)) {
 +              isert_np->cm_id = isert_setup_id(isert_np);
 +              if (IS_ERR(isert_np->cm_id)) {
                        isert_err("isert np %p setup id failed: %ld\n",
 -                                isert_np, PTR_ERR(isert_np->np_cm_id));
 -                      isert_np->np_cm_id = NULL;
 +                                isert_np, PTR_ERR(isert_np->cm_id));
 +                      isert_np->cm_id = NULL;
                }
                break;
        default:
@@@ -922,7 -929,7 +922,7 @@@ isert_disconnected_handler(struct rdma_
        struct isert_conn *isert_conn;
        bool terminating = false;
  
 -      if (isert_np->np_cm_id == cma_id)
 +      if (isert_np->cm_id == cma_id)
                return isert_np_cma_handler(cma_id->context, event);
  
        isert_conn = cma_id->qp->qp_context;
        if (terminating)
                goto out;
  
 -      mutex_lock(&isert_np->np_accept_mutex);
 -      if (!list_empty(&isert_conn->accept_node)) {
 -              list_del_init(&isert_conn->accept_node);
 +      mutex_lock(&isert_np->mutex);
 +      if (!list_empty(&isert_conn->node)) {
 +              list_del_init(&isert_conn->node);
                isert_put_conn(isert_conn);
                queue_work(isert_release_wq, &isert_conn->release_work);
        }
 -      mutex_unlock(&isert_np->np_accept_mutex);
 +      mutex_unlock(&isert_np->mutex);
  
  out:
        return 0;
@@@ -955,7 -962,6 +955,7 @@@ isert_connect_error(struct rdma_cm_id *
  {
        struct isert_conn *isert_conn = cma_id->qp->qp_context;
  
 +      list_del_init(&isert_conn->node);
        isert_conn->cm_id = NULL;
        isert_put_conn(isert_conn);
  
@@@ -1000,51 -1006,35 +1000,51 @@@ isert_cma_handler(struct rdma_cm_id *cm
  }
  
  static int
 -isert_post_recv(struct isert_conn *isert_conn, u32 count)
 +isert_post_recvm(struct isert_conn *isert_conn, u32 count)
  {
        struct ib_recv_wr *rx_wr, *rx_wr_failed;
        int i, ret;
 -      unsigned int rx_head = isert_conn->rx_desc_head;
        struct iser_rx_desc *rx_desc;
  
        for (rx_wr = isert_conn->rx_wr, i = 0; i < count; i++, rx_wr++) {
 -              rx_desc         = &isert_conn->rx_descs[rx_head];
 -              rx_wr->wr_id    = (uintptr_t)rx_desc;
 -              rx_wr->sg_list  = &rx_desc->rx_sg;
 -              rx_wr->num_sge  = 1;
 -              rx_wr->next     = rx_wr + 1;
 -              rx_head = (rx_head + 1) & (ISERT_QP_MAX_RECV_DTOS - 1);
 +              rx_desc = &isert_conn->rx_descs[i];
 +              rx_wr->wr_id = (uintptr_t)rx_desc;
 +              rx_wr->sg_list = &rx_desc->rx_sg;
 +              rx_wr->num_sge = 1;
 +              rx_wr->next = rx_wr + 1;
        }
 -
        rx_wr--;
        rx_wr->next = NULL; /* mark end of work requests list */
  
        isert_conn->post_recv_buf_count += count;
        ret = ib_post_recv(isert_conn->qp, isert_conn->rx_wr,
 -                              &rx_wr_failed);
 +                         &rx_wr_failed);
        if (ret) {
                isert_err("ib_post_recv() failed with ret: %d\n", ret);
                isert_conn->post_recv_buf_count -= count;
 -      } else {
 -              isert_dbg("Posted %d RX buffers\n", count);
 -              isert_conn->rx_desc_head = rx_head;
        }
 +
 +      return ret;
 +}
 +
 +static int
 +isert_post_recv(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc)
 +{
 +      struct ib_recv_wr *rx_wr_failed, rx_wr;
 +      int ret;
 +
 +      rx_wr.wr_id = (uintptr_t)rx_desc;
 +      rx_wr.sg_list = &rx_desc->rx_sg;
 +      rx_wr.num_sge = 1;
 +      rx_wr.next = NULL;
 +
 +      isert_conn->post_recv_buf_count++;
 +      ret = ib_post_recv(isert_conn->qp, &rx_wr, &rx_wr_failed);
 +      if (ret) {
 +              isert_err("ib_post_recv() failed with ret: %d\n", ret);
 +              isert_conn->post_recv_buf_count--;
 +      }
 +
        return ret;
  }
  
@@@ -1215,8 -1205,7 +1215,8 @@@ isert_put_login_tx(struct iscsi_conn *c
                        if (ret)
                                return ret;
  
 -                      ret = isert_post_recv(isert_conn, ISERT_MIN_POSTED_RX);
 +                      ret = isert_post_recvm(isert_conn,
 +                                             ISERT_QP_MAX_RECV_DTOS);
                        if (ret)
                                return ret;
  
@@@ -1289,7 -1278,7 +1289,7 @@@ isert_rx_login_req(struct isert_conn *i
  }
  
  static struct iscsi_cmd
 -*isert_allocate_cmd(struct iscsi_conn *conn)
 +*isert_allocate_cmd(struct iscsi_conn *conn, struct iser_rx_desc *rx_desc)
  {
        struct isert_conn *isert_conn = conn->context;
        struct isert_cmd *isert_cmd;
        isert_cmd = iscsit_priv_cmd(cmd);
        isert_cmd->conn = isert_conn;
        isert_cmd->iscsi_cmd = cmd;
 +      isert_cmd->rx_desc = rx_desc;
  
        return cmd;
  }
@@@ -1315,9 -1303,9 +1315,9 @@@ isert_handle_scsi_cmd(struct isert_con
  {
        struct iscsi_conn *conn = isert_conn->conn;
        struct iscsi_scsi_req *hdr = (struct iscsi_scsi_req *)buf;
 -      struct scatterlist *sg;
        int imm_data, imm_data_len, unsol_data, sg_nents, rc;
        bool dump_payload = false;
 +      unsigned int data_len;
  
        rc = iscsit_setup_scsi_cmd(conn, cmd, buf);
        if (rc < 0)
        imm_data = cmd->immediate_data;
        imm_data_len = cmd->first_burst_len;
        unsol_data = cmd->unsolicited_data;
 +      data_len = cmd->se_cmd.data_length;
  
 +      if (imm_data && imm_data_len == data_len)
 +              cmd->se_cmd.se_cmd_flags |= SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC;
        rc = iscsit_process_scsi_cmd(conn, cmd, hdr);
        if (rc < 0) {
                return 0;
        if (!imm_data)
                return 0;
  
 -      sg = &cmd->se_cmd.t_data_sg[0];
 -      sg_nents = max(1UL, DIV_ROUND_UP(imm_data_len, PAGE_SIZE));
 -
 -      isert_dbg("Copying Immediate SG: %p sg_nents: %u from %p imm_data_len: %d\n",
 -                sg, sg_nents, &rx_desc->data[0], imm_data_len);
 -
 -      sg_copy_from_buffer(sg, sg_nents, &rx_desc->data[0], imm_data_len);
 +      if (imm_data_len != data_len) {
 +              sg_nents = max(1UL, DIV_ROUND_UP(imm_data_len, PAGE_SIZE));
 +              sg_copy_from_buffer(cmd->se_cmd.t_data_sg, sg_nents,
 +                                  &rx_desc->data[0], imm_data_len);
 +              isert_dbg("Copy Immediate sg_nents: %u imm_data_len: %d\n",
 +                        sg_nents, imm_data_len);
 +      } else {
 +              sg_init_table(&isert_cmd->sg, 1);
 +              cmd->se_cmd.t_data_sg = &isert_cmd->sg;
 +              cmd->se_cmd.t_data_nents = 1;
 +              sg_set_buf(&isert_cmd->sg, &rx_desc->data[0], imm_data_len);
 +              isert_dbg("Transfer Immediate imm_data_len: %d\n",
 +                        imm_data_len);
 +      }
  
        cmd->write_data_done += imm_data_len;
  
@@@ -1429,15 -1407,6 +1429,15 @@@ isert_handle_iscsi_dataout(struct isert
        if (rc < 0)
                return rc;
  
 +      /*
 +       * multiple data-outs on the same command can arrive -
 +       * so post the buffer before hand
 +       */
 +      rc = isert_post_recv(isert_conn, rx_desc);
 +      if (rc) {
 +              isert_err("ib_post_recv failed with %d\n", rc);
 +              return rc;
 +      }
        return 0;
  }
  
@@@ -1510,7 -1479,7 +1510,7 @@@ isert_rx_opcode(struct isert_conn *iser
  
        switch (opcode) {
        case ISCSI_OP_SCSI_CMD:
 -              cmd = isert_allocate_cmd(conn);
 +              cmd = isert_allocate_cmd(conn, rx_desc);
                if (!cmd)
                        break;
  
                                        rx_desc, (unsigned char *)hdr);
                break;
        case ISCSI_OP_NOOP_OUT:
 -              cmd = isert_allocate_cmd(conn);
 +              cmd = isert_allocate_cmd(conn, rx_desc);
                if (!cmd)
                        break;
  
                                                (unsigned char *)hdr);
                break;
        case ISCSI_OP_SCSI_TMFUNC:
 -              cmd = isert_allocate_cmd(conn);
 +              cmd = isert_allocate_cmd(conn, rx_desc);
                if (!cmd)
                        break;
  
                                                (unsigned char *)hdr);
                break;
        case ISCSI_OP_LOGOUT:
 -              cmd = isert_allocate_cmd(conn);
 +              cmd = isert_allocate_cmd(conn, rx_desc);
                if (!cmd)
                        break;
  
                ret = iscsit_handle_logout_cmd(conn, cmd, (unsigned char *)hdr);
                break;
        case ISCSI_OP_TEXT:
 -              if (be32_to_cpu(hdr->ttt) != 0xFFFFFFFF) {
 +              if (be32_to_cpu(hdr->ttt) != 0xFFFFFFFF)
                        cmd = iscsit_find_cmd_from_itt(conn, hdr->itt);
 -                      if (!cmd)
 -                              break;
 -              } else {
 -                      cmd = isert_allocate_cmd(conn);
 -                      if (!cmd)
 -                              break;
 -              }
 +              else
 +                      cmd = isert_allocate_cmd(conn, rx_desc);
 +
 +              if (!cmd)
 +                      break;
  
                isert_cmd = iscsit_priv_cmd(cmd);
                ret = isert_handle_text_cmd(isert_conn, isert_cmd, cmd,
@@@ -1618,7 -1589,7 +1618,7 @@@ isert_rcv_completion(struct iser_rx_des
        struct ib_device *ib_dev = isert_conn->cm_id->device;
        struct iscsi_hdr *hdr;
        u64 rx_dma;
 -      int rx_buflen, outstanding;
 +      int rx_buflen;
  
        if ((char *)desc == isert_conn->login_req_buf) {
                rx_dma = isert_conn->login_req_dma;
                                      DMA_FROM_DEVICE);
  
        isert_conn->post_recv_buf_count--;
 -      isert_dbg("Decremented post_recv_buf_count: %d\n",
 -                isert_conn->post_recv_buf_count);
 -
 -      if ((char *)desc == isert_conn->login_req_buf)
 -              return;
 -
 -      outstanding = isert_conn->post_recv_buf_count;
 -      if (outstanding + ISERT_MIN_POSTED_RX <= ISERT_QP_MAX_RECV_DTOS) {
 -              int err, count = min(ISERT_QP_MAX_RECV_DTOS - outstanding,
 -                              ISERT_MIN_POSTED_RX);
 -              err = isert_post_recv(isert_conn, count);
 -              if (err) {
 -                      isert_err("isert_post_recv() count: %d failed, %d\n",
 -                             count, err);
 -              }
 -      }
  }
  
  static int
@@@ -1716,10 -1703,10 +1716,10 @@@ isert_unmap_cmd(struct isert_cmd *isert
                isert_unmap_data_buf(isert_conn, &wr->data);
        }
  
-       if (wr->send_wr) {
+       if (wr->rdma_wr) {
                isert_dbg("Cmd %p free send_wr\n", isert_cmd);
-               kfree(wr->send_wr);
-               wr->send_wr = NULL;
+               kfree(wr->rdma_wr);
+               wr->rdma_wr = NULL;
        }
  
        if (wr->ib_sge) {
@@@ -1754,7 -1741,7 +1754,7 @@@ isert_unreg_rdma(struct isert_cmd *iser
        }
  
        wr->ib_sge = NULL;
-       wr->send_wr = NULL;
+       wr->rdma_wr = NULL;
  }
  
  static void
@@@ -1923,7 -1910,7 +1923,7 @@@ isert_completion_rdma_write(struct iser
        }
  
        device->unreg_rdma_mem(isert_cmd, isert_conn);
-       wr->send_wr_num = 0;
+       wr->rdma_wr_num = 0;
        if (ret)
                transport_send_check_condition_and_sense(se_cmd,
                                                         se_cmd->pi_err, 0);
@@@ -1951,7 -1938,7 +1951,7 @@@ isert_completion_rdma_read(struct iser_
        iscsit_stop_dataout_timer(cmd);
        device->unreg_rdma_mem(isert_cmd, isert_conn);
        cmd->write_data_done = wr->data.len;
-       wr->send_wr_num = 0;
+       wr->rdma_wr_num = 0;
  
        isert_dbg("Cmd: %p RDMA_READ comp calling execute_cmd\n", isert_cmd);
        spin_lock_bh(&cmd->istate_lock);
@@@ -2169,12 -2156,6 +2169,12 @@@ isert_post_response(struct isert_conn *
        struct ib_send_wr *wr_failed;
        int ret;
  
 +      ret = isert_post_recv(isert_conn, isert_cmd->rx_desc);
 +      if (ret) {
 +              isert_err("ib_post_recv failed with %d\n", ret);
 +              return ret;
 +      }
 +
        ret = ib_post_send(isert_conn->qp, &isert_cmd->tx_desc.send_wr,
                           &wr_failed);
        if (ret) {
@@@ -2403,7 -2384,7 +2403,7 @@@ isert_put_text_rsp(struct iscsi_cmd *cm
  
  static int
  isert_build_rdma_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd,
-                   struct ib_sge *ib_sge, struct ib_send_wr *send_wr,
+                   struct ib_sge *ib_sge, struct ib_rdma_wr *rdma_wr,
                    u32 data_left, u32 offset)
  {
        struct iscsi_cmd *cmd = isert_cmd->iscsi_cmd;
        sg_nents = min(cmd->se_cmd.t_data_nents - sg_off, isert_conn->max_sge);
        page_off = offset % PAGE_SIZE;
  
-       send_wr->sg_list = ib_sge;
-       send_wr->wr_id = (uintptr_t)&isert_cmd->tx_desc;
+       rdma_wr->wr.sg_list = ib_sge;
+       rdma_wr->wr.wr_id = (uintptr_t)&isert_cmd->tx_desc;
        /*
         * Perform mapping of TCM scatterlist memory ib_sge dma_addr.
         */
                isert_dbg("Incrementing ib_sge pointer to %p\n", ib_sge);
        }
  
-       send_wr->num_sge = ++i;
+       rdma_wr->wr.num_sge = ++i;
        isert_dbg("Set outgoing sg_list: %p num_sg: %u from TCM SGLs\n",
-                 send_wr->sg_list, send_wr->num_sge);
+                 rdma_wr->wr.sg_list, rdma_wr->wr.num_sge);
  
-       return send_wr->num_sge;
+       return rdma_wr->wr.num_sge;
  }
  
  static int
@@@ -2459,7 -2440,7 +2459,7 @@@ isert_map_rdma(struct iscsi_conn *conn
        struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
        struct isert_conn *isert_conn = conn->context;
        struct isert_data_buf *data = &wr->data;
-       struct ib_send_wr *send_wr;
+       struct ib_rdma_wr *rdma_wr;
        struct ib_sge *ib_sge;
        u32 offset, data_len, data_left, rdma_write_max, va_offset = 0;
        int ret = 0, i, ib_sge_cnt;
        }
        wr->ib_sge = ib_sge;
  
-       wr->send_wr_num = DIV_ROUND_UP(data->nents, isert_conn->max_sge);
-       wr->send_wr = kzalloc(sizeof(struct ib_send_wr) * wr->send_wr_num,
+       wr->rdma_wr_num = DIV_ROUND_UP(data->nents, isert_conn->max_sge);
+       wr->rdma_wr = kzalloc(sizeof(struct ib_rdma_wr) * wr->rdma_wr_num,
                                GFP_KERNEL);
-       if (!wr->send_wr) {
-               isert_dbg("Unable to allocate wr->send_wr\n");
+       if (!wr->rdma_wr) {
+               isert_dbg("Unable to allocate wr->rdma_wr\n");
                ret = -ENOMEM;
                goto unmap_cmd;
        }
        wr->isert_cmd = isert_cmd;
        rdma_write_max = isert_conn->max_sge * PAGE_SIZE;
  
-       for (i = 0; i < wr->send_wr_num; i++) {
-               send_wr = &isert_cmd->rdma_wr.send_wr[i];
+       for (i = 0; i < wr->rdma_wr_num; i++) {
+               rdma_wr = &isert_cmd->rdma_wr.rdma_wr[i];
                data_len = min(data_left, rdma_write_max);
  
-               send_wr->send_flags = 0;
+               rdma_wr->wr.send_flags = 0;
                if (wr->iser_ib_op == ISER_IB_RDMA_WRITE) {
-                       send_wr->opcode = IB_WR_RDMA_WRITE;
-                       send_wr->wr.rdma.remote_addr = isert_cmd->read_va + offset;
-                       send_wr->wr.rdma.rkey = isert_cmd->read_stag;
-                       if (i + 1 == wr->send_wr_num)
-                               send_wr->next = &isert_cmd->tx_desc.send_wr;
+                       rdma_wr->wr.opcode = IB_WR_RDMA_WRITE;
+                       rdma_wr->remote_addr = isert_cmd->read_va + offset;
+                       rdma_wr->rkey = isert_cmd->read_stag;
+                       if (i + 1 == wr->rdma_wr_num)
+                               rdma_wr->wr.next = &isert_cmd->tx_desc.send_wr;
                        else
-                               send_wr->next = &wr->send_wr[i + 1];
+                               rdma_wr->wr.next = &wr->rdma_wr[i + 1].wr;
                } else {
-                       send_wr->opcode = IB_WR_RDMA_READ;
-                       send_wr->wr.rdma.remote_addr = isert_cmd->write_va + va_offset;
-                       send_wr->wr.rdma.rkey = isert_cmd->write_stag;
-                       if (i + 1 == wr->send_wr_num)
-                               send_wr->send_flags = IB_SEND_SIGNALED;
+                       rdma_wr->wr.opcode = IB_WR_RDMA_READ;
+                       rdma_wr->remote_addr = isert_cmd->write_va + va_offset;
+                       rdma_wr->rkey = isert_cmd->write_stag;
+                       if (i + 1 == wr->rdma_wr_num)
+                               rdma_wr->wr.send_flags = IB_SEND_SIGNALED;
                        else
-                               send_wr->next = &wr->send_wr[i + 1];
+                               rdma_wr->wr.next = &wr->rdma_wr[i + 1].wr;
                }
  
                ib_sge_cnt = isert_build_rdma_wr(isert_conn, isert_cmd, ib_sge,
-                                       send_wr, data_len, offset);
+                                       rdma_wr, data_len, offset);
                ib_sge += ib_sge_cnt;
  
                offset += data_len;
@@@ -2600,8 -2581,8 +2600,8 @@@ isert_fast_reg_mr(struct isert_conn *is
        struct ib_device *ib_dev = device->ib_device;
        struct ib_mr *mr;
        struct ib_fast_reg_page_list *frpl;
-       struct ib_send_wr fr_wr, inv_wr;
-       struct ib_send_wr *bad_wr, *wr = NULL;
+       struct ib_fast_reg_wr fr_wr;
+       struct ib_send_wr inv_wr, *bad_wr, *wr = NULL;
        int ret, pagelist_len;
        u32 page_off;
  
  
        /* Prepare FASTREG WR */
        memset(&fr_wr, 0, sizeof(fr_wr));
-       fr_wr.wr_id = ISER_FASTREG_LI_WRID;
-       fr_wr.opcode = IB_WR_FAST_REG_MR;
-       fr_wr.wr.fast_reg.iova_start = frpl->page_list[0] + page_off;
-       fr_wr.wr.fast_reg.page_list = frpl;
-       fr_wr.wr.fast_reg.page_list_len = pagelist_len;
-       fr_wr.wr.fast_reg.page_shift = PAGE_SHIFT;
-       fr_wr.wr.fast_reg.length = mem->len;
-       fr_wr.wr.fast_reg.rkey = mr->rkey;
-       fr_wr.wr.fast_reg.access_flags = IB_ACCESS_LOCAL_WRITE;
+       fr_wr.wr.wr_id = ISER_FASTREG_LI_WRID;
+       fr_wr.wr.opcode = IB_WR_FAST_REG_MR;
+       fr_wr.iova_start = frpl->page_list[0] + page_off;
+       fr_wr.page_list = frpl;
+       fr_wr.page_list_len = pagelist_len;
+       fr_wr.page_shift = PAGE_SHIFT;
+       fr_wr.length = mem->len;
+       fr_wr.rkey = mr->rkey;
+       fr_wr.access_flags = IB_ACCESS_LOCAL_WRITE;
  
        if (!wr)
-               wr = &fr_wr;
+               wr = &fr_wr.wr;
        else
-               wr->next = &fr_wr;
+               wr->next = &fr_wr.wr;
  
        ret = ib_post_send(isert_conn->qp, wr, &bad_wr);
        if (ret) {
@@@ -2733,8 -2714,8 +2733,8 @@@ isert_reg_sig_mr(struct isert_conn *ise
                 struct isert_rdma_wr *rdma_wr,
                 struct fast_reg_descriptor *fr_desc)
  {
-       struct ib_send_wr sig_wr, inv_wr;
-       struct ib_send_wr *bad_wr, *wr = NULL;
+       struct ib_sig_handover_wr sig_wr;
+       struct ib_send_wr inv_wr, *bad_wr, *wr = NULL;
        struct pi_context *pi_ctx = fr_desc->pi_ctx;
        struct ib_sig_attrs sig_attrs;
        int ret;
        }
  
        memset(&sig_wr, 0, sizeof(sig_wr));
-       sig_wr.opcode = IB_WR_REG_SIG_MR;
-       sig_wr.wr_id = ISER_FASTREG_LI_WRID;
-       sig_wr.sg_list = &rdma_wr->ib_sg[DATA];
-       sig_wr.num_sge = 1;
-       sig_wr.wr.sig_handover.access_flags = IB_ACCESS_LOCAL_WRITE;
-       sig_wr.wr.sig_handover.sig_attrs = &sig_attrs;
-       sig_wr.wr.sig_handover.sig_mr = pi_ctx->sig_mr;
+       sig_wr.wr.opcode = IB_WR_REG_SIG_MR;
+       sig_wr.wr.wr_id = ISER_FASTREG_LI_WRID;
+       sig_wr.wr.sg_list = &rdma_wr->ib_sg[DATA];
+       sig_wr.wr.num_sge = 1;
+       sig_wr.access_flags = IB_ACCESS_LOCAL_WRITE;
+       sig_wr.sig_attrs = &sig_attrs;
+       sig_wr.sig_mr = pi_ctx->sig_mr;
        if (se_cmd->t_prot_sg)
-               sig_wr.wr.sig_handover.prot = &rdma_wr->ib_sg[PROT];
+               sig_wr.prot = &rdma_wr->ib_sg[PROT];
  
        if (!wr)
-               wr = &sig_wr;
+               wr = &sig_wr.wr;
        else
-               wr->next = &sig_wr;
+               wr->next = &sig_wr.wr;
  
        ret = ib_post_send(isert_conn->qp, wr, &bad_wr);
        if (ret) {
@@@ -2859,7 -2840,7 +2859,7 @@@ isert_reg_rdma(struct iscsi_conn *conn
        struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
        struct isert_conn *isert_conn = conn->context;
        struct fast_reg_descriptor *fr_desc = NULL;
-       struct ib_send_wr *send_wr;
+       struct ib_rdma_wr *rdma_wr;
        struct ib_sge *ib_sg;
        u32 offset;
        int ret = 0;
  
        memcpy(&wr->s_ib_sge, ib_sg, sizeof(*ib_sg));
        wr->ib_sge = &wr->s_ib_sge;
-       wr->send_wr_num = 1;
-       memset(&wr->s_send_wr, 0, sizeof(*send_wr));
-       wr->send_wr = &wr->s_send_wr;
+       wr->rdma_wr_num = 1;
+       memset(&wr->s_rdma_wr, 0, sizeof(wr->s_rdma_wr));
+       wr->rdma_wr = &wr->s_rdma_wr;
        wr->isert_cmd = isert_cmd;
  
-       send_wr = &isert_cmd->rdma_wr.s_send_wr;
-       send_wr->sg_list = &wr->s_ib_sge;
-       send_wr->num_sge = 1;
-       send_wr->wr_id = (uintptr_t)&isert_cmd->tx_desc;
+       rdma_wr = &isert_cmd->rdma_wr.s_rdma_wr;
+       rdma_wr->wr.sg_list = &wr->s_ib_sge;
+       rdma_wr->wr.num_sge = 1;
+       rdma_wr->wr.wr_id = (uintptr_t)&isert_cmd->tx_desc;
        if (wr->iser_ib_op == ISER_IB_RDMA_WRITE) {
-               send_wr->opcode = IB_WR_RDMA_WRITE;
-               send_wr->wr.rdma.remote_addr = isert_cmd->read_va;
-               send_wr->wr.rdma.rkey = isert_cmd->read_stag;
-               send_wr->send_flags = !isert_prot_cmd(isert_conn, se_cmd) ?
+               rdma_wr->wr.opcode = IB_WR_RDMA_WRITE;
+               rdma_wr->remote_addr = isert_cmd->read_va;
+               rdma_wr->rkey = isert_cmd->read_stag;
+               rdma_wr->wr.send_flags = !isert_prot_cmd(isert_conn, se_cmd) ?
                                      0 : IB_SEND_SIGNALED;
        } else {
-               send_wr->opcode = IB_WR_RDMA_READ;
-               send_wr->wr.rdma.remote_addr = isert_cmd->write_va;
-               send_wr->wr.rdma.rkey = isert_cmd->write_stag;
-               send_wr->send_flags = IB_SEND_SIGNALED;
+               rdma_wr->wr.opcode = IB_WR_RDMA_READ;
+               rdma_wr->remote_addr = isert_cmd->write_va;
+               rdma_wr->rkey = isert_cmd->write_stag;
+               rdma_wr->wr.send_flags = IB_SEND_SIGNALED;
        }
  
        return 0;
@@@ -2967,17 -2948,11 +2967,17 @@@ isert_put_datain(struct iscsi_conn *con
                isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc);
                isert_init_send_wr(isert_conn, isert_cmd,
                                   &isert_cmd->tx_desc.send_wr);
-               isert_cmd->rdma_wr.s_send_wr.next = &isert_cmd->tx_desc.send_wr;
-               wr->send_wr_num += 1;
+               isert_cmd->rdma_wr.s_rdma_wr.wr.next = &isert_cmd->tx_desc.send_wr;
+               wr->rdma_wr_num += 1;
 +
 +              rc = isert_post_recv(isert_conn, isert_cmd->rx_desc);
 +              if (rc) {
 +                      isert_err("ib_post_recv failed with %d\n", rc);
 +                      return rc;
 +              }
        }
  
-       rc = ib_post_send(isert_conn->qp, wr->send_wr, &wr_failed);
+       rc = ib_post_send(isert_conn->qp, &wr->rdma_wr->wr, &wr_failed);
        if (rc)
                isert_warn("ib_post_send() failed for IB_WR_RDMA_WRITE\n");
  
@@@ -3011,7 -2986,7 +3011,7 @@@ isert_get_dataout(struct iscsi_conn *co
                return rc;
        }
  
-       rc = ib_post_send(isert_conn->qp, wr->send_wr, &wr_failed);
+       rc = ib_post_send(isert_conn->qp, &wr->rdma_wr->wr, &wr_failed);
        if (rc)
                isert_warn("ib_post_send() failed for IB_WR_RDMA_READ\n");
  
  static int
  isert_immediate_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state)
  {
 -      int ret;
 +      struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
 +      int ret = 0;
  
        switch (state) {
 +      case ISTATE_REMOVE:
 +              spin_lock_bh(&conn->cmd_lock);
 +              list_del_init(&cmd->i_conn_node);
 +              spin_unlock_bh(&conn->cmd_lock);
 +              isert_put_cmd(isert_cmd, true);
 +              break;
        case ISTATE_SEND_NOPIN_WANT_RESPONSE:
                ret = isert_put_nopin(cmd, conn, false);
                break;
@@@ -3138,10 -3106,10 +3138,10 @@@ isert_setup_np(struct iscsi_np *np
                isert_err("Unable to allocate struct isert_np\n");
                return -ENOMEM;
        }
 -      sema_init(&isert_np->np_sem, 0);
 -      mutex_init(&isert_np->np_accept_mutex);
 -      INIT_LIST_HEAD(&isert_np->np_accept_list);
 -      init_completion(&isert_np->np_login_comp);
 +      sema_init(&isert_np->sem, 0);
 +      mutex_init(&isert_np->mutex);
 +      INIT_LIST_HEAD(&isert_np->accepted);
 +      INIT_LIST_HEAD(&isert_np->pending);
        isert_np->np = np;
  
        /*
                goto out;
        }
  
 -      isert_np->np_cm_id = isert_lid;
 +      isert_np->cm_id = isert_lid;
        np->np_context = isert_np;
  
        return 0;
@@@ -3246,7 -3214,7 +3246,7 @@@ isert_accept_np(struct iscsi_np *np, st
        int ret;
  
  accept_wait:
 -      ret = down_interruptible(&isert_np->np_sem);
 +      ret = down_interruptible(&isert_np->sem);
        if (ret)
                return -ENODEV;
  
        }
        spin_unlock_bh(&np->np_thread_lock);
  
 -      mutex_lock(&isert_np->np_accept_mutex);
 -      if (list_empty(&isert_np->np_accept_list)) {
 -              mutex_unlock(&isert_np->np_accept_mutex);
 +      mutex_lock(&isert_np->mutex);
 +      if (list_empty(&isert_np->pending)) {
 +              mutex_unlock(&isert_np->mutex);
                goto accept_wait;
        }
 -      isert_conn = list_first_entry(&isert_np->np_accept_list,
 -                      struct isert_conn, accept_node);
 -      list_del_init(&isert_conn->accept_node);
 -      mutex_unlock(&isert_np->np_accept_mutex);
 +      isert_conn = list_first_entry(&isert_np->pending,
 +                      struct isert_conn, node);
 +      list_del_init(&isert_conn->node);
 +      mutex_unlock(&isert_np->mutex);
  
        conn->context = isert_conn;
        isert_conn->conn = conn;
@@@ -3289,39 -3257,28 +3289,39 @@@ isert_free_np(struct iscsi_np *np
        struct isert_np *isert_np = np->np_context;
        struct isert_conn *isert_conn, *n;
  
 -      if (isert_np->np_cm_id)
 -              rdma_destroy_id(isert_np->np_cm_id);
 +      if (isert_np->cm_id)
 +              rdma_destroy_id(isert_np->cm_id);
  
        /*
         * FIXME: At this point we don't have a good way to insure
         * that at this point we don't have hanging connections that
         * completed RDMA establishment but didn't start iscsi login
         * process. So work-around this by cleaning up what ever piled
 -       * up in np_accept_list.
 +       * up in accepted and pending lists.
         */
 -      mutex_lock(&isert_np->np_accept_mutex);
 -      if (!list_empty(&isert_np->np_accept_list)) {
 -              isert_info("Still have isert connections, cleaning up...\n");
 +      mutex_lock(&isert_np->mutex);
 +      if (!list_empty(&isert_np->pending)) {
 +              isert_info("Still have isert pending connections\n");
 +              list_for_each_entry_safe(isert_conn, n,
 +                                       &isert_np->pending,
 +                                       node) {
 +                      isert_info("cleaning isert_conn %p state (%d)\n",
 +                                 isert_conn, isert_conn->state);
 +                      isert_connect_release(isert_conn);
 +              }
 +      }
 +
 +      if (!list_empty(&isert_np->accepted)) {
 +              isert_info("Still have isert accepted connections\n");
                list_for_each_entry_safe(isert_conn, n,
 -                                       &isert_np->np_accept_list,
 -                                       accept_node) {
 +                                       &isert_np->accepted,
 +                                       node) {
                        isert_info("cleaning isert_conn %p state (%d)\n",
                                   isert_conn, isert_conn->state);
                        isert_connect_release(isert_conn);
                }
        }
 -      mutex_unlock(&isert_np->np_accept_mutex);
 +      mutex_unlock(&isert_np->mutex);
  
        np->np_context = NULL;
        kfree(isert_np);
@@@ -3388,41 -3345,6 +3388,41 @@@ isert_wait4flush(struct isert_conn *ise
        wait_for_completion(&isert_conn->wait_comp_err);
  }
  
 +/**
 + * isert_put_unsol_pending_cmds() - Drop commands waiting for
 + *     unsolicitate dataout
 + * @conn:    iscsi connection
 + *
 + * We might still have commands that are waiting for unsolicited
 + * dataouts messages. We must put the extra reference on those
 + * before blocking on the target_wait_for_session_cmds
 + */
 +static void
 +isert_put_unsol_pending_cmds(struct iscsi_conn *conn)
 +{
 +      struct iscsi_cmd *cmd, *tmp;
 +      static LIST_HEAD(drop_cmd_list);
 +
 +      spin_lock_bh(&conn->cmd_lock);
 +      list_for_each_entry_safe(cmd, tmp, &conn->conn_cmd_list, i_conn_node) {
 +              if ((cmd->cmd_flags & ICF_NON_IMMEDIATE_UNSOLICITED_DATA) &&
 +                  (cmd->write_data_done < conn->sess->sess_ops->FirstBurstLength) &&
 +                  (cmd->write_data_done < cmd->se_cmd.data_length))
 +                      list_move_tail(&cmd->i_conn_node, &drop_cmd_list);
 +      }
 +      spin_unlock_bh(&conn->cmd_lock);
 +
 +      list_for_each_entry_safe(cmd, tmp, &drop_cmd_list, i_conn_node) {
 +              list_del_init(&cmd->i_conn_node);
 +              if (cmd->i_state != ISTATE_REMOVE) {
 +                      struct isert_cmd *isert_cmd = iscsit_priv_cmd(cmd);
 +
 +                      isert_info("conn %p dropping cmd %p\n", conn, cmd);
 +                      isert_put_cmd(isert_cmd, true);
 +              }
 +      }
 +}
 +
  static void isert_wait_conn(struct iscsi_conn *conn)
  {
        struct isert_conn *isert_conn = conn->context;
        isert_conn_terminate(isert_conn);
        mutex_unlock(&isert_conn->mutex);
  
 -      isert_wait4cmds(conn);
        isert_wait4flush(isert_conn);
 +      isert_put_unsol_pending_cmds(conn);
 +      isert_wait4cmds(conn);
        isert_wait4logout(isert_conn);
  
        queue_work(isert_release_wq, &isert_conn->release_work);
index c5b99bcecbcff806945be8baa9cc6dbeca46418a,0a4a7861cce921b31d461066ce71f3d6e201c254..3604618194524381e90e456eb3d8e9f7e1abcf95
@@@ -113,13 -113,14 +113,13 @@@ enum 
  };
  
  struct isert_rdma_wr {
 -      struct list_head        wr_list;
        struct isert_cmd        *isert_cmd;
        enum iser_ib_op_code    iser_ib_op;
        struct ib_sge           *ib_sge;
        struct ib_sge           s_ib_sge;
-       int                     send_wr_num;
-       struct ib_send_wr       *send_wr;
-       struct ib_send_wr       s_send_wr;
+       int                     rdma_wr_num;
+       struct ib_rdma_wr       *rdma_wr;
+       struct ib_rdma_wr       s_rdma_wr;
        struct ib_sge           ib_sg[3];
        struct isert_data_buf   data;
        struct isert_data_buf   prot;
@@@ -133,13 -134,14 +133,13 @@@ struct isert_cmd 
        uint64_t                write_va;
        u64                     pdu_buf_dma;
        u32                     pdu_buf_len;
 -      u32                     read_va_off;
 -      u32                     write_va_off;
 -      u32                     rdma_wr_num;
        struct isert_conn       *conn;
        struct iscsi_cmd        *iscsi_cmd;
        struct iser_tx_desc     tx_desc;
 +      struct iser_rx_desc     *rx_desc;
        struct isert_rdma_wr    rdma_wr;
        struct work_struct      comp_work;
 +      struct scatterlist      sg;
  };
  
  struct isert_device;
@@@ -157,10 -159,11 +157,10 @@@ struct isert_conn 
        u64                     login_req_dma;
        int                     login_req_len;
        u64                     login_rsp_dma;
 -      unsigned int            rx_desc_head;
        struct iser_rx_desc     *rx_descs;
 -      struct ib_recv_wr       rx_wr[ISERT_MIN_POSTED_RX];
 +      struct ib_recv_wr       rx_wr[ISERT_QP_MAX_RECV_DTOS];
        struct iscsi_conn       *conn;
 -      struct list_head        accept_node;
 +      struct list_head        node;
        struct completion       login_comp;
        struct completion       login_req_comp;
        struct iser_tx_desc     login_tx_desc;
@@@ -219,9 -222,9 +219,9 @@@ struct isert_device 
  
  struct isert_np {
        struct iscsi_np         *np;
 -      struct semaphore        np_sem;
 -      struct rdma_cm_id       *np_cm_id;
 -      struct mutex            np_accept_mutex;
 -      struct list_head        np_accept_list;
 -      struct completion       np_login_comp;
 +      struct semaphore        sem;
 +      struct rdma_cm_id       *cm_id;
 +      struct mutex            mutex;
 +      struct list_head        accepted;
 +      struct list_head        pending;
  };
This page took 0.115142 seconds and 4 git commands to generate.