diff options
| -rw-r--r-- | drivers/infiniband/ulp/iser/iscsi_iser.h | 5 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/iser/iser_memory.c | 50 |
2 files changed, 37 insertions, 18 deletions
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h index 8133678b6218..185d2ec0e3d8 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.h +++ b/drivers/infiniband/ulp/iser/iscsi_iser.h | |||
| @@ -644,4 +644,9 @@ int iser_create_fastreg_pool(struct ib_conn *ib_conn, unsigned cmds_max); | |||
| 644 | void iser_free_fastreg_pool(struct ib_conn *ib_conn); | 644 | void iser_free_fastreg_pool(struct ib_conn *ib_conn); |
| 645 | u8 iser_check_task_pi_status(struct iscsi_iser_task *iser_task, | 645 | u8 iser_check_task_pi_status(struct iscsi_iser_task *iser_task, |
| 646 | enum iser_data_dir cmd_dir, sector_t *sector); | 646 | enum iser_data_dir cmd_dir, sector_t *sector); |
| 647 | struct fast_reg_descriptor * | ||
| 648 | iser_reg_desc_get(struct ib_conn *ib_conn); | ||
| 649 | void | ||
| 650 | iser_reg_desc_put(struct ib_conn *ib_conn, | ||
| 651 | struct fast_reg_descriptor *desc); | ||
| 647 | #endif | 652 | #endif |
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c index 6e6b75319bf9..17a5d70dcc8a 100644 --- a/drivers/infiniband/ulp/iser/iser_memory.c +++ b/drivers/infiniband/ulp/iser/iser_memory.c | |||
| @@ -41,6 +41,32 @@ | |||
| 41 | 41 | ||
| 42 | #define ISER_KMALLOC_THRESHOLD 0x20000 /* 128K - kmalloc limit */ | 42 | #define ISER_KMALLOC_THRESHOLD 0x20000 /* 128K - kmalloc limit */ |
| 43 | 43 | ||
| 44 | struct fast_reg_descriptor * | ||
| 45 | iser_reg_desc_get(struct ib_conn *ib_conn) | ||
| 46 | { | ||
| 47 | struct fast_reg_descriptor *desc; | ||
| 48 | unsigned long flags; | ||
| 49 | |||
| 50 | spin_lock_irqsave(&ib_conn->lock, flags); | ||
| 51 | desc = list_first_entry(&ib_conn->fastreg.pool, | ||
| 52 | struct fast_reg_descriptor, list); | ||
| 53 | list_del(&desc->list); | ||
| 54 | spin_unlock_irqrestore(&ib_conn->lock, flags); | ||
| 55 | |||
| 56 | return desc; | ||
| 57 | } | ||
| 58 | |||
| 59 | void | ||
| 60 | iser_reg_desc_put(struct ib_conn *ib_conn, | ||
| 61 | struct fast_reg_descriptor *desc) | ||
| 62 | { | ||
| 63 | unsigned long flags; | ||
| 64 | |||
| 65 | spin_lock_irqsave(&ib_conn->lock, flags); | ||
| 66 | list_add_tail(&desc->list, &ib_conn->fastreg.pool); | ||
| 67 | spin_unlock_irqrestore(&ib_conn->lock, flags); | ||
| 68 | } | ||
| 69 | |||
| 44 | /** | 70 | /** |
| 45 | * iser_start_rdma_unaligned_sg | 71 | * iser_start_rdma_unaligned_sg |
| 46 | */ | 72 | */ |
| @@ -409,17 +435,13 @@ void iser_unreg_mem_fastreg(struct iscsi_iser_task *iser_task, | |||
| 409 | enum iser_data_dir cmd_dir) | 435 | enum iser_data_dir cmd_dir) |
| 410 | { | 436 | { |
| 411 | struct iser_mem_reg *reg = &iser_task->rdma_reg[cmd_dir]; | 437 | struct iser_mem_reg *reg = &iser_task->rdma_reg[cmd_dir]; |
| 412 | struct iser_conn *iser_conn = iser_task->iser_conn; | ||
| 413 | struct ib_conn *ib_conn = &iser_conn->ib_conn; | ||
| 414 | struct fast_reg_descriptor *desc = reg->mem_h; | ||
| 415 | 438 | ||
| 416 | if (!desc) | 439 | if (!reg->mem_h) |
| 417 | return; | 440 | return; |
| 418 | 441 | ||
| 442 | iser_reg_desc_put(&iser_task->iser_conn->ib_conn, | ||
| 443 | reg->mem_h); | ||
| 419 | reg->mem_h = NULL; | 444 | reg->mem_h = NULL; |
| 420 | spin_lock_bh(&ib_conn->lock); | ||
| 421 | list_add_tail(&desc->list, &ib_conn->fastreg.pool); | ||
| 422 | spin_unlock_bh(&ib_conn->lock); | ||
| 423 | } | 445 | } |
| 424 | 446 | ||
| 425 | /** | 447 | /** |
| @@ -725,7 +747,6 @@ int iser_reg_rdma_mem_fastreg(struct iscsi_iser_task *iser_task, | |||
| 725 | struct fast_reg_descriptor *desc = NULL; | 747 | struct fast_reg_descriptor *desc = NULL; |
| 726 | struct ib_sge data_sge; | 748 | struct ib_sge data_sge; |
| 727 | int err, aligned_len; | 749 | int err, aligned_len; |
| 728 | unsigned long flags; | ||
| 729 | 750 | ||
| 730 | aligned_len = iser_data_buf_aligned_len(mem, ibdev); | 751 | aligned_len = iser_data_buf_aligned_len(mem, ibdev); |
| 731 | if (aligned_len != mem->dma_nents) { | 752 | if (aligned_len != mem->dma_nents) { |
| @@ -739,11 +760,7 @@ int iser_reg_rdma_mem_fastreg(struct iscsi_iser_task *iser_task, | |||
| 739 | 760 | ||
| 740 | if (mem->dma_nents != 1 || | 761 | if (mem->dma_nents != 1 || |
| 741 | scsi_get_prot_op(iser_task->sc) != SCSI_PROT_NORMAL) { | 762 | scsi_get_prot_op(iser_task->sc) != SCSI_PROT_NORMAL) { |
| 742 | spin_lock_irqsave(&ib_conn->lock, flags); | 763 | desc = iser_reg_desc_get(ib_conn); |
| 743 | desc = list_first_entry(&ib_conn->fastreg.pool, | ||
| 744 | struct fast_reg_descriptor, list); | ||
| 745 | list_del(&desc->list); | ||
| 746 | spin_unlock_irqrestore(&ib_conn->lock, flags); | ||
| 747 | mem_reg->mem_h = desc; | 764 | mem_reg->mem_h = desc; |
| 748 | } | 765 | } |
| 749 | 766 | ||
| @@ -799,11 +816,8 @@ int iser_reg_rdma_mem_fastreg(struct iscsi_iser_task *iser_task, | |||
| 799 | 816 | ||
| 800 | return 0; | 817 | return 0; |
| 801 | err_reg: | 818 | err_reg: |
| 802 | if (desc) { | 819 | if (desc) |
| 803 | spin_lock_irqsave(&ib_conn->lock, flags); | 820 | iser_reg_desc_put(ib_conn, desc); |
| 804 | list_add_tail(&desc->list, &ib_conn->fastreg.pool); | ||
| 805 | spin_unlock_irqrestore(&ib_conn->lock, flags); | ||
| 806 | } | ||
| 807 | 821 | ||
| 808 | return err; | 822 | return err; |
| 809 | } | 823 | } |
