diff options
author | Sagi Grimberg <sagig@mellanox.com> | 2014-12-07 09:10:06 -0500 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2014-12-15 21:11:46 -0500 |
commit | 5bb6e543d2a7d580ca56317fa38b394ab02638b4 (patch) | |
tree | d7a87ff23ab5979dd73fa6c49315f3d94343198d | |
parent | 06c7fb6776ddb0ece4bcee8061eeda4ed4a771dc (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.c | 21 | ||||
-rw-r--r-- | drivers/infiniband/ulp/iser/iser_memory.c | 62 |
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); | |||
97 | MODULE_PARM_DESC(pi_enable, "Enable T10-PI offload support (default:disabled)"); | 97 | MODULE_PARM_DESC(pi_enable, "Enable T10-PI offload support (default:disabled)"); |
98 | 98 | ||
99 | module_param_named(pi_guard, iser_pi_guard, int, 0644); | 99 | module_param_named(pi_guard, iser_pi_guard, int, 0644); |
100 | MODULE_PARM_DESC(pi_guard, "T10-PI guard_type, 0:CRC|1:IP_CSUM (default:IP_CSUM)"); | 100 | MODULE_PARM_DESC(pi_guard, "T10-PI guard_type [deprecated]"); |
101 | 101 | ||
102 | static struct workqueue_struct *release_wq; | 102 | static struct workqueue_struct *release_wq; |
103 | struct iser_global ig; | 103 | struct iser_global ig; |
@@ -574,12 +574,13 @@ iscsi_iser_session_destroy(struct iscsi_cls_session *cls_session) | |||
574 | static inline unsigned int | 574 | static inline unsigned int |
575 | iser_dif_prot_caps(int prot_caps) | 575 | iser_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 | ||
441 | static inline void | 441 | static void |
442 | iser_set_dif_domain(struct scsi_cmnd *sc, struct ib_sig_attrs *sig_attrs, | 442 | iser_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 | ||
504 | static int | 493 | static inline void |
505 | iser_set_prot_checks(struct scsi_cmnd *sc, u8 *mask) | 494 | iser_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 | ||
526 | static void | 503 | static 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, |