aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/ulp/iser/iscsi_iser.h5
-rw-r--r--drivers/infiniband/ulp/iser/iser_memory.c50
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);
644void iser_free_fastreg_pool(struct ib_conn *ib_conn); 644void iser_free_fastreg_pool(struct ib_conn *ib_conn);
645u8 iser_check_task_pi_status(struct iscsi_iser_task *iser_task, 645u8 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);
647struct fast_reg_descriptor *
648iser_reg_desc_get(struct ib_conn *ib_conn);
649void
650iser_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
44struct fast_reg_descriptor *
45iser_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
59void
60iser_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;
801err_reg: 818err_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}