From: David Ahern <dsahern@kernel.org>
To: davem@davemloft.net, netdev@vger.kernel.org
Cc: idosch@mellanox.com, jiri@mellanox.com, saeedm@mellanox.com,
David Ahern <dsahern@gmail.com>
Subject: [PATCH v2 net-next 13/13] net: Use common nexthop init and release helpers
Date: Wed, 27 Mar 2019 11:23:29 -0700 [thread overview]
Message-ID: <20190327182329.18149-14-dsahern@kernel.org> (raw)
In-Reply-To: <20190327182329.18149-1-dsahern@kernel.org>
From: David Ahern <dsahern@gmail.com>
With fib_nh_common in place, move common initialization and release
code into helpers used by both ipv4 and ipv6. For the moment, the init
is just the lwt encap and the release is both the netdev reference and
the the lwt state reference. More will be added later.
Signed-off-by: David Ahern <dsahern@gmail.com>
---
include/net/ip_fib.h | 4 ++++
net/ipv4/fib_semantics.c | 60 +++++++++++++++++++++++++++++++-----------------
net/ipv6/route.c | 21 ++++-------------
3 files changed, 48 insertions(+), 37 deletions(-)
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
index 70548b1a6322..12a6d759cf57 100644
--- a/include/net/ip_fib.h
+++ b/include/net/ip_fib.h
@@ -441,6 +441,10 @@ int fib_nh_init(struct net *net, struct fib_nh *fib_nh,
struct fib_config *cfg, int nh_weight,
struct netlink_ext_ack *extack);
void fib_nh_release(struct net *net, struct fib_nh *fib_nh);
+int fib_nh_common_init(struct fib_nh_common *nhc, struct nlattr *fc_encap,
+ u16 fc_encap_type, void *cfg, gfp_t gfp_flags,
+ struct netlink_ext_ack *extack);
+void fib_nh_common_release(struct fib_nh_common *nhc);
/* Exported by fib_trie.c */
void fib_trie_init(void);
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
index e9992407863e..df777af7e278 100644
--- a/net/ipv4/fib_semantics.c
+++ b/net/ipv4/fib_semantics.c
@@ -204,16 +204,22 @@ static void rt_fibinfo_free_cpus(struct rtable __rcu * __percpu *rtp)
free_percpu(rtp);
}
+void fib_nh_common_release(struct fib_nh_common *nhc)
+{
+ if (nhc->nhc_dev)
+ dev_put(nhc->nhc_dev);
+
+ lwtstate_put(nhc->nhc_lwtstate);
+}
+EXPORT_SYMBOL_GPL(fib_nh_common_release);
+
void fib_nh_release(struct net *net, struct fib_nh *fib_nh)
{
#ifdef CONFIG_IP_ROUTE_CLASSID
if (fib_nh->nh_tclassid)
net->ipv4.fib_num_tclassid_users--;
#endif
- if (fib_nh->fib_nh_dev)
- dev_put(fib_nh->fib_nh_dev);
-
- lwtstate_put(fib_nh->fib_nh_lws);
+ fib_nh_common_release(&fib_nh->nh_common);
free_nh_exceptions(fib_nh);
rt_fibinfo_free_cpus(fib_nh->nh_pcpu_rth_output);
rt_fibinfo_free(&fib_nh->nh_rth_input);
@@ -462,6 +468,30 @@ static int fib_detect_death(struct fib_info *fi, int order,
return 1;
}
+int fib_nh_common_init(struct fib_nh_common *nhc, struct nlattr *encap,
+ u16 encap_type, void *cfg, gfp_t gfp_flags,
+ struct netlink_ext_ack *extack)
+{
+ if (encap) {
+ struct lwtunnel_state *lwtstate;
+ int err;
+
+ if (encap_type == LWTUNNEL_ENCAP_NONE) {
+ NL_SET_ERR_MSG(extack, "LWT encap type not specified");
+ return -EINVAL;
+ }
+ err = lwtunnel_build_state(encap_type, encap, nhc->nhc_family,
+ cfg, &lwtstate, extack);
+ if (err)
+ return err;
+
+ nhc->nhc_lwtstate = lwtstate_get(lwtstate);
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(fib_nh_common_init);
+
int fib_nh_init(struct net *net, struct fib_nh *nh,
struct fib_config *cfg, int nh_weight,
struct netlink_ext_ack *extack)
@@ -474,22 +504,10 @@ int fib_nh_init(struct net *net, struct fib_nh *nh,
if (!nh->nh_pcpu_rth_output)
goto err_out;
- if (cfg->fc_encap) {
- struct lwtunnel_state *lwtstate;
-
- err = -EINVAL;
- if (cfg->fc_encap_type == LWTUNNEL_ENCAP_NONE) {
- NL_SET_ERR_MSG(extack, "LWT encap type not specified");
- goto lwt_failure;
- }
- err = lwtunnel_build_state(cfg->fc_encap_type,
- cfg->fc_encap, AF_INET, cfg,
- &lwtstate, extack);
- if (err)
- goto lwt_failure;
-
- nh->fib_nh_lws = lwtstate_get(lwtstate);
- }
+ err = fib_nh_common_init(&nh->nh_common, cfg->fc_encap,
+ cfg->fc_encap_type, cfg, GFP_KERNEL, extack);
+ if (err)
+ goto init_failure;
nh->fib_nh_oif = cfg->fc_oif;
if (cfg->fc_gw) {
@@ -508,7 +526,7 @@ int fib_nh_init(struct net *net, struct fib_nh *nh,
#endif
return 0;
-lwt_failure:
+init_failure:
rt_fibinfo_free_cpus(nh->nh_pcpu_rth_output);
nh->nh_pcpu_rth_output = NULL;
err_out:
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index b5efcb5eff6c..e633b5d000a3 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -2921,18 +2921,6 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
fib6_nh->fib_nh_flags |= RTNH_F_ONLINK;
}
- if (cfg->fc_encap) {
- struct lwtunnel_state *lwtstate;
-
- err = lwtunnel_build_state(cfg->fc_encap_type,
- cfg->fc_encap, AF_INET6, cfg,
- &lwtstate, extack);
- if (err)
- goto out;
-
- fib6_nh->fib_nh_lws = lwtstate_get(lwtstate);
- }
-
fib6_nh->fib_nh_weight = 1;
/* We cannot add true routes via loopback here,
@@ -2990,6 +2978,10 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
!netif_carrier_ok(dev))
fib6_nh->fib_nh_flags |= RTNH_F_LINKDOWN;
+ err = fib_nh_common_init(&fib6_nh->nh_common, cfg->fc_encap,
+ cfg->fc_encap_type, cfg, gfp_flags, extack);
+ if (err)
+ goto out;
set_dev:
fib6_nh->fib_nh_dev = dev;
fib6_nh->fib_nh_oif = dev->ifindex;
@@ -3010,10 +3002,7 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
void fib6_nh_release(struct fib6_nh *fib6_nh)
{
- lwtstate_put(fib6_nh->fib_nh_lws);
-
- if (fib6_nh->fib_nh_dev)
- dev_put(fib6_nh->fib_nh_dev);
+ fib_nh_common_release(&fib6_nh->nh_common);
}
static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,
--
2.11.0
prev parent reply other threads:[~2019-03-27 18:38 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-27 18:23 [PATCH v2 net-next 00/13] net: Move fib_nh and fib6_nh to a common struct David Ahern
2019-03-27 18:23 ` [PATCH v2 net-next 01/13] ipv4: Define fib_get_nhs when CONFIG_IP_ROUTE_MULTIPATH is disabled David Ahern
2019-03-27 18:23 ` [PATCH v2 net-next 02/13] ipv4: Move IN_DEV_IGNORE_ROUTES_WITH_LINKDOWN to helper David Ahern
2019-03-27 18:23 ` [PATCH v2 net-next 03/13] ipv4: Create init helper for fib_nh David Ahern
2019-03-27 18:23 ` [PATCH v2 net-next 04/13] ipv4: Create cleanup " David Ahern
2019-03-27 18:23 ` [PATCH v2 net-next 05/13] ipv6: Create init helper for fib6_nh David Ahern
2019-03-27 22:52 ` Alexei Starovoitov
2019-03-28 0:47 ` David Ahern
2019-03-28 1:30 ` Alexei Starovoitov
2019-03-28 2:05 ` David Ahern
2019-03-28 2:29 ` Alexei Starovoitov
2019-03-28 2:50 ` David Ahern
2019-03-28 3:04 ` Alexei Starovoitov
2019-03-28 2:11 ` David Ahern
2019-03-27 18:23 ` [PATCH v2 net-next 06/13] ipv6: Create cleanup " David Ahern
2019-03-27 18:23 ` [PATCH v2 net-next 07/13] ipv6: Move gateway checks to a fib6_nh setting David Ahern
2019-03-27 18:23 ` [PATCH v2 net-next 08/13] ipv6: Refactor fib6_ignore_linkdown David Ahern
2019-03-27 18:23 ` [PATCH v2 net-next 09/13] ipv6: Change rt6_add_nexthop and rt6_nexthop_info to take fib6_nh David Ahern
2019-03-27 18:23 ` [PATCH v2 net-next 10/13] ipv4: Rename fib_nh entries David Ahern
2019-03-27 18:23 ` [PATCH v2 net-next 11/13] ipv6: Rename fib6_nh entries David Ahern
2019-03-27 18:23 ` [PATCH v2 net-next 12/13] net: Add fib_nh_common and update fib_nh and fib6_nh David Ahern
2019-03-27 18:23 ` David Ahern [this message]
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=20190327182329.18149-14-dsahern@kernel.org \
--to=dsahern@kernel.org \
--cc=davem@davemloft.net \
--cc=dsahern@gmail.com \
--cc=idosch@mellanox.com \
--cc=jiri@mellanox.com \
--cc=netdev@vger.kernel.org \
--cc=saeedm@mellanox.com \
/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).