Message ID | 1337726239-9925-1-git-send-email-pshelar@nicira.com |
---|---|
State | Superseded, archived |
Delegated to: | stephen hemminger |
Headers | show |
On Tue, 22 May 2012 15:37:19 -0700 Pravin B Shelar <pshelar@nicira.com> wrote: > ip command reads entire list of devices on every flush command. > While adding device record to list is does list traversal O(n). > This is time consuming for large batch commands. > Following patch improves list add operation to O(1). > > Reported-by: Justin Pettit <jpettit@nicira.com> > Signed-off-by: Pravin B Shelar <pshelar@nicira.com> > --- > ip/ipaddress.c | 16 ++++++++++++---- > 1 file changed, 12 insertions(+), 4 deletions(-) > This no longer applies, after a similar patch I just accepted from Eric. commit 62e2e540919d31147165dabd35431c0649122c96 Author: Eric Dumazet <edumazet@google.com> Date: Sat Jun 9 13:55:55 2012 +0200 ip: speedup ip link ip link has quadratic behavior because store_nlmsg() has a head list pointer and search the end of list. Provides a head/tail to cut time. Time with 128000 net devices, to do "ip link show dev xxx" Before: 2m3.594s After: 0m2.830s Signed-off-by: Eric Dumazet <edumazet@google.com> If that doesn't fix your problem go ahead and resubmit. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/ip/ipaddress.c b/ip/ipaddress.c index 9ab65ec..7080c41 100644 --- a/ip/ipaddress.c +++ b/ip/ipaddress.c @@ -714,6 +714,7 @@ int print_addrinfo_secondary(const struct sockaddr_nl *who, struct nlmsghdr *n, struct nlmsg_list { struct nlmsg_list *next; + struct nlmsg_list *last; struct nlmsghdr h; }; @@ -744,17 +745,24 @@ static int store_nlmsg(const struct sockaddr_nl *who, struct nlmsghdr *n, { struct nlmsg_list **linfo = (struct nlmsg_list**)arg; struct nlmsg_list *h; - struct nlmsg_list **lp; - h = malloc(n->nlmsg_len+sizeof(void*)); + h = malloc(n->nlmsg_len+sizeof(void*)+sizeof(void*)); if (h == NULL) return -1; memcpy(&h->h, n, n->nlmsg_len); h->next = NULL; - for (lp = linfo; *lp; lp = &(*lp)->next) /* NOTHING */; - *lp = h; + if (!*linfo) { + /* First element. */ + h->last = h; + *linfo = h; + } else { + struct nlmsg_list *last = (*linfo)->last; + + last->next = h; + (*linfo)->last = h; + } ll_remember_index(who, n, NULL); return 0;
ip command reads entire list of devices on every flush command. While adding device record to list is does list traversal O(n). This is time consuming for large batch commands. Following patch improves list add operation to O(1). Reported-by: Justin Pettit <jpettit@nicira.com> Signed-off-by: Pravin B Shelar <pshelar@nicira.com> --- ip/ipaddress.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)