3.14-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Nicholas Bellinger <[email protected]>

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 <[email protected]>
Cc: Or Gerlitz <[email protected]>
Signed-off-by: Nicholas Bellinger <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
---
 drivers/infiniband/ulp/isert/ib_isert.c |   35 ++++++++++++++++++--------------
 1 file changed, 20 insertions(+), 15 deletions(-)

--- a/drivers/infiniband/ulp/isert/ib_isert.c
+++ b/drivers/infiniband/ulp/isert/ib_isert.c
@@ -436,11 +436,18 @@ isert_conn_create_fastreg_pool(struct is
 {
        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");
@@ -498,6 +505,7 @@ isert_connect_request(struct rdma_cm_id
        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;
@@ -569,15 +577,6 @@ isert_connect_request(struct rdma_cm_id
                goto out_mr;
        }
 
-       if (device->use_fastreg) {
-               ret = isert_conn_create_fastreg_pool(isert_conn);
-               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);
        if (ret)
                goto out_conn_dev;
@@ -591,9 +590,6 @@ isert_connect_request(struct rdma_cm_id
        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);
@@ -967,6 +963,15 @@ isert_put_login_tx(struct iscsi_conn *co
        }
        if (!login->login_failed) {
                if (login->login_complete) {
+                       if (isert_conn->conn_device->use_fastreg) {
+                               ret = 
isert_conn_create_fastreg_pool(isert_conn);
+                               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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to