|
@@ -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;
|