Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+22 -60
+22 -60
drivers/infiniband/core/uverbs_cmd.c
··· 50 50 (udata)->outlen = (olen); \ 51 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 69 ssize_t ib_uverbs_get_context(struct ib_uverbs_file *file, 54 70 const char __user *buf, 55 71 int in_len, int out_len) ··· 311 295 312 296 mutex_lock(&ib_uverbs_idr_mutex); 313 297 314 - retry: 315 - if (!idr_pre_get(&ib_uverbs_pd_idr, GFP_KERNEL)) { 316 - ret = -ENOMEM; 317 - goto err_up; 318 - } 319 - 320 - ret = idr_get_new(&ib_uverbs_pd_idr, pd, &uobj->id); 321 - 322 - if (ret == -EAGAIN) 323 - goto retry; 298 + ret = idr_add_uobj(&ib_uverbs_pd_idr, pd, uobj); 324 299 if (ret) 325 300 goto err_up; 326 301 ··· 465 458 resp.lkey = mr->lkey; 466 459 resp.rkey = mr->rkey; 467 460 468 - retry: 469 - if (!idr_pre_get(&ib_uverbs_mr_idr, GFP_KERNEL)) { 470 - ret = -ENOMEM; 471 - goto err_unreg; 472 - } 473 - 474 - ret = idr_get_new(&ib_uverbs_mr_idr, mr, &obj->uobject.id); 475 - 476 - if (ret == -EAGAIN) 477 - goto retry; 461 + ret = idr_add_uobj(&ib_uverbs_mr_idr, mr, &obj->uobject); 478 462 if (ret) 479 463 goto err_unreg; 480 464 ··· 630 632 631 633 mutex_lock(&ib_uverbs_idr_mutex); 632 634 633 - retry: 634 - if (!idr_pre_get(&ib_uverbs_cq_idr, GFP_KERNEL)) { 635 - ret = -ENOMEM; 636 - goto err_up; 637 - } 638 - 639 - ret = idr_get_new(&ib_uverbs_cq_idr, cq, &uobj->uobject.id); 640 - 641 - if (ret == -EAGAIN) 642 - goto retry; 635 + ret = idr_add_uobj(&ib_uverbs_cq_idr, cq, &uobj->uobject); 643 636 if (ret) 644 637 goto err_up; 645 638 ··· 935 946 memset(&resp, 0, sizeof resp); 936 947 resp.qpn = qp->qp_num; 937 948 938 - retry: 939 - if (!idr_pre_get(&ib_uverbs_qp_idr, GFP_KERNEL)) { 940 - ret = -ENOMEM; 941 - goto err_destroy; 942 - } 943 - 944 - ret = idr_get_new(&ib_uverbs_qp_idr, qp, &uobj->uevent.uobject.id); 945 - 946 - if (ret == -EAGAIN) 947 - goto retry; 949 + ret = idr_add_uobj(&ib_uverbs_qp_idr, qp, &uobj->uevent.uobject); 948 950 if (ret) 949 951 goto err_destroy; 950 952 ··· 1594 1614 1595 1615 ah->uobject = uobj; 1596 1616 1597 - retry: 1598 - if (!idr_pre_get(&ib_uverbs_ah_idr, GFP_KERNEL)) { 1599 - ret = -ENOMEM; 1600 - goto err_destroy; 1601 - } 1602 - 1603 - ret = idr_get_new(&ib_uverbs_ah_idr, ah, &uobj->id); 1604 - 1605 - if (ret == -EAGAIN) 1606 - goto retry; 1617 + ret = idr_add_uobj(&ib_uverbs_ah_idr, ah, uobj); 1607 1618 if (ret) 1608 1619 goto err_destroy; 1609 1620 ··· 1817 1846 1818 1847 memset(&resp, 0, sizeof resp); 1819 1848 1820 - retry: 1821 - if (!idr_pre_get(&ib_uverbs_srq_idr, GFP_KERNEL)) { 1822 - ret = -ENOMEM; 1823 - goto err_destroy; 1824 - } 1825 - 1826 - ret = idr_get_new(&ib_uverbs_srq_idr, srq, &uobj->uobject.id); 1827 - 1828 - if (ret == -EAGAIN) 1829 - goto retry; 1849 + ret = idr_add_uobj(&ib_uverbs_srq_idr, srq, &uobj->uobject); 1830 1850 if (ret) 1831 1851 goto err_destroy; 1832 1852