[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <BN9PR11MB52765D6E90B38CEAE04128618C58A@BN9PR11MB5276.namprd11.prod.outlook.com>
Date: Fri, 16 Jun 2023 06:52:03 +0000
From: "Tian, Kevin" <kevin.tian@...el.com>
To: Brett Creeley <brett.creeley@....com>, "kvm@...r.kernel.org"
<kvm@...r.kernel.org>, "netdev@...r.kernel.org" <netdev@...r.kernel.org>,
"alex.williamson@...hat.com" <alex.williamson@...hat.com>, "jgg@...dia.com"
<jgg@...dia.com>, "yishaih@...dia.com" <yishaih@...dia.com>,
"shameerali.kolothum.thodi@...wei.com" <shameerali.kolothum.thodi@...wei.com>
CC: "shannon.nelson@....com" <shannon.nelson@....com>
Subject: RE: [PATCH v10 vfio 1/7] vfio: Commonize combine_ranges for use in
other VFIO drivers
> From: Brett Creeley <brett.creeley@....com>
> Sent: Saturday, June 3, 2023 6:03 AM
>
> +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, 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);
> +
Being a public function please follow the kernel convention with comment
explaining what this function actually does.
btw while you rename it with 'vfio' and 'iova' keywords, the actual logic
has nothing to do with either of them. Does it make more sense to move it
to a more generic library?
Powered by blists - more mailing lists