On Tue, Jul 25, 2023 at 02:40:19PM -0700, Brett Creeley wrote: > Currently only Mellanox uses the combine_ranges function. The > new pds_vfio driver also needs this function. So, move it to > a common location for other vendor drivers to use. > > Also, fix RCT ordering while moving/renaming the function. > > Cc: Yishai Hadas <yishaih@xxxxxxxxxx> > Signed-off-by: Brett Creeley <brett.creeley@xxxxxxx> > Signed-off-by: Shannon Nelson <shannon.nelson@xxxxxxx> > Reviewed-by: Simon Horman <simon.horman@xxxxxxxxxxxx> > --- > drivers/vfio/pci/mlx5/cmd.c | 48 +------------------------------------ > drivers/vfio/vfio_main.c | 47 ++++++++++++++++++++++++++++++++++++ > include/linux/vfio.h | 3 +++ > 3 files changed, 51 insertions(+), 47 deletions(-) > > diff --git a/drivers/vfio/pci/mlx5/cmd.c b/drivers/vfio/pci/mlx5/cmd.c > index deed156e6165..7f6c51992a15 100644 > --- a/drivers/vfio/pci/mlx5/cmd.c > +++ b/drivers/vfio/pci/mlx5/cmd.c > @@ -732,52 +732,6 @@ void mlx5fv_cmd_clean_migf_resources(struct mlx5_vf_migration_file *migf) > mlx5vf_cmd_dealloc_pd(migf); > } > > -static void combine_ranges(struct rb_root_cached *root, u32 cur_nodes, > - u32 req_nodes) > -{ > - struct interval_tree_node *prev, *curr, *comb_start, *comb_end; > - unsigned long min_gap; > - unsigned long curr_gap; > - > - /* Special shortcut when a single range is required */ > - if (req_nodes == 1) { > - unsigned long last; > - > - curr = comb_start = interval_tree_iter_first(root, 0, ULONG_MAX); > - while (curr) { > - last = curr->last; > - prev = curr; > - curr = interval_tree_iter_next(curr, 0, ULONG_MAX); > - if (prev != comb_start) > - interval_tree_remove(prev, root); > - } > - comb_start->last = last; > - return; > - } > - > - /* Combine ranges which have the smallest gap */ > - while (cur_nodes > req_nodes) { > - prev = NULL; > - min_gap = ULONG_MAX; > - curr = interval_tree_iter_first(root, 0, ULONG_MAX); > - while (curr) { > - if (prev) { > - curr_gap = curr->start - prev->last; > - if (curr_gap < min_gap) { > - min_gap = curr_gap; > - comb_start = prev; > - comb_end = curr; > - } > - } > - prev = curr; > - curr = interval_tree_iter_next(curr, 0, ULONG_MAX); > - } > - comb_start->last = comb_end->last; > - interval_tree_remove(comb_end, root); > - cur_nodes--; > - } > -} > - > static int mlx5vf_create_tracker(struct mlx5_core_dev *mdev, > struct mlx5vf_pci_core_device *mvdev, > struct rb_root_cached *ranges, u32 nnodes) > @@ -800,7 +754,7 @@ static int mlx5vf_create_tracker(struct mlx5_core_dev *mdev, > int i; > > if (num_ranges > max_num_range) { > - combine_ranges(ranges, nnodes, max_num_range); > + vfio_combine_iova_ranges(ranges, nnodes, max_num_range); > num_ranges = max_num_range; > } > > diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c > index f0ca33b2e1df..3bde62f7e08b 100644 > --- a/drivers/vfio/vfio_main.c > +++ b/drivers/vfio/vfio_main.c > @@ -865,6 +865,53 @@ static int vfio_ioctl_device_feature_migration(struct vfio_device *device, > return 0; > } > > +void vfio_combine_iova_ranges(struct rb_root_cached *root, u32 cur_nodes, > + u32 req_nodes) > +{ It should really gain a kdoc now. But the code is fine Reviewed-by: Jason Gunthorpe <jgg@xxxxxxxxxx> Jason