From: Quentin Armitage <quentin@armitage.org.uk>
To: Wensong Zhang <wensong@linux-vs.org>,
Simon Horman <horms@verge.net.au>, Julian Anastasov <ja@ssi.bg>,
Pablo Neira Ayuso <pablo@netfilter.org>,
Patrick McHardy <kaber@trash.net>,
Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>,
"David S. Miller" <davem@davemloft.net>,
netdev@vger.kernel.org, lvs-devel@vger.kernel.org,
netfilter-devel@vger.kernel.org, coreteam@netfilter.org,
linux-kernel@vger.kernel.org
Cc: Quentin Armitage <quentin@armitage.org.uk>
Subject: [PATCH v3 2/4] ipvs: Stop calling __dev_get_by_name() repeatedly when starting sync daemon
Date: Wed, 15 Jun 2016 22:42:42 +0100 [thread overview]
Message-ID: <1466026964-14114-3-git-send-email-quentin@armitage.org.uk> (raw)
In-Reply-To: <1466026964-14114-1-git-send-email-quentin@armitage.org.uk>
Optimise starting sync daemons by using the result of the first call to
__dev_get_by_name() and pass the result or ifindex to subsequent functions
to avoid them having to call __dev_get_by_name() again.
Signed-off-by: Quentin Armitage <quentin@armitage.org.uk>
---
net/netfilter/ipvs/ip_vs_sync.c | 60 +++++++++++++--------------------------
1 files changed, 20 insertions(+), 40 deletions(-)
diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c
index 1b07578..fbc5ba4 100644
--- a/net/netfilter/ipvs/ip_vs_sync.c
+++ b/net/netfilter/ipvs/ip_vs_sync.c
@@ -1356,28 +1356,22 @@ static void set_mcast_pmtudisc(struct sock *sk, int val)
/*
* Specifiy default interface for outgoing multicasts
*/
-static int set_mcast_if(struct sock *sk, char *ifname)
+static int set_mcast_if(struct sock *sk, int ifindex)
{
- struct net_device *dev;
struct inet_sock *inet = inet_sk(sk);
- struct net *net = sock_net(sk);
-
- dev = __dev_get_by_name(net, ifname);
- if (!dev)
- return -ENODEV;
- if (sk->sk_bound_dev_if && dev->ifindex != sk->sk_bound_dev_if)
+ if (sk->sk_bound_dev_if && ifindex != sk->sk_bound_dev_if)
return -EINVAL;
lock_sock(sk);
- inet->mc_index = dev->ifindex;
+ inet->mc_index = ifindex;
/* inet->mc_addr = 0; */
#ifdef CONFIG_IP_VS_IPV6
if (sk->sk_family == AF_INET6) {
struct ipv6_pinfo *np = inet6_sk(sk);
/* IPV6_MULTICAST_IF */
- np->mcast_oif = dev->ifindex;
+ np->mcast_oif = ifindex;
}
#endif
release_sock(sk);
@@ -1392,23 +1386,18 @@ static int set_mcast_if(struct sock *sk, char *ifname)
* in the in_addr structure passed in as a parameter.
*/
static int
-join_mcast_group(struct sock *sk, struct in_addr *addr, char *ifname)
+join_mcast_group(struct sock *sk, struct in_addr *addr, int ifindex)
{
- struct net *net = sock_net(sk);
struct ip_mreqn mreq;
- struct net_device *dev;
int ret;
memset(&mreq, 0, sizeof(mreq));
memcpy(&mreq.imr_multiaddr, addr, sizeof(struct in_addr));
- dev = __dev_get_by_name(net, ifname);
- if (!dev)
- return -ENODEV;
- if (sk->sk_bound_dev_if && dev->ifindex != sk->sk_bound_dev_if)
+ if (sk->sk_bound_dev_if && ifindex != sk->sk_bound_dev_if)
return -EINVAL;
- mreq.imr_ifindex = dev->ifindex;
+ mreq.imr_ifindex = ifindex;
lock_sock(sk);
ret = ip_mc_join_group(sk, &mreq);
@@ -1419,44 +1408,33 @@ join_mcast_group(struct sock *sk, struct in_addr *addr, char *ifname)
#ifdef CONFIG_IP_VS_IPV6
static int join_mcast_group6(struct sock *sk, struct in6_addr *addr,
- char *ifname)
+ int ifindex)
{
- struct net *net = sock_net(sk);
- struct net_device *dev;
int ret;
- dev = __dev_get_by_name(net, ifname);
- if (!dev)
- return -ENODEV;
- if (sk->sk_bound_dev_if && dev->ifindex != sk->sk_bound_dev_if)
+ if (sk->sk_bound_dev_if && ifindex != sk->sk_bound_dev_if)
return -EINVAL;
lock_sock(sk);
- ret = ipv6_sock_mc_join(sk, dev->ifindex, addr);
+ ret = ipv6_sock_mc_join(sk, ifindex, addr);
release_sock(sk);
return ret;
}
#endif
-static int bind_mcastif_addr(struct socket *sock, char *ifname)
+static int bind_mcastif_addr(struct socket *sock, struct net_device *dev)
{
- struct net *net = sock_net(sock->sk);
- struct net_device *dev;
__be32 addr;
struct sockaddr_in sin;
- dev = __dev_get_by_name(net, ifname);
- if (!dev)
- return -ENODEV;
-
addr = inet_select_addr(dev, 0, RT_SCOPE_UNIVERSE);
if (!addr)
pr_err("You probably need to specify IP address on "
"multicast interface.\n");
IP_VS_DBG(7, "binding socket with (%s) %pI4\n",
- ifname, &addr);
+ dev->name, &addr);
/* Now bind the socket with the address of multicast interface */
sin.sin_family = AF_INET;
@@ -1489,7 +1467,8 @@ static void get_mcast_sockaddr(union ipvs_sockaddr *sa, int *salen,
/*
* Set up sending multicast socket over UDP
*/
-static struct socket *make_send_sock(struct netns_ipvs *ipvs, int id)
+static struct socket *make_send_sock(struct netns_ipvs *ipvs, int id,
+ struct net_device *dev)
{
/* multicast addr */
union ipvs_sockaddr mcast_addr;
@@ -1503,7 +1482,7 @@ static struct socket *make_send_sock(struct netns_ipvs *ipvs, int id)
pr_err("Error during creation of socket; terminating\n");
return ERR_PTR(result);
}
- result = set_mcast_if(sock->sk, ipvs->mcfg.mcast_ifn);
+ result = set_mcast_if(sock->sk, dev->ifindex);
if (result < 0) {
pr_err("Error setting outbound mcast interface\n");
goto error;
@@ -1518,7 +1497,7 @@ static struct socket *make_send_sock(struct netns_ipvs *ipvs, int id)
set_sock_size(sock->sk, 1, result);
if (AF_INET == ipvs->mcfg.mcast_af)
- result = bind_mcastif_addr(sock, ipvs->mcfg.mcast_ifn);
+ result = bind_mcastif_addr(sock, dev);
else
result = 0;
if (result < 0) {
@@ -1560,6 +1539,7 @@ static struct socket *make_receive_sock(struct netns_ipvs *ipvs, int id,
pr_err("Error during creation of socket; terminating\n");
return ERR_PTR(result);
}
+
/* it is equivalent to the REUSEADDR option in user-space */
sock->sk->sk_reuse = SK_CAN_REUSE;
result = sysctl_sync_sock_size(ipvs);
@@ -1578,11 +1558,11 @@ static struct socket *make_receive_sock(struct netns_ipvs *ipvs, int id,
#ifdef CONFIG_IP_VS_IPV6
if (ipvs->bcfg.mcast_af == AF_INET6)
result = join_mcast_group6(sock->sk, &mcast_addr.in6.sin6_addr,
- ipvs->bcfg.mcast_ifn);
+ ifindex);
else
#endif
result = join_mcast_group(sock->sk, &mcast_addr.in.sin_addr,
- ipvs->bcfg.mcast_ifn);
+ ifindex);
if (result < 0) {
pr_err("Error joining to the multicast group\n");
goto error;
@@ -1868,7 +1848,7 @@ int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c,
tinfo = NULL;
for (id = 0; id < count; id++) {
if (state == IP_VS_STATE_MASTER)
- sock = make_send_sock(ipvs, id);
+ sock = make_send_sock(ipvs, id, dev);
else
sock = make_receive_sock(ipvs, id, dev->ifindex);
if (IS_ERR(sock)) {
--
1.7.7.6
next prev parent reply other threads:[~2016-06-15 21:43 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-14 14:24 [PATCH v2 0/5] ipvs: fix backup sync daemon with IPv6, and minor updates Quentin Armitage
2016-06-14 14:24 ` [PATCH v2 1/5] ipvs: Enable setting IPv6 multicast address for ipvs sync daemon backup Quentin Armitage
2016-06-14 14:24 ` [PATCH v2 2/5] ipvs: Stop calling __dev_get_by_name() repeatedly when starting sync daemon Quentin Armitage
2016-06-14 14:24 ` [PATCH v2 3/5] ipvs: Don't check result < 0 after setting result = 0 Quentin Armitage
2016-06-14 14:24 ` [PATCH v2 4/5] ipvs: Lock socket before setting SK_CAN_REUSE Quentin Armitage
2016-06-14 14:24 ` [PATCH v2 5/5] ipvs: log additional sync daemon parameters Quentin Armitage
2016-06-15 5:21 ` [PATCH v2 0/5] ipvs: fix backup sync daemon with IPv6, and minor updates Julian Anastasov
[not found] ` <1465978975.2737.264.camel@samson1.armitage.org.uk>
2016-06-15 19:52 ` Julian Anastasov
2016-06-15 21:42 ` [PATCH v3 0/4] " Quentin Armitage
2016-06-15 21:42 ` [PATCH v3 1/4] ipvs: Enable setting IPv6 multicast address for ipvs Quentin Armitage
2016-06-15 21:42 ` Quentin Armitage [this message]
2016-06-15 21:42 ` [PATCH v3 3/4] ipvs: Don't check result < 0 after setting result = 0 Quentin Armitage
2016-06-15 21:42 ` [PATCH v3 4/4] ipvs: log additional sync daemon parameters Quentin Armitage
2016-06-16 6:17 ` [PATCH v3 0/4] ipvs: fix backup sync daemon with IPv6, and minor updates Julian Anastasov
[not found] <Message-id: <alpine.LFD.2.11.1606160912380.2490@ja.home.ssi.bg>
2016-06-16 7:00 ` [PATCH v4 net] ipvs: fix bind to link-local mcast IPv6 address in backup Quentin Armitage
2016-06-17 6:42 ` Julian Anastasov
2016-06-23 1:27 ` Simon Horman
2016-06-16 7:00 ` [PATCH net-next v4 1/3] ipvs: Stop calling __dev_get_by_name() repeatedly when starting sync daemon Quentin Armitage
2016-06-16 7:00 ` [PATCH net-next v4 2/3] ipvs: Don't check result < 0 after setting result = 0 Quentin Armitage
2016-06-16 7:00 ` [PATCH net-next v4 3/3] ipvs: log additional sync daemon parameters Quentin Armitage
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1466026964-14114-3-git-send-email-quentin@armitage.org.uk \
--to=quentin@armitage.org.uk \
--cc=coreteam@netfilter.org \
--cc=davem@davemloft.net \
--cc=horms@verge.net.au \
--cc=ja@ssi.bg \
--cc=kaber@trash.net \
--cc=kadlec@blackhole.kfki.hu \
--cc=linux-kernel@vger.kernel.org \
--cc=lvs-devel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=netfilter-devel@vger.kernel.org \
--cc=pablo@netfilter.org \
--cc=wensong@linux-vs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).