Message ID | 20230327200553.13951-2-brett.creeley@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | pds_vfio driver | expand |
On Mon, Mar 27, 2023 at 01:05:47PM -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. > > Cc: Yishai Hadas <yishaih@nvidia.com> > Signed-off-by: Brett Creeley <brett.creeley@amd.com> > Signed-off-by: Shannon Nelson <shannon.nelson@amd.com> Reviewed-by: Simon Horman <simon.horman@corigine.com> > diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c > index 43bd6b76e2b6..49f37c1b4932 100644 > --- a/drivers/vfio/vfio_main.c > +++ b/drivers/vfio/vfio_main.c > @@ -864,6 +864,54 @@ 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) > +{ > + struct interval_tree_node *prev, *curr, *comb_start, *comb_end; > + unsigned long min_gap; > + unsigned long curr_gap; I appreciate that this is just moving code from one place to another. But if you end up respining this series for another reason you may want to consider rearranging the above two lines so they are in reverse xmas tree order - longest to shortest. ...
On 3/29/2023 5:12 AM, Simon Horman wrote: > Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding. > > > On Mon, Mar 27, 2023 at 01:05:47PM -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. >> >> Cc: Yishai Hadas <yishaih@nvidia.com> >> Signed-off-by: Brett Creeley <brett.creeley@amd.com> >> Signed-off-by: Shannon Nelson <shannon.nelson@amd.com> > > Reviewed-by: Simon Horman <simon.horman@corigine.com> Hey Simon, We really appreciate the reviews and I do have another small change that I need to incorporate into one of the patches, so I will include all of your feedback in v7. I won't reply to each individual comment, but I looked through all of them and they all make sense to me. Thanks again for the review, Brett > >> diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c >> index 43bd6b76e2b6..49f37c1b4932 100644 >> --- a/drivers/vfio/vfio_main.c >> +++ b/drivers/vfio/vfio_main.c >> @@ -864,6 +864,54 @@ 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) >> +{ >> + struct interval_tree_node *prev, *curr, *comb_start, *comb_end; >> + unsigned long min_gap; >> + unsigned long curr_gap; > > I appreciate that this is just moving code from one place to another. > But if you end up respining this series for another reason > you may want to consider rearranging the above two lines so they are in > reverse xmas tree order - longest to shortest. > > ...
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 43bd6b76e2b6..49f37c1b4932 100644 --- a/drivers/vfio/vfio_main.c +++ b/drivers/vfio/vfio_main.c @@ -864,6 +864,54 @@ 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) +{ + 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; + + comb_start = interval_tree_iter_first(root, 0, ULONG_MAX); + curr = comb_start; + 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--; + } +} +EXPORT_SYMBOL_GPL(vfio_combine_iova_ranges); + /* Ranges should fit into a single kernel page */ #define LOG_MAX_RANGES \ (PAGE_SIZE / sizeof(struct vfio_device_feature_dma_logging_range)) diff --git a/include/linux/vfio.h b/include/linux/vfio.h index 93134b023968..10db5aa3e985 100644 --- a/include/linux/vfio.h +++ b/include/linux/vfio.h @@ -241,6 +241,9 @@ int vfio_mig_get_next_state(struct vfio_device *device, enum vfio_device_mig_state new_fsm, enum vfio_device_mig_state *next_fsm); +void vfio_combine_iova_ranges(struct rb_root_cached *root, u32 cur_nodes, + u32 req_nodes); + /* * External user API */