]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/hns: Optimize hem allocation performance
authorJunxian Huang <huangjunxian6@hisilicon.com>
Fri, 6 Sep 2024 09:34:43 +0000 (17:34 +0800)
committerLeon Romanovsky <leon@kernel.org>
Tue, 10 Sep 2024 13:06:39 +0000 (16:06 +0300)
When allocating MTT hem, for each hop level of each hem that is being
allocated, the driver iterates the hem list to find out whether the
bt page has been allocated in this hop level. If not, allocate a new
one and splice it to the list. The time complexity is O(n^2) in worst
cases.

Currently the allocation for-loop uses 'unit' as the step size. This
actually has taken into account the reuse of last-hop-level MTT bt
pages by multiple buffer pages. Thus pages of last hop level will
never have been allocated, so there is no need to iterate the hem list
in last hop level.

Removing this unnecessary iteration can reduce the time complexity to
O(n).

Fixes: 38389eaa4db1 ("RDMA/hns: Add mtr support for mixed multihop addressing")
Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
Link: https://patch.msgid.link/20240906093444.3571619-9-huangjunxian6@hisilicon.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/hns/hns_roce_hem.c

index 42111f31b37152739c1a4025601d9b5bca280db6..c7c167e2a045138c9638a444c2fbd185a677ff75 100644 (file)
@@ -1134,10 +1134,12 @@ static int hem_list_alloc_mid_bt(struct hns_roce_dev *hr_dev,
 
        /* config L1 bt to last bt and link them to corresponding parent */
        for (level = 1; level < hopnum; level++) {
-               cur = hem_list_search_item(&mid_bt[level], offset);
-               if (cur) {
-                       hem_ptrs[level] = cur;
-                       continue;
+               if (!hem_list_is_bottom_bt(hopnum, level)) {
+                       cur = hem_list_search_item(&mid_bt[level], offset);
+                       if (cur) {
+                               hem_ptrs[level] = cur;
+                               continue;
+                       }
                }
 
                step = hem_list_calc_ba_range(hopnum, level, unit);