diff options
author | Roland Dreier <rolandd@cisco.com> | 2006-06-17 23:37:40 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2006-06-17 23:37:40 -0400 |
commit | 3463175d6ee55fdbd5cda2a03415e2068599b2b7 (patch) | |
tree | f629b7c65894d591d861bb121a71f67d0b960f36 | |
parent | 92b1582268e269b3a9e54e186e740396f0f2012b (diff) |
IB/uverbs: Factor out common idr code
Factor out common code for adding a userspace object to an idr into a
function idr_add_uobj(). This shrinks both the source and object code:
add/remove: 1/0 grow/shrink: 0/6 up/down: 57/-220 (-163)
function old new delta
idr_add_uobj - 57 +57
ib_uverbs_create_ah 543 512 -31
ib_uverbs_create_srq 662 630 -32
ib_uverbs_reg_mr 737 699 -38
ib_uverbs_create_cq 639 600 -39
ib_uverbs_alloc_pd 485 446 -39
ib_uverbs_create_qp 1020 979 -41
Signed-off-by: Roland Dreier <rolandd@cisco.com>
-rw-r--r-- | drivers/infiniband/core/uverbs_cmd.c | 82 |
1 files changed, 22 insertions, 60 deletions
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index 37824f68e377..403dd811ec7f 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c | |||
@@ -50,6 +50,22 @@ | |||
50 | (udata)->outlen = (olen); \ | 50 | (udata)->outlen = (olen); \ |
51 | } while (0) | 51 | } while (0) |
52 | 52 | ||
53 | static int idr_add_uobj(struct idr *idr, void *obj, struct ib_uobject *uobj) | ||
54 | { | ||
55 | int ret; | ||
56 | |||
57 | retry: | ||
58 | if (!idr_pre_get(idr, GFP_KERNEL)) | ||
59 | return -ENOMEM; | ||
60 | |||
61 | ret = idr_get_new(idr, uobj, &uobj->id); | ||
62 | |||
63 | if (ret == -EAGAIN) | ||
64 | goto retry; | ||
65 | |||
66 | return ret; | ||
67 | } | ||
68 | |||
53 | ssize_t ib_uverbs_get_context(struct ib_uverbs_file *file, | 69 | ssize_t ib_uverbs_get_context(struct ib_uverbs_file *file, |
54 | const char __user *buf, | 70 | const char __user *buf, |
55 | int in_len, int out_len) | 71 | int in_len, int out_len) |
@@ -295,16 +311,7 @@ ssize_t ib_uverbs_alloc_pd(struct ib_uverbs_file *file, | |||
295 | 311 | ||
296 | mutex_lock(&ib_uverbs_idr_mutex); | 312 | mutex_lock(&ib_uverbs_idr_mutex); |
297 | 313 | ||
298 | retry: | 314 | ret = idr_add_uobj(&ib_uverbs_pd_idr, pd, uobj); |
299 | if (!idr_pre_get(&ib_uverbs_pd_idr, GFP_KERNEL)) { | ||
300 | ret = -ENOMEM; | ||
301 | goto err_up; | ||
302 | } | ||
303 | |||
304 | ret = idr_get_new(&ib_uverbs_pd_idr, pd, &uobj->id); | ||
305 | |||
306 | if (ret == -EAGAIN) | ||
307 | goto retry; | ||
308 | if (ret) | 315 | if (ret) |
309 | goto err_up; | 316 | goto err_up; |
310 | 317 | ||
@@ -458,16 +465,7 @@ ssize_t ib_uverbs_reg_mr(struct ib_uverbs_file *file, | |||
458 | resp.lkey = mr->lkey; | 465 | resp.lkey = mr->lkey; |
459 | resp.rkey = mr->rkey; | 466 | resp.rkey = mr->rkey; |
460 | 467 | ||
461 | retry: | 468 | ret = idr_add_uobj(&ib_uverbs_mr_idr, mr, &obj->uobject); |
462 | if (!idr_pre_get(&ib_uverbs_mr_idr, GFP_KERNEL)) { | ||
463 | ret = -ENOMEM; | ||
464 | goto err_unreg; | ||
465 | } | ||
466 | |||
467 | ret = idr_get_new(&ib_uverbs_mr_idr, mr, &obj->uobject.id); | ||
468 | |||
469 | if (ret == -EAGAIN) | ||
470 | goto retry; | ||
471 | if (ret) | 469 | if (ret) |
472 | goto err_unreg; | 470 | goto err_unreg; |
473 | 471 | ||
@@ -632,16 +630,7 @@ ssize_t ib_uverbs_create_cq(struct ib_uverbs_file *file, | |||
632 | 630 | ||
633 | mutex_lock(&ib_uverbs_idr_mutex); | 631 | mutex_lock(&ib_uverbs_idr_mutex); |
634 | 632 | ||
635 | retry: | 633 | ret = idr_add_uobj(&ib_uverbs_cq_idr, cq, &uobj->uobject); |
636 | if (!idr_pre_get(&ib_uverbs_cq_idr, GFP_KERNEL)) { | ||
637 | ret = -ENOMEM; | ||
638 | goto err_up; | ||
639 | } | ||
640 | |||
641 | ret = idr_get_new(&ib_uverbs_cq_idr, cq, &uobj->uobject.id); | ||
642 | |||
643 | if (ret == -EAGAIN) | ||
644 | goto retry; | ||
645 | if (ret) | 634 | if (ret) |
646 | goto err_up; | 635 | goto err_up; |
647 | 636 | ||
@@ -946,16 +935,7 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file, | |||
946 | memset(&resp, 0, sizeof resp); | 935 | memset(&resp, 0, sizeof resp); |
947 | resp.qpn = qp->qp_num; | 936 | resp.qpn = qp->qp_num; |
948 | 937 | ||
949 | retry: | 938 | ret = idr_add_uobj(&ib_uverbs_qp_idr, qp, &uobj->uevent.uobject); |
950 | if (!idr_pre_get(&ib_uverbs_qp_idr, GFP_KERNEL)) { | ||
951 | ret = -ENOMEM; | ||
952 | goto err_destroy; | ||
953 | } | ||
954 | |||
955 | ret = idr_get_new(&ib_uverbs_qp_idr, qp, &uobj->uevent.uobject.id); | ||
956 | |||
957 | if (ret == -EAGAIN) | ||
958 | goto retry; | ||
959 | if (ret) | 939 | if (ret) |
960 | goto err_destroy; | 940 | goto err_destroy; |
961 | 941 | ||
@@ -1614,16 +1594,7 @@ ssize_t ib_uverbs_create_ah(struct ib_uverbs_file *file, | |||
1614 | 1594 | ||
1615 | ah->uobject = uobj; | 1595 | ah->uobject = uobj; |
1616 | 1596 | ||
1617 | retry: | 1597 | ret = idr_add_uobj(&ib_uverbs_ah_idr, ah, uobj); |
1618 | if (!idr_pre_get(&ib_uverbs_ah_idr, GFP_KERNEL)) { | ||
1619 | ret = -ENOMEM; | ||
1620 | goto err_destroy; | ||
1621 | } | ||
1622 | |||
1623 | ret = idr_get_new(&ib_uverbs_ah_idr, ah, &uobj->id); | ||
1624 | |||
1625 | if (ret == -EAGAIN) | ||
1626 | goto retry; | ||
1627 | if (ret) | 1598 | if (ret) |
1628 | goto err_destroy; | 1599 | goto err_destroy; |
1629 | 1600 | ||
@@ -1846,16 +1817,7 @@ ssize_t ib_uverbs_create_srq(struct ib_uverbs_file *file, | |||
1846 | 1817 | ||
1847 | memset(&resp, 0, sizeof resp); | 1818 | memset(&resp, 0, sizeof resp); |
1848 | 1819 | ||
1849 | retry: | 1820 | ret = idr_add_uobj(&ib_uverbs_srq_idr, srq, &uobj->uobject); |
1850 | if (!idr_pre_get(&ib_uverbs_srq_idr, GFP_KERNEL)) { | ||
1851 | ret = -ENOMEM; | ||
1852 | goto err_destroy; | ||
1853 | } | ||
1854 | |||
1855 | ret = idr_get_new(&ib_uverbs_srq_idr, srq, &uobj->uobject.id); | ||
1856 | |||
1857 | if (ret == -EAGAIN) | ||
1858 | goto retry; | ||
1859 | if (ret) | 1821 | if (ret) |
1860 | goto err_destroy; | 1822 | goto err_destroy; |
1861 | 1823 | ||