lib: Add tail check before nexthop insertion

Add a tail check to see if we can just put the nexthop
at the end of the already sorted list before iteration.

Signed-off-by: Stephen Worley <sworley@cumulusnetworks.com>
This commit is contained in:
Stephen Worley 2019-08-05 15:30:05 -04:00
parent 604321440e
commit 8c15fa95a8

View File

@ -60,6 +60,16 @@ nexthop_group_cmd_compare(const struct nexthop_group_cmd *nhgc1,
return strcmp(nhgc1->name, nhgc2->name); return strcmp(nhgc1->name, nhgc2->name);
} }
static struct nexthop *nexthop_group_tail(const struct nexthop_group *nhg)
{
struct nexthop *nexthop = nhg->nexthop;
while (nexthop && nexthop->next)
nexthop = nexthop->next;
return nexthop;
}
uint8_t nexthop_group_nexthop_num(const struct nexthop_group *nhg) uint8_t nexthop_group_nexthop_num(const struct nexthop_group *nhg)
{ {
struct nexthop *nhop; struct nexthop *nhop;
@ -129,7 +139,20 @@ void _nexthop_add(struct nexthop **target, struct nexthop *nexthop)
void _nexthop_group_add_sorted(struct nexthop_group *nhg, void _nexthop_group_add_sorted(struct nexthop_group *nhg,
struct nexthop *nexthop) struct nexthop *nexthop)
{ {
struct nexthop *position, *prev; struct nexthop *position, *prev, *tail;
/* Try to just append to the end first
* This trust it is already sorted
*/
tail = nexthop_group_tail(nhg);
if (tail && (nexthop_cmp(tail, nexthop) < 0)) {
tail->next = nexthop;
nexthop->prev = tail;
return;
}
for (position = nhg->nexthop, prev = NULL; position; for (position = nhg->nexthop, prev = NULL; position;
prev = position, position = position->next) { prev = position, position = position->next) {