Commit cbbbce1d authored by Tejun Heo's avatar Tejun Heo Committed by Linus Torvalds

IB/ehca: convert to idr_alloc()

Convert to the much saner new idr interface.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
Cc: Christoph Raisch <raisch@de.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e8d4dd60
...@@ -128,7 +128,7 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector, ...@@ -128,7 +128,7 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector,
void *vpage; void *vpage;
u32 counter; u32 counter;
u64 rpage, cqx_fec, h_ret; u64 rpage, cqx_fec, h_ret;
int ipz_rc, ret, i; int ipz_rc, i;
unsigned long flags; unsigned long flags;
if (cqe >= 0xFFFFFFFF - 64 - additional_cqe) if (cqe >= 0xFFFFFFFF - 64 - additional_cqe)
...@@ -163,32 +163,19 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector, ...@@ -163,32 +163,19 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector,
adapter_handle = shca->ipz_hca_handle; adapter_handle = shca->ipz_hca_handle;
param.eq_handle = shca->eq.ipz_eq_handle; param.eq_handle = shca->eq.ipz_eq_handle;
do { idr_preload(GFP_KERNEL);
if (!idr_pre_get(&ehca_cq_idr, GFP_KERNEL)) { write_lock_irqsave(&ehca_cq_idr_lock, flags);
cq = ERR_PTR(-ENOMEM); my_cq->token = idr_alloc(&ehca_cq_idr, my_cq, 0, 0x2000000, GFP_NOWAIT);
ehca_err(device, "Can't reserve idr nr. device=%p", write_unlock_irqrestore(&ehca_cq_idr_lock, flags);
device); idr_preload_end();
goto create_cq_exit1;
}
write_lock_irqsave(&ehca_cq_idr_lock, flags);
ret = idr_get_new(&ehca_cq_idr, my_cq, &my_cq->token);
write_unlock_irqrestore(&ehca_cq_idr_lock, flags);
} while (ret == -EAGAIN);
if (ret) { if (my_cq->token < 0) {
cq = ERR_PTR(-ENOMEM); cq = ERR_PTR(-ENOMEM);
ehca_err(device, "Can't allocate new idr entry. device=%p", ehca_err(device, "Can't allocate new idr entry. device=%p",
device); device);
goto create_cq_exit1; goto create_cq_exit1;
} }
if (my_cq->token > 0x1FFFFFF) {
cq = ERR_PTR(-ENOMEM);
ehca_err(device, "Invalid number of cq. device=%p", device);
goto create_cq_exit2;
}
/* /*
* CQs maximum depth is 4GB-64, but we need additional 20 as buffer * CQs maximum depth is 4GB-64, but we need additional 20 as buffer
* for receiving errors CQEs. * for receiving errors CQEs.
......
...@@ -636,30 +636,26 @@ static struct ehca_qp *internal_create_qp( ...@@ -636,30 +636,26 @@ static struct ehca_qp *internal_create_qp(
my_qp->send_cq = my_qp->send_cq =
container_of(init_attr->send_cq, struct ehca_cq, ib_cq); container_of(init_attr->send_cq, struct ehca_cq, ib_cq);
do { idr_preload(GFP_KERNEL);
if (!idr_pre_get(&ehca_qp_idr, GFP_KERNEL)) { write_lock_irqsave(&ehca_qp_idr_lock, flags);
ret = -ENOMEM;
ehca_err(pd->device, "Can't reserve idr resources.");
goto create_qp_exit0;
}
write_lock_irqsave(&ehca_qp_idr_lock, flags); ret = idr_alloc(&ehca_qp_idr, my_qp, 0, 0x2000000, GFP_NOWAIT);
ret = idr_get_new(&ehca_qp_idr, my_qp, &my_qp->token); if (ret >= 0)
write_unlock_irqrestore(&ehca_qp_idr_lock, flags); my_qp->token = ret;
} while (ret == -EAGAIN);
if (ret) { write_unlock_irqrestore(&ehca_qp_idr_lock, flags);
ret = -ENOMEM; idr_preload_end();
ehca_err(pd->device, "Can't allocate new idr entry."); if (ret < 0) {
if (ret == -ENOSPC) {
ret = -EINVAL;
ehca_err(pd->device, "Invalid number of qp");
} else {
ret = -ENOMEM;
ehca_err(pd->device, "Can't allocate new idr entry.");
}
goto create_qp_exit0; goto create_qp_exit0;
} }
if (my_qp->token > 0x1FFFFFF) {
ret = -EINVAL;
ehca_err(pd->device, "Invalid number of qp");
goto create_qp_exit1;
}
if (has_srq) if (has_srq)
parms.srq_token = my_qp->token; parms.srq_token = my_qp->token;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment