> From: Jason Gunthorpe <jgg@xxxxxxxxxx> > Sent: Wednesday, October 26, 2022 2:12 AM > +/* > + * This iterator travels over spans in an interval tree. It does not return > + * nodes but classifies each span as either a hole, where no nodes intersect, > or > + * a used, which is fully covered by nodes. Each iteration step toggles > between > + * hole and used until the entire range is covered. The returned spans > always > + * fully cover the requested range. > + * > + * The iterator is greedy, it always returns the largest hole or used possible, > + * consolidating all consecutive nodes. > + * > + * Only is_hole, start_hole/used and last_hole/used are part of the external > + * interface. slightly better readability if moving this sentence into the structure as the break line > +void interval_tree_span_iter_advance(struct interval_tree_span_iter *iter, > + struct rb_root_cached *itree, > + unsigned long new_index) > +{ > + if (iter->is_hole == -1) > + return; > + > + iter->first_index = new_index; > + if (new_index == iter->last_index) { > + iter->is_hole = -1; > + return; > + } > + > + /* Rely on the union aliasing hole/used */ > + if (iter->start_hole <= new_index && new_index <= iter->last_hole) { "<=" to "<" > + iter->start_hole = new_index; > + return; > + } > + if (new_index == iter->last_hole + 1) > + interval_tree_span_iter_next(iter); > + else > + interval_tree_span_iter_first(iter, itree, new_index, > + iter->last_index); > +} > +EXPORT_SYMBOL_GPL(interval_tree_span_iter_advance); > +#endif Apart from those, Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx>