Messages in this thread | | | From | <> | Subject | Re: [PATCH net-next 03/10] net: microchip: sparx5: add support for Service Dual Leacky Buckets | Date | Sun, 5 Feb 2023 20:11:02 +0000 |
| |
Hi Simon,
Thanks for reviewing my patches, appreciate it!
> > +static u32 sparx5_sdlb_group_get_last(struct sparx5 *sparx5, u32 group) > > +{ > > + u32 itr, next; > > + > > + itr = sparx5_sdlb_group_get_first(sparx5, group); > > + > > + for (;;) { > > Unbounded loops like this give me some apprehension. > Will they always terminate?
Yes, it will always terminate - unless the add() del() functions are buggy to begin with.
The end of the leak chain is marked by an index pointing to itself, and this is the exit condition I am looking for in the unbounded loop.
> > > + next = sparx5_sdlb_group_get_next(sparx5, group, itr); > > + if (itr == next) > > + return itr; > > + > > + itr = next; > > + } > > +} > > ... > > > +static int sparx5_sdlb_group_get_adjacent(struct sparx5 *sparx5, u32 group, > > + u32 idx, u32 *prev, u32 *next, > > + u32 *first) > > +{ > > + u32 itr; > > + > > + *first = sparx5_sdlb_group_get_first(sparx5, group); > > + *prev = *first; > > + *next = *first; > > + itr = *first; > > + > > + for (;;) { > > + *next = sparx5_sdlb_group_get_next(sparx5, group, itr); > > + > > + if (itr == idx) > > + return 0; /* Found it */ > > + > > + if (itr == *next) > > + return -EINVAL; /* Was not found */ > > + > > + *prev = itr; > > + itr = *next; > > + } > > +} > > + > > +static int sparx5_sdlb_group_get_count(struct sparx5 *sparx5, u32 group) > > +{ > > + u32 itr, next; > > + int count = 0; > > + > > + itr = sparx5_sdlb_group_get_first(sparx5, group); > > + > > + for (;;) { > > + next = sparx5_sdlb_group_get_next(sparx5, group, itr); > > + if (itr == next) > > + return count; > > + > > + itr = next; > > + count++; > > + } > > +} > > ... > > > +int sparx5_sdlb_group_get_by_index(struct sparx5 *sparx5, u32 idx, u32 *group) > > +{ > > + u32 itr, next; > > + int i; > > + > > + for (i = 0; i < SPX5_SDLB_GROUP_CNT; i++) { > > + if (sparx5_sdlb_group_is_empty(sparx5, i)) > > + continue; > > + > > + itr = sparx5_sdlb_group_get_first(sparx5, i); > > + > > + for (;;) { > > + next = sparx5_sdlb_group_get_next(sparx5, i, itr); > > + > > + if (itr == idx) { > > + *group = i; > > + return 0; /* Found it */ > > + } > > + if (itr == next) > > + break; /* Was not found */ > > + > > + itr = next; > > + } > > + } > > + > > + return -EINVAL; > > +} > > ...
| |