Hi Jiri, Just send out an updated version of this patch that applies against 3.12.18. Thanks! --nab On Tue, 2014-05-06 at 11:19 +0200, Jiri Slaby wrote: > From: Nicholas Bellinger <nab@xxxxxxxxxxxxxxx> > > This patch does NOT apply to the 3.12 stable tree. If you still want > it applied, please provide a backport. > > =============== > > commit f46d6a8a01d6bbd83a97140f30a72a89b038807b upstream. > > This patch changes isert_conn_create_fastreg_pool() to follow > logic in iscsi_target_locate_portal() for determining how many > FRMR descriptors to allocate based upon the number of possible > per-session command slots that are available. > > This addresses an OOPs in isert_reg_rdma() where due to the > use of ISCSI_DEF_XMIT_CMDS_MAX could end up returning a bogus > fast_reg_descriptor when the number of active tags exceeded > the original hardcoded max. > > Note this also includes moving isert_conn_create_fastreg_pool() > from isert_connect_request() to isert_put_login_tx() before > posting the final Login Response PDU in order to determine the > se_nacl->queue_depth (eg: number of tags) per session the target > will be enforcing. > > v2 changes: > - Move isert_conn->conn_fr_pool list_head init into > isert_conn_request() > v3 changes: > - Drop unnecessary list_empty() check in isert_reg_rdma() > (Sagi) > > Cc: Sagi Grimberg <sagig@xxxxxxxxxxxx> > Cc: Or Gerlitz <ogerlitz@xxxxxxxxxxxx> > Cc: <stable@xxxxxxxxxxxxxxx> #3.12+ > Signed-off-by: Nicholas Bellinger <nab@xxxxxxxxxxxxxxx> > --- > drivers/infiniband/ulp/isert/ib_isert.c | 38 ++++++++++++++++++++------------- > 1 file changed, 23 insertions(+), 15 deletions(-) > > diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c > index 09bde9fe6b8d..529d2cbfe45a 100644 > --- a/drivers/infiniband/ulp/isert/ib_isert.c > +++ b/drivers/infiniband/ulp/isert/ib_isert.c > @@ -508,11 +508,18 @@ isert_conn_create_fastreg_pool(struct isert_conn *isert_conn, u8 pi_support) > { > struct fast_reg_descriptor *fr_desc; > struct isert_device *device = isert_conn->conn_device; > - int i, ret; > + struct se_session *se_sess = isert_conn->conn->sess->se_sess; > + struct se_node_acl *se_nacl = se_sess->se_node_acl; > + int i, ret, tag_num; > + /* > + * Setup the number of FRMRs based upon the number of tags > + * available to session in iscsi_target_locate_portal(). > + */ > + tag_num = max_t(u32, ISCSIT_MIN_TAGS, se_nacl->queue_depth); > + tag_num = (tag_num * 2) + ISCSIT_EXTRA_TAGS; > > - INIT_LIST_HEAD(&isert_conn->conn_fr_pool); > isert_conn->conn_fr_pool_size = 0; > - for (i = 0; i < ISCSI_DEF_XMIT_CMDS_MAX; i++) { > + for (i = 0; i < tag_num; i++) { > fr_desc = kzalloc(sizeof(*fr_desc), GFP_KERNEL); > if (!fr_desc) { > pr_err("Failed to allocate fast_reg descriptor\n"); > @@ -572,6 +579,7 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) > kref_get(&isert_conn->conn_kref); > mutex_init(&isert_conn->conn_mutex); > spin_lock_init(&isert_conn->conn_lock); > + INIT_LIST_HEAD(&isert_conn->conn_fr_pool); > > cma_id->context = isert_conn; > isert_conn->conn_cm_id = cma_id; > @@ -649,15 +657,6 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) > goto out_mr; > } > > - if (device->use_fastreg) { > - ret = isert_conn_create_fastreg_pool(isert_conn, pi_support); > - if (ret) { > - pr_err("Conn: %p failed to create fastreg pool\n", > - isert_conn); > - goto out_fastreg; > - } > - } > - > ret = isert_conn_setup_qp(isert_conn, cma_id, pi_support); > if (ret) > goto out_conn_dev; > @@ -671,9 +670,6 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) > return 0; > > out_conn_dev: > - if (device->use_fastreg) > - isert_conn_free_fastreg_pool(isert_conn); > -out_fastreg: > ib_dereg_mr(isert_conn->conn_mr); > out_mr: > ib_dealloc_pd(isert_conn->conn_pd); > @@ -1047,6 +1043,18 @@ isert_put_login_tx(struct iscsi_conn *conn, struct iscsi_login *login, > } > if (!login->login_failed) { > if (login->login_complete) { > + if (isert_conn->conn_device->use_fastreg) { > + u8 pi_support = login->np->tpg_np->tpg->tpg_attrib.t10_pi; > + > + ret = isert_conn_create_fastreg_pool(isert_conn, > + pi_support); > + if (ret) { > + pr_err("Conn: %p failed to create" > + " fastreg pool\n", isert_conn); > + return ret; > + } > + } > + > ret = isert_alloc_rx_descriptors(isert_conn); > if (ret) > return ret; -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html