aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2014-12-07 09:10:06 -0500
committerRoland Dreier <roland@purestorage.com>2014-12-15 21:11:46 -0500
commit5bb6e543d2a7d580ca56317fa38b394ab02638b4 (patch)
treed7a87ff23ab5979dd73fa6c49315f3d94343198d
parent06c7fb6776ddb0ece4bcee8061eeda4ed4a771dc (diff)
IB/iser: DIX update
Following few recent Block integrity updates, we align the iSER data integrity offload settings with: - Deprecate pi_guard module param - Expose support for DIX type 0. - Use scsi_transfer_length for the transfer length - Get pi_interval, ref_tag, ref_remap, bg_type and check_mask setting from scsi_cmnd Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/infiniband/ulp/iser/iscsi_iser.c21
-rw-r--r--drivers/infiniband/ulp/iser/iser_memory.c62
2 files changed, 26 insertions, 57 deletions
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c
index 0af32cdb34a1..6a594aac2290 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.c
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.c
@@ -97,7 +97,7 @@ module_param_named(pi_enable, iser_pi_enable, bool, 0644);
97MODULE_PARM_DESC(pi_enable, "Enable T10-PI offload support (default:disabled)"); 97MODULE_PARM_DESC(pi_enable, "Enable T10-PI offload support (default:disabled)");
98 98
99module_param_named(pi_guard, iser_pi_guard, int, 0644); 99module_param_named(pi_guard, iser_pi_guard, int, 0644);
100MODULE_PARM_DESC(pi_guard, "T10-PI guard_type, 0:CRC|1:IP_CSUM (default:IP_CSUM)"); 100MODULE_PARM_DESC(pi_guard, "T10-PI guard_type [deprecated]");
101 101
102static struct workqueue_struct *release_wq; 102static struct workqueue_struct *release_wq;
103struct iser_global ig; 103struct iser_global ig;
@@ -574,12 +574,13 @@ iscsi_iser_session_destroy(struct iscsi_cls_session *cls_session)
574static inline unsigned int 574static inline unsigned int
575iser_dif_prot_caps(int prot_caps) 575iser_dif_prot_caps(int prot_caps)
576{ 576{
577 return ((prot_caps & IB_PROT_T10DIF_TYPE_1) ? SHOST_DIF_TYPE1_PROTECTION | 577 return ((prot_caps & IB_PROT_T10DIF_TYPE_1) ?
578 SHOST_DIX_TYPE1_PROTECTION : 0) | 578 SHOST_DIF_TYPE1_PROTECTION | SHOST_DIX_TYPE0_PROTECTION |
579 ((prot_caps & IB_PROT_T10DIF_TYPE_2) ? SHOST_DIF_TYPE2_PROTECTION | 579 SHOST_DIX_TYPE1_PROTECTION : 0) |
580 SHOST_DIX_TYPE2_PROTECTION : 0) | 580 ((prot_caps & IB_PROT_T10DIF_TYPE_2) ?
581 ((prot_caps & IB_PROT_T10DIF_TYPE_3) ? SHOST_DIF_TYPE3_PROTECTION | 581 SHOST_DIF_TYPE2_PROTECTION | SHOST_DIX_TYPE2_PROTECTION : 0) |
582 SHOST_DIX_TYPE3_PROTECTION : 0); 582 ((prot_caps & IB_PROT_T10DIF_TYPE_3) ?
583 SHOST_DIF_TYPE3_PROTECTION | SHOST_DIX_TYPE3_PROTECTION : 0);
583} 584}
584 585
585/** 586/**
@@ -635,10 +636,8 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
635 u32 sig_caps = ib_conn->device->dev_attr.sig_prot_cap; 636 u32 sig_caps = ib_conn->device->dev_attr.sig_prot_cap;
636 637
637 scsi_host_set_prot(shost, iser_dif_prot_caps(sig_caps)); 638 scsi_host_set_prot(shost, iser_dif_prot_caps(sig_caps));
638 if (iser_pi_guard) 639 scsi_host_set_guard(shost, SHOST_DIX_GUARD_IP |
639 scsi_host_set_guard(shost, SHOST_DIX_GUARD_IP); 640 SHOST_DIX_GUARD_CRC);
640 else
641 scsi_host_set_guard(shost, SHOST_DIX_GUARD_CRC);
642 } 641 }
643 642
644 if (iscsi_host_add(shost, 643 if (iscsi_host_add(shost,
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c
index d83270511079..abce9339333f 100644
--- a/drivers/infiniband/ulp/iser/iser_memory.c
+++ b/drivers/infiniband/ulp/iser/iser_memory.c
@@ -438,13 +438,13 @@ int iser_reg_rdma_mem_fmr(struct iscsi_iser_task *iser_task,
438 return 0; 438 return 0;
439} 439}
440 440
441static inline void 441static void
442iser_set_dif_domain(struct scsi_cmnd *sc, struct ib_sig_attrs *sig_attrs, 442iser_set_dif_domain(struct scsi_cmnd *sc, struct ib_sig_attrs *sig_attrs,
443 struct ib_sig_domain *domain) 443 struct ib_sig_domain *domain)
444{ 444{
445 domain->sig_type = IB_SIG_TYPE_T10_DIF; 445 domain->sig_type = IB_SIG_TYPE_T10_DIF;
446 domain->sig.dif.pi_interval = sc->device->sector_size; 446 domain->sig.dif.pi_interval = scsi_prot_interval(sc);
447 domain->sig.dif.ref_tag = scsi_get_lba(sc) & 0xffffffff; 447 domain->sig.dif.ref_tag = scsi_prot_ref_tag(sc);
448 /* 448 /*
449 * At the moment we hard code those, but in the future 449 * At the moment we hard code those, but in the future
450 * we will take them from sc. 450 * we will take them from sc.
@@ -452,8 +452,7 @@ iser_set_dif_domain(struct scsi_cmnd *sc, struct ib_sig_attrs *sig_attrs,
452 domain->sig.dif.apptag_check_mask = 0xffff; 452 domain->sig.dif.apptag_check_mask = 0xffff;
453 domain->sig.dif.app_escape = true; 453 domain->sig.dif.app_escape = true;
454 domain->sig.dif.ref_escape = true; 454 domain->sig.dif.ref_escape = true;
455 if (scsi_get_prot_type(sc) == SCSI_PROT_DIF_TYPE1 || 455 if (sc->prot_flags & SCSI_PROT_REF_INCREMENT)
456 scsi_get_prot_type(sc) == SCSI_PROT_DIF_TYPE2)
457 domain->sig.dif.ref_remap = true; 456 domain->sig.dif.ref_remap = true;
458}; 457};
459 458
@@ -471,26 +470,16 @@ iser_set_sig_attrs(struct scsi_cmnd *sc, struct ib_sig_attrs *sig_attrs)
471 case SCSI_PROT_WRITE_STRIP: 470 case SCSI_PROT_WRITE_STRIP:
472 sig_attrs->wire.sig_type = IB_SIG_TYPE_NONE; 471 sig_attrs->wire.sig_type = IB_SIG_TYPE_NONE;
473 iser_set_dif_domain(sc, sig_attrs, &sig_attrs->mem); 472 iser_set_dif_domain(sc, sig_attrs, &sig_attrs->mem);
474 /* 473 sig_attrs->mem.sig.dif.bg_type = sc->prot_flags & SCSI_PROT_IP_CHECKSUM ?
475 * At the moment we use this modparam to tell what is 474 IB_T10DIF_CSUM : IB_T10DIF_CRC;
476 * the memory bg_type, in the future we will take it
477 * from sc.
478 */
479 sig_attrs->mem.sig.dif.bg_type = iser_pi_guard ? IB_T10DIF_CSUM :
480 IB_T10DIF_CRC;
481 break; 475 break;
482 case SCSI_PROT_READ_PASS: 476 case SCSI_PROT_READ_PASS:
483 case SCSI_PROT_WRITE_PASS: 477 case SCSI_PROT_WRITE_PASS:
484 iser_set_dif_domain(sc, sig_attrs, &sig_attrs->wire); 478 iser_set_dif_domain(sc, sig_attrs, &sig_attrs->wire);
485 sig_attrs->wire.sig.dif.bg_type = IB_T10DIF_CRC; 479 sig_attrs->wire.sig.dif.bg_type = IB_T10DIF_CRC;
486 iser_set_dif_domain(sc, sig_attrs, &sig_attrs->mem); 480 iser_set_dif_domain(sc, sig_attrs, &sig_attrs->mem);
487 /* 481 sig_attrs->mem.sig.dif.bg_type = sc->prot_flags & SCSI_PROT_IP_CHECKSUM ?
488 * At the moment we use this modparam to tell what is 482 IB_T10DIF_CSUM : IB_T10DIF_CRC;
489 * the memory bg_type, in the future we will take it
490 * from sc.
491 */
492 sig_attrs->mem.sig.dif.bg_type = iser_pi_guard ? IB_T10DIF_CSUM :
493 IB_T10DIF_CRC;
494 break; 483 break;
495 default: 484 default:
496 iser_err("Unsupported PI operation %d\n", 485 iser_err("Unsupported PI operation %d\n",
@@ -501,26 +490,14 @@ iser_set_sig_attrs(struct scsi_cmnd *sc, struct ib_sig_attrs *sig_attrs)
501 return 0; 490 return 0;
502} 491}
503 492
504static int 493static inline void
505iser_set_prot_checks(struct scsi_cmnd *sc, u8 *mask) 494iser_set_prot_checks(struct scsi_cmnd *sc, u8 *mask)
506{ 495{
507 switch (scsi_get_prot_type(sc)) { 496 *mask = 0;
508 case SCSI_PROT_DIF_TYPE0: 497 if (sc->prot_flags & SCSI_PROT_REF_CHECK)
509 break; 498 *mask |= ISER_CHECK_REFTAG;
510 case SCSI_PROT_DIF_TYPE1: 499 if (sc->prot_flags & SCSI_PROT_GUARD_CHECK)
511 case SCSI_PROT_DIF_TYPE2: 500 *mask |= ISER_CHECK_GUARD;
512 *mask = ISER_CHECK_GUARD | ISER_CHECK_REFTAG;
513 break;
514 case SCSI_PROT_DIF_TYPE3:
515 *mask = ISER_CHECK_GUARD;
516 break;
517 default:
518 iser_err("Unsupported protection type %d\n",
519 scsi_get_prot_type(sc));
520 return -EINVAL;
521 }
522
523 return 0;
524} 501}
525 502
526static void 503static void
@@ -554,9 +531,7 @@ iser_reg_sig_mr(struct iscsi_iser_task *iser_task,
554 if (ret) 531 if (ret)
555 goto err; 532 goto err;
556 533
557 ret = iser_set_prot_checks(iser_task->sc, &sig_attrs.check_mask); 534 iser_set_prot_checks(iser_task->sc, &sig_attrs.check_mask);
558 if (ret)
559 goto err;
560 535
561 if (!(desc->reg_indicators & ISER_SIG_KEY_VALID)) { 536 if (!(desc->reg_indicators & ISER_SIG_KEY_VALID)) {
562 iser_inv_rkey(&inv_wr, pi_ctx->sig_mr); 537 iser_inv_rkey(&inv_wr, pi_ctx->sig_mr);
@@ -590,12 +565,7 @@ iser_reg_sig_mr(struct iscsi_iser_task *iser_task,
590 565
591 sig_sge->lkey = pi_ctx->sig_mr->lkey; 566 sig_sge->lkey = pi_ctx->sig_mr->lkey;
592 sig_sge->addr = 0; 567 sig_sge->addr = 0;
593 sig_sge->length = data_sge->length + prot_sge->length; 568 sig_sge->length = scsi_transfer_length(iser_task->sc);
594 if (scsi_get_prot_op(iser_task->sc) == SCSI_PROT_WRITE_INSERT ||
595 scsi_get_prot_op(iser_task->sc) == SCSI_PROT_READ_STRIP) {
596 sig_sge->length += (data_sge->length /
597 iser_task->sc->device->sector_size) * 8;
598 }
599 569
600 iser_dbg("sig_sge: addr: 0x%llx length: %u lkey: 0x%x\n", 570 iser_dbg("sig_sge: addr: 0x%llx length: %u lkey: 0x%x\n",
601 sig_sge->addr, sig_sge->length, 571 sig_sge->addr, sig_sge->length,