mirror of https://gitee.com/openkylin/linux.git
IB/iser: Move fastreg descriptor pool get/put to helper functions
Instead of open-coding connection fastreg pool get/put, we introduce iser_reg_desc[get|put] helpers. We aren't setting these static as this will be a per-device routine later on. Also, cleanup iser_unreg_rdma_mem_fastreg a bit. This patch does not change any functionality. Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Adir Lev <adirl@mellanox.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
f0e35c27a5
commit
bd8b944eee
|
@ -644,4 +644,9 @@ int iser_create_fastreg_pool(struct ib_conn *ib_conn, unsigned cmds_max);
|
||||||
void iser_free_fastreg_pool(struct ib_conn *ib_conn);
|
void iser_free_fastreg_pool(struct ib_conn *ib_conn);
|
||||||
u8 iser_check_task_pi_status(struct iscsi_iser_task *iser_task,
|
u8 iser_check_task_pi_status(struct iscsi_iser_task *iser_task,
|
||||||
enum iser_data_dir cmd_dir, sector_t *sector);
|
enum iser_data_dir cmd_dir, sector_t *sector);
|
||||||
|
struct fast_reg_descriptor *
|
||||||
|
iser_reg_desc_get(struct ib_conn *ib_conn);
|
||||||
|
void
|
||||||
|
iser_reg_desc_put(struct ib_conn *ib_conn,
|
||||||
|
struct fast_reg_descriptor *desc);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -41,6 +41,32 @@
|
||||||
|
|
||||||
#define ISER_KMALLOC_THRESHOLD 0x20000 /* 128K - kmalloc limit */
|
#define ISER_KMALLOC_THRESHOLD 0x20000 /* 128K - kmalloc limit */
|
||||||
|
|
||||||
|
struct fast_reg_descriptor *
|
||||||
|
iser_reg_desc_get(struct ib_conn *ib_conn)
|
||||||
|
{
|
||||||
|
struct fast_reg_descriptor *desc;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&ib_conn->lock, flags);
|
||||||
|
desc = list_first_entry(&ib_conn->fastreg.pool,
|
||||||
|
struct fast_reg_descriptor, list);
|
||||||
|
list_del(&desc->list);
|
||||||
|
spin_unlock_irqrestore(&ib_conn->lock, flags);
|
||||||
|
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
iser_reg_desc_put(struct ib_conn *ib_conn,
|
||||||
|
struct fast_reg_descriptor *desc)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&ib_conn->lock, flags);
|
||||||
|
list_add_tail(&desc->list, &ib_conn->fastreg.pool);
|
||||||
|
spin_unlock_irqrestore(&ib_conn->lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* iser_start_rdma_unaligned_sg
|
* iser_start_rdma_unaligned_sg
|
||||||
*/
|
*/
|
||||||
|
@ -409,17 +435,13 @@ void iser_unreg_mem_fastreg(struct iscsi_iser_task *iser_task,
|
||||||
enum iser_data_dir cmd_dir)
|
enum iser_data_dir cmd_dir)
|
||||||
{
|
{
|
||||||
struct iser_mem_reg *reg = &iser_task->rdma_reg[cmd_dir];
|
struct iser_mem_reg *reg = &iser_task->rdma_reg[cmd_dir];
|
||||||
struct iser_conn *iser_conn = iser_task->iser_conn;
|
|
||||||
struct ib_conn *ib_conn = &iser_conn->ib_conn;
|
|
||||||
struct fast_reg_descriptor *desc = reg->mem_h;
|
|
||||||
|
|
||||||
if (!desc)
|
if (!reg->mem_h)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
iser_reg_desc_put(&iser_task->iser_conn->ib_conn,
|
||||||
|
reg->mem_h);
|
||||||
reg->mem_h = NULL;
|
reg->mem_h = NULL;
|
||||||
spin_lock_bh(&ib_conn->lock);
|
|
||||||
list_add_tail(&desc->list, &ib_conn->fastreg.pool);
|
|
||||||
spin_unlock_bh(&ib_conn->lock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -725,7 +747,6 @@ int iser_reg_rdma_mem_fastreg(struct iscsi_iser_task *iser_task,
|
||||||
struct fast_reg_descriptor *desc = NULL;
|
struct fast_reg_descriptor *desc = NULL;
|
||||||
struct ib_sge data_sge;
|
struct ib_sge data_sge;
|
||||||
int err, aligned_len;
|
int err, aligned_len;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
aligned_len = iser_data_buf_aligned_len(mem, ibdev);
|
aligned_len = iser_data_buf_aligned_len(mem, ibdev);
|
||||||
if (aligned_len != mem->dma_nents) {
|
if (aligned_len != mem->dma_nents) {
|
||||||
|
@ -739,11 +760,7 @@ int iser_reg_rdma_mem_fastreg(struct iscsi_iser_task *iser_task,
|
||||||
|
|
||||||
if (mem->dma_nents != 1 ||
|
if (mem->dma_nents != 1 ||
|
||||||
scsi_get_prot_op(iser_task->sc) != SCSI_PROT_NORMAL) {
|
scsi_get_prot_op(iser_task->sc) != SCSI_PROT_NORMAL) {
|
||||||
spin_lock_irqsave(&ib_conn->lock, flags);
|
desc = iser_reg_desc_get(ib_conn);
|
||||||
desc = list_first_entry(&ib_conn->fastreg.pool,
|
|
||||||
struct fast_reg_descriptor, list);
|
|
||||||
list_del(&desc->list);
|
|
||||||
spin_unlock_irqrestore(&ib_conn->lock, flags);
|
|
||||||
mem_reg->mem_h = desc;
|
mem_reg->mem_h = desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -799,11 +816,8 @@ int iser_reg_rdma_mem_fastreg(struct iscsi_iser_task *iser_task,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
err_reg:
|
err_reg:
|
||||||
if (desc) {
|
if (desc)
|
||||||
spin_lock_irqsave(&ib_conn->lock, flags);
|
iser_reg_desc_put(ib_conn, desc);
|
||||||
list_add_tail(&desc->list, &ib_conn->fastreg.pool);
|
|
||||||
spin_unlock_irqrestore(&ib_conn->lock, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue