Whamcloud - gitweb
LU-12152 lnet: Cleanup lnet_get_rtr_pool_cfg 91/34591/5
authorChris Horn <hornc@cray.com>
Thu, 4 Apr 2019 02:40:58 +0000 (21:40 -0500)
committerOleg Drokin <green@whamcloud.com>
Tue, 30 Apr 2019 03:35:32 +0000 (03:35 +0000)
The cfs_percpt_for_each loop contains an off-by-one error that causes
memory corruption. In addition, the way these loops are nested results
in unnecessary iterations. We only need to iterate through the cpts
until we match the cpt number passed as an argument. At that point we
want to copy the router buffer pools for that cpt.

Cray-bug-id: LUS-7240
Test-Parameters: trivial
Signed-off-by: Chris Horn <hornc@cray.com>
Change-Id: I8c0dc7bab7ca42dbce04a9e6efa4343da4139239
Reviewed-on: https://review.whamcloud.com/34591
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Tested-by: Jenkins
Reviewed-by: Alexey Lyashkov <c17817@cray.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lnet/lnet/router.c

index ddc9261..4b41feb 100644 (file)
@@ -566,29 +566,29 @@ lnet_destroy_routes (void)
        lnet_del_route(LNET_NIDNET(LNET_NID_ANY), LNET_NID_ANY);
 }
 
-int lnet_get_rtr_pool_cfg(int idx, struct lnet_ioctl_pool_cfg *pool_cfg)
+int lnet_get_rtr_pool_cfg(int cpt, struct lnet_ioctl_pool_cfg *pool_cfg)
 {
+       struct lnet_rtrbufpool *rbp;
        int i, rc = -ENOENT, j;
 
        if (the_lnet.ln_rtrpools == NULL)
                return rc;
 
-       for (i = 0; i < LNET_NRBPOOLS; i++) {
-               struct lnet_rtrbufpool *rbp;
 
-               lnet_net_lock(LNET_LOCK_EX);
-               cfs_percpt_for_each(rbp, j, the_lnet.ln_rtrpools) {
-                       if (i++ != idx)
-                               continue;
+       cfs_percpt_for_each(rbp, i, the_lnet.ln_rtrpools) {
+               if (i != cpt)
+                       continue;
 
-                       pool_cfg->pl_pools[i].pl_npages = rbp[i].rbp_npages;
-                       pool_cfg->pl_pools[i].pl_nbuffers = rbp[i].rbp_nbuffers;
-                       pool_cfg->pl_pools[i].pl_credits = rbp[i].rbp_credits;
-                       pool_cfg->pl_pools[i].pl_mincredits = rbp[i].rbp_mincredits;
-                       rc = 0;
-                       break;
+               lnet_net_lock(i);
+               for (j = 0; j < LNET_NRBPOOLS; j++) {
+                       pool_cfg->pl_pools[j].pl_npages = rbp[j].rbp_npages;
+                       pool_cfg->pl_pools[j].pl_nbuffers = rbp[j].rbp_nbuffers;
+                       pool_cfg->pl_pools[j].pl_credits = rbp[j].rbp_credits;
+                       pool_cfg->pl_pools[j].pl_mincredits = rbp[j].rbp_mincredits;
                }
-               lnet_net_unlock(LNET_LOCK_EX);
+               lnet_net_unlock(i);
+               rc = 0;
+               break;
        }
 
        lnet_net_lock(LNET_LOCK_EX);