Netdev List
 help / color / mirror / Atom feed
* [PATCH 1/2] iproute2: Improve list add.
@ 2012-05-22 22:37 Pravin B Shelar
  2012-06-11 22:01 ` Stephen Hemminger
  0 siblings, 1 reply; 2+ messages in thread
From: Pravin B Shelar @ 2012-05-22 22:37 UTC (permalink / raw)
  To: shemminger, netdev; +Cc: jpettit, jesse, Pravin B Shelar

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(-)

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;
-- 
1.7.10

^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2012-06-11 22:01 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-05-22 22:37 [PATCH 1/2] iproute2: Improve list add Pravin B Shelar
2012-06-11 22:01 ` Stephen Hemminger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox