]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
RDMA/mlx5: Fix calculation of total invalidated pages
authorChiara Meiohas <cmeiohas@nvidia.com>
Thu, 13 Mar 2025 14:29:54 +0000 (16:29 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Apr 2025 12:37:30 +0000 (14:37 +0200)
[ Upstream commit 79195147644653ebffadece31a42181e4c48c07d ]

When invalidating an address range in mlx5, there is an optimization to
do UMR operations in chunks.
Previously, the invalidation counter was incorrectly updated for the
same indexes within a chunk. Now, the invalidation counter is updated
only when a chunk is complete and mlx5r_umr_update_xlt() is called.
This ensures that the counter accurately represents the number of pages
invalidated using UMR.

Fixes: a3de94e3d61e ("IB/mlx5: Introduce ODP diagnostic counters")
Signed-off-by: Chiara Meiohas <cmeiohas@nvidia.com>
Reviewed-by: Michael Guralnik <michaelgur@nvidia.com>
Link: https://patch.msgid.link/560deb2433318e5947282b070c915f3c81fef77f.1741875692.git.leon@kernel.org
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/hw/mlx5/odp.c

index f1a0a324223c0d24e202a5d8637a8c3c311f607d..7ad5db46ffce79d07baabfb254c2cfca46352f1c 100644 (file)
@@ -274,9 +274,6 @@ static bool mlx5_ib_invalidate_range(struct mmu_interval_notifier *mni,
                                blk_start_idx = idx;
                                in_block = 1;
                        }
-
-                       /* Count page invalidations */
-                       invalidations += idx - blk_start_idx + 1;
                } else {
                        u64 umr_offset = idx & umr_block_mask;
 
@@ -286,14 +283,19 @@ static bool mlx5_ib_invalidate_range(struct mmu_interval_notifier *mni,
                                                     MLX5_IB_UPD_XLT_ZAP |
                                                     MLX5_IB_UPD_XLT_ATOMIC);
                                in_block = 0;
+                               /* Count page invalidations */
+                               invalidations += idx - blk_start_idx + 1;
                        }
                }
        }
-       if (in_block)
+       if (in_block) {
                mlx5r_umr_update_xlt(mr, blk_start_idx,
                                     idx - blk_start_idx + 1, 0,
                                     MLX5_IB_UPD_XLT_ZAP |
                                     MLX5_IB_UPD_XLT_ATOMIC);
+               /* Count page invalidations */
+               invalidations += idx - blk_start_idx + 1;
+       }
 
        mlx5_update_odp_stats(mr, invalidations, invalidations);