Skip to content

Commit d3e125d

Browse files
Sagi GrimbergNicholas Bellinger
authored andcommitted
IB/isert: Initialize T10-PI resources
Introduce pi_context to hold relevant RDMA protection resources. We eliminate data_key_valid boolean and replace it with indicators container to indicate: - Is the descriptor protected (registered via signature MR) - Is the data_mr key valid (can spare LOCAL_INV WR) - Is the prot_mr key valid (can spare LOCAL_INV WR) - Is the sig_mr key valid (can spare LOCAL_INV WR) Upon connection establishment check if network portal is T10-PI enabled and allocate T10-PI resources if necessary, allocate signature enabled memory regions and mark connection queue-pair as signature enabled. (Fix context change for v3.14-rc6 code - nab) Signed-off-by: Sagi Grimberg <[email protected]> Signed-off-by: Nicholas Bellinger <[email protected]>
1 parent e3d7e4c commit d3e125d

File tree

2 files changed

+110
-17
lines changed

2 files changed

+110
-17
lines changed

drivers/infiniband/ulp/isert/ib_isert.c

Lines changed: 91 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ isert_query_device(struct ib_device *ib_dev, struct ib_device_attr *devattr)
8787
}
8888

8989
static int
90-
isert_conn_setup_qp(struct isert_conn *isert_conn, struct rdma_cm_id *cma_id)
90+
isert_conn_setup_qp(struct isert_conn *isert_conn, struct rdma_cm_id *cma_id,
91+
u8 protection)
9192
{
9293
struct isert_device *device = isert_conn->conn_device;
9394
struct ib_qp_init_attr attr;
@@ -119,6 +120,8 @@ isert_conn_setup_qp(struct isert_conn *isert_conn, struct rdma_cm_id *cma_id)
119120
attr.cap.max_recv_sge = 1;
120121
attr.sq_sig_type = IB_SIGNAL_REQ_WR;
121122
attr.qp_type = IB_QPT_RC;
123+
if (protection)
124+
attr.create_flags |= IB_QP_CREATE_SIGNATURE_EN;
122125

123126
pr_debug("isert_conn_setup_qp cma_id->device: %p\n",
124127
cma_id->device);
@@ -236,13 +239,18 @@ isert_create_device_ib_res(struct isert_device *device)
236239
device->unreg_rdma_mem = isert_unmap_cmd;
237240
}
238241

242+
/* Check signature cap */
243+
device->pi_capable = dev_attr->device_cap_flags &
244+
IB_DEVICE_SIGNATURE_HANDOVER ? true : false;
245+
239246
device->cqs_used = min_t(int, num_online_cpus(),
240247
device->ib_device->num_comp_vectors);
241248
device->cqs_used = min(ISERT_MAX_CQ, device->cqs_used);
242249
pr_debug("Using %d CQs, device %s supports %d vectors support "
243-
"Fast registration %d\n",
250+
"Fast registration %d pi_capable %d\n",
244251
device->cqs_used, device->ib_device->name,
245-
device->ib_device->num_comp_vectors, device->use_fastreg);
252+
device->ib_device->num_comp_vectors, device->use_fastreg,
253+
device->pi_capable);
246254
device->cq_desc = kzalloc(sizeof(struct isert_cq_desc) *
247255
device->cqs_used, GFP_KERNEL);
248256
if (!device->cq_desc) {
@@ -395,6 +403,12 @@ isert_conn_free_fastreg_pool(struct isert_conn *isert_conn)
395403
list_del(&fr_desc->list);
396404
ib_free_fast_reg_page_list(fr_desc->data_frpl);
397405
ib_dereg_mr(fr_desc->data_mr);
406+
if (fr_desc->pi_ctx) {
407+
ib_free_fast_reg_page_list(fr_desc->pi_ctx->prot_frpl);
408+
ib_dereg_mr(fr_desc->pi_ctx->prot_mr);
409+
ib_destroy_mr(fr_desc->pi_ctx->sig_mr);
410+
kfree(fr_desc->pi_ctx);
411+
}
398412
kfree(fr_desc);
399413
++i;
400414
}
@@ -406,8 +420,10 @@ isert_conn_free_fastreg_pool(struct isert_conn *isert_conn)
406420

407421
static int
408422
isert_create_fr_desc(struct ib_device *ib_device, struct ib_pd *pd,
409-
struct fast_reg_descriptor *fr_desc)
423+
struct fast_reg_descriptor *fr_desc, u8 protection)
410424
{
425+
int ret;
426+
411427
fr_desc->data_frpl = ib_alloc_fast_reg_page_list(ib_device,
412428
ISCSI_ISER_SG_TABLESIZE);
413429
if (IS_ERR(fr_desc->data_frpl)) {
@@ -420,19 +436,73 @@ isert_create_fr_desc(struct ib_device *ib_device, struct ib_pd *pd,
420436
if (IS_ERR(fr_desc->data_mr)) {
421437
pr_err("Failed to allocate data frmr err=%ld\n",
422438
PTR_ERR(fr_desc->data_mr));
423-
ib_free_fast_reg_page_list(fr_desc->data_frpl);
424-
return PTR_ERR(fr_desc->data_mr);
439+
ret = PTR_ERR(fr_desc->data_mr);
440+
goto err_data_frpl;
425441
}
426442
pr_debug("Create fr_desc %p page_list %p\n",
427443
fr_desc, fr_desc->data_frpl->page_list);
444+
fr_desc->ind |= ISERT_DATA_KEY_VALID;
428445

429-
fr_desc->valid = true;
446+
if (protection) {
447+
struct ib_mr_init_attr mr_init_attr = {0};
448+
struct pi_context *pi_ctx;
449+
450+
fr_desc->pi_ctx = kzalloc(sizeof(*fr_desc->pi_ctx), GFP_KERNEL);
451+
if (!fr_desc->pi_ctx) {
452+
pr_err("Failed to allocate pi context\n");
453+
ret = -ENOMEM;
454+
goto err_data_mr;
455+
}
456+
pi_ctx = fr_desc->pi_ctx;
457+
458+
pi_ctx->prot_frpl = ib_alloc_fast_reg_page_list(ib_device,
459+
ISCSI_ISER_SG_TABLESIZE);
460+
if (IS_ERR(pi_ctx->prot_frpl)) {
461+
pr_err("Failed to allocate prot frpl err=%ld\n",
462+
PTR_ERR(pi_ctx->prot_frpl));
463+
ret = PTR_ERR(pi_ctx->prot_frpl);
464+
goto err_pi_ctx;
465+
}
466+
467+
pi_ctx->prot_mr = ib_alloc_fast_reg_mr(pd, ISCSI_ISER_SG_TABLESIZE);
468+
if (IS_ERR(pi_ctx->prot_mr)) {
469+
pr_err("Failed to allocate prot frmr err=%ld\n",
470+
PTR_ERR(pi_ctx->prot_mr));
471+
ret = PTR_ERR(pi_ctx->prot_mr);
472+
goto err_prot_frpl;
473+
}
474+
fr_desc->ind |= ISERT_PROT_KEY_VALID;
475+
476+
mr_init_attr.max_reg_descriptors = 2;
477+
mr_init_attr.flags |= IB_MR_SIGNATURE_EN;
478+
pi_ctx->sig_mr = ib_create_mr(pd, &mr_init_attr);
479+
if (IS_ERR(pi_ctx->sig_mr)) {
480+
pr_err("Failed to allocate signature enabled mr err=%ld\n",
481+
PTR_ERR(pi_ctx->sig_mr));
482+
ret = PTR_ERR(pi_ctx->sig_mr);
483+
goto err_prot_mr;
484+
}
485+
fr_desc->ind |= ISERT_SIG_KEY_VALID;
486+
}
487+
fr_desc->ind &= ~ISERT_PROTECTED;
430488

431489
return 0;
490+
err_prot_mr:
491+
ib_dereg_mr(fr_desc->pi_ctx->prot_mr);
492+
err_prot_frpl:
493+
ib_free_fast_reg_page_list(fr_desc->pi_ctx->prot_frpl);
494+
err_pi_ctx:
495+
kfree(fr_desc->pi_ctx);
496+
err_data_mr:
497+
ib_dereg_mr(fr_desc->data_mr);
498+
err_data_frpl:
499+
ib_free_fast_reg_page_list(fr_desc->data_frpl);
500+
501+
return ret;
432502
}
433503

434504
static int
435-
isert_conn_create_fastreg_pool(struct isert_conn *isert_conn)
505+
isert_conn_create_fastreg_pool(struct isert_conn *isert_conn, u8 pi_support)
436506
{
437507
struct fast_reg_descriptor *fr_desc;
438508
struct isert_device *device = isert_conn->conn_device;
@@ -449,7 +519,8 @@ isert_conn_create_fastreg_pool(struct isert_conn *isert_conn)
449519
}
450520

451521
ret = isert_create_fr_desc(device->ib_device,
452-
isert_conn->conn_pd, fr_desc);
522+
isert_conn->conn_pd, fr_desc,
523+
pi_support);
453524
if (ret) {
454525
pr_err("Failed to create fastreg descriptor err=%d\n",
455526
ret);
@@ -480,6 +551,7 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
480551
struct isert_device *device;
481552
struct ib_device *ib_dev = cma_id->device;
482553
int ret = 0;
554+
u8 pi_support = np->tpg_np->tpg->tpg_attrib.t10_pi;
483555

484556
pr_debug("Entering isert_connect_request cma_id: %p, context: %p\n",
485557
cma_id, cma_id->context);
@@ -569,16 +641,22 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
569641
goto out_mr;
570642
}
571643

644+
if (pi_support && !device->pi_capable) {
645+
pr_err("Protection information requested but not supported\n");
646+
ret = -EINVAL;
647+
goto out_mr;
648+
}
649+
572650
if (device->use_fastreg) {
573-
ret = isert_conn_create_fastreg_pool(isert_conn);
651+
ret = isert_conn_create_fastreg_pool(isert_conn, pi_support);
574652
if (ret) {
575653
pr_err("Conn: %p failed to create fastreg pool\n",
576654
isert_conn);
577655
goto out_fastreg;
578656
}
579657
}
580658

581-
ret = isert_conn_setup_qp(isert_conn, cma_id);
659+
ret = isert_conn_setup_qp(isert_conn, cma_id, pi_support);
582660
if (ret)
583661
goto out_conn_dev;
584662

@@ -2280,7 +2358,7 @@ isert_fast_reg_mr(struct isert_conn *isert_conn,
22802358
pagelist_len = isert_map_fr_pagelist(ib_dev, mem->sg, mem->nents,
22812359
&fr_desc->data_frpl->page_list[0]);
22822360

2283-
if (!fr_desc->valid) {
2361+
if (!(fr_desc->ind & ISERT_DATA_KEY_VALID)) {
22842362
memset(&inv_wr, 0, sizeof(inv_wr));
22852363
inv_wr.wr_id = ISER_FASTREG_LI_WRID;
22862364
inv_wr.opcode = IB_WR_LOCAL_INV;
@@ -2314,7 +2392,7 @@ isert_fast_reg_mr(struct isert_conn *isert_conn,
23142392
pr_err("fast registration failed, ret:%d\n", ret);
23152393
return ret;
23162394
}
2317-
fr_desc->valid = false;
2395+
fr_desc->ind &= ~ISERT_DATA_KEY_VALID;
23182396

23192397
sge->lkey = fr_desc->data_mr->lkey;
23202398
sge->addr = fr_desc->data_frpl->page_list[0] + page_off;

drivers/infiniband/ulp/isert/ib_isert.h

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,25 @@ struct iser_tx_desc {
5050
struct ib_send_wr send_wr;
5151
} __packed;
5252

53+
enum isert_indicator {
54+
ISERT_PROTECTED = 1 << 0,
55+
ISERT_DATA_KEY_VALID = 1 << 1,
56+
ISERT_PROT_KEY_VALID = 1 << 2,
57+
ISERT_SIG_KEY_VALID = 1 << 3,
58+
};
59+
60+
struct pi_context {
61+
struct ib_mr *prot_mr;
62+
struct ib_fast_reg_page_list *prot_frpl;
63+
struct ib_mr *sig_mr;
64+
};
65+
5366
struct fast_reg_descriptor {
54-
struct list_head list;
55-
struct ib_mr *data_mr;
56-
struct ib_fast_reg_page_list *data_frpl;
57-
bool valid;
67+
struct list_head list;
68+
struct ib_mr *data_mr;
69+
struct ib_fast_reg_page_list *data_frpl;
70+
u8 ind;
71+
struct pi_context *pi_ctx;
5872
};
5973

6074
struct isert_data_buf {
@@ -149,6 +163,7 @@ struct isert_cq_desc {
149163

150164
struct isert_device {
151165
int use_fastreg;
166+
bool pi_capable;
152167
int cqs_used;
153168
int refcount;
154169
int cq_active_qps[ISERT_MAX_CQ];

0 commit comments

Comments
 (0)