From b840c620fe818a313f09891cd2ede492e928e8d4 Mon Sep 17 00:00:00 2001 From: Nikolay Aleksandrov Date: Mon, 4 Oct 2021 12:03:28 +0300 Subject: [PATCH] ip: nexthop: keep cache netlink socket open Since we use the cache netlink socket for each nexthop we can keep it open instead of opening and closing it on every add call. The socket is opened once, on the first add call and then reused for the rest. Suggested-by: David Ahern Signed-off-by: Nikolay Aleksandrov Signed-off-by: David Ahern --- ip/ipnexthop.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ip/ipnexthop.c b/ip/ipnexthop.c index b4d44a864..83a5540e7 100644 --- a/ip/ipnexthop.c +++ b/ip/ipnexthop.c @@ -35,6 +35,7 @@ enum { NLMSG_ALIGN(sizeof(struct nhmsg)))) static struct hlist_head nh_cache[NH_CACHE_SIZE]; +static struct rtnl_handle nh_cache_rth = { .fd = -1 }; static void usage(void) __attribute__((noreturn)); @@ -563,14 +564,15 @@ static int __ipnh_cache_parse_nlmsg(const struct nlmsghdr *n, static struct nh_entry *ipnh_cache_add(__u32 nh_id) { - struct rtnl_handle cache_rth = { .fd = -1 }; struct nlmsghdr *answer = NULL; struct nh_entry *nhe = NULL; - if (rtnl_open(&cache_rth, 0) < 0) + if (nh_cache_rth.fd < 0 && rtnl_open(&nh_cache_rth, 0) < 0) { + nh_cache_rth.fd = -1; goto out; + } - if (__ipnh_get_id(&cache_rth, nh_id, &answer) < 0) + if (__ipnh_get_id(&nh_cache_rth, nh_id, &answer) < 0) goto out; nhe = malloc(sizeof(*nhe)); @@ -585,7 +587,6 @@ static struct nh_entry *ipnh_cache_add(__u32 nh_id) out: if (answer) free(answer); - rtnl_close(&cache_rth); return nhe; -- 2.47.2