]> git.karo-electronics.de Git - linux-beck.git/commitdiff
IB/ehca: convert to idr_alloc()
authorTejun Heo <tj@kernel.org>
Thu, 28 Feb 2013 01:04:21 +0000 (17:04 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 28 Feb 2013 03:10:16 +0000 (19:10 -0800)
Convert to the much saner new idr interface.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
Cc: Christoph Raisch <raisch@de.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/infiniband/hw/ehca/ehca_cq.c
drivers/infiniband/hw/ehca/ehca_qp.c

index 8f5290147e8a8d1fbeb5399f230a900c6e023c97..212150c25ea08ade17d2713b882db69bb502ca03 100644 (file)
@@ -128,7 +128,7 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector,
        void *vpage;
        u32 counter;
        u64 rpage, cqx_fec, h_ret;
-       int ipz_rc, ret, i;
+       int ipz_rc, i;
        unsigned long flags;
 
        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,
        adapter_handle = shca->ipz_hca_handle;
        param.eq_handle = shca->eq.ipz_eq_handle;
 
-       do {
-               if (!idr_pre_get(&ehca_cq_idr, GFP_KERNEL)) {
-                       cq = ERR_PTR(-ENOMEM);
-                       ehca_err(device, "Can't reserve idr nr. device=%p",
-                                device);
-                       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);
+       idr_preload(GFP_KERNEL);
+       write_lock_irqsave(&ehca_cq_idr_lock, flags);
+       my_cq->token = idr_alloc(&ehca_cq_idr, my_cq, 0, 0x2000000, GFP_NOWAIT);
+       write_unlock_irqrestore(&ehca_cq_idr_lock, flags);
+       idr_preload_end();
 
-       if (ret) {
+       if (my_cq->token < 0) {
                cq = ERR_PTR(-ENOMEM);
                ehca_err(device, "Can't allocate new idr entry. device=%p",
                         device);
                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
         * for receiving errors CQEs.
index 149393915ae5aa700891ed8422e36fd57b15a16e..00d6861a6a184bac2a634633d00e59f64c7d9905 100644 (file)
@@ -636,30 +636,26 @@ static struct ehca_qp *internal_create_qp(
                my_qp->send_cq =
                        container_of(init_attr->send_cq, struct ehca_cq, ib_cq);
 
-       do {
-               if (!idr_pre_get(&ehca_qp_idr, GFP_KERNEL)) {
-                       ret = -ENOMEM;
-                       ehca_err(pd->device, "Can't reserve idr resources.");
-                       goto create_qp_exit0;
-               }
+       idr_preload(GFP_KERNEL);
+       write_lock_irqsave(&ehca_qp_idr_lock, flags);
 
-               write_lock_irqsave(&ehca_qp_idr_lock, flags);
-               ret = idr_get_new(&ehca_qp_idr, my_qp, &my_qp->token);
-               write_unlock_irqrestore(&ehca_qp_idr_lock, flags);
-       } while (ret == -EAGAIN);
+       ret = idr_alloc(&ehca_qp_idr, my_qp, 0, 0x2000000, GFP_NOWAIT);
+       if (ret >= 0)
+               my_qp->token = ret;
 
-       if (ret) {
-               ret = -ENOMEM;
-               ehca_err(pd->device, "Can't allocate new idr entry.");
+       write_unlock_irqrestore(&ehca_qp_idr_lock, flags);
+       idr_preload_end();
+       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;
        }
 
-       if (my_qp->token > 0x1FFFFFF) {
-               ret = -EINVAL;
-               ehca_err(pd->device, "Invalid number of qp");
-               goto create_qp_exit1;
-       }
-
        if (has_srq)
                parms.srq_token = my_qp->token;