Commit 3a496293 authored by Kuniyuki Iwashima's avatar Kuniyuki Iwashima Committed by Jakub Kicinski
Browse files

mpls: Use mpls_route_input() where appropriate.



In many places, we uses rtnl_dereference() twice for
net->mpls.platform_label and net->mpls.platform_label[index].

Let's replace the code with mpls_route_input().

We do not use mpls_route_input() in mpls_dump_routes() since
we will rely on RCU there.

Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@google.com>
Reviewed-by: default avatarGuillaume Nault <gnault@redhat.com>
Link: https://patch.msgid.link/20251029173344.2934622-10-kuniyu@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 73e40539
Loading
Loading
Loading
Loading
+13 −19
Original line number Diff line number Diff line
@@ -590,19 +590,17 @@ static void mpls_route_update(struct net *net, unsigned index,
	mpls_rt_free(rt);
}

static unsigned find_free_label(struct net *net)
static unsigned int find_free_label(struct net *net)
{
	struct mpls_route __rcu **platform_label;
	size_t platform_labels;
	unsigned index;
	unsigned int index;

	platform_label = rtnl_dereference(net->mpls.platform_label);
	platform_labels = net->mpls.platform_labels;
	for (index = MPLS_LABEL_FIRST_UNRESERVED; index < platform_labels;
	for (index = MPLS_LABEL_FIRST_UNRESERVED;
	     index < net->mpls.platform_labels;
	     index++) {
		if (!rtnl_dereference(platform_label[index]))
		if (!mpls_route_input(net, index))
			return index;
	}

	return LABEL_NOT_SPECIFIED;
}

@@ -985,7 +983,6 @@ static bool mpls_label_ok(struct net *net, unsigned int *index,
static int mpls_route_add(struct mpls_route_config *cfg,
			  struct netlink_ext_ack *extack)
{
	struct mpls_route __rcu **platform_label;
	struct net *net = cfg->rc_nlinfo.nl_net;
	struct mpls_route *rt, *old;
	int err = -EINVAL;
@@ -1013,8 +1010,7 @@ static int mpls_route_add(struct mpls_route_config *cfg,
	}

	err = -EEXIST;
	platform_label = rtnl_dereference(net->mpls.platform_label);
	old = rtnl_dereference(platform_label[index]);
	old = mpls_route_input(net, index);
	if ((cfg->rc_nlflags & NLM_F_EXCL) && old)
		goto errout;

@@ -1503,16 +1499,15 @@ static void mpls_dev_destroy_rcu(struct rcu_head *head)

static int mpls_ifdown(struct net_device *dev, int event)
{
	struct mpls_route __rcu **platform_label;
	struct net *net = dev_net(dev);
	unsigned index;
	unsigned int index;

	platform_label = rtnl_dereference(net->mpls.platform_label);
	for (index = 0; index < net->mpls.platform_labels; index++) {
		struct mpls_route *rt = rtnl_dereference(platform_label[index]);
		struct mpls_route *rt;
		bool nh_del = false;
		u8 alive = 0;

		rt = mpls_route_input(net, index);
		if (!rt)
			continue;

@@ -1583,15 +1578,14 @@ static int mpls_ifdown(struct net_device *dev, int event)

static void mpls_ifup(struct net_device *dev, unsigned int flags)
{
	struct mpls_route __rcu **platform_label;
	struct net *net = dev_net(dev);
	unsigned index;
	unsigned int index;
	u8 alive;

	platform_label = rtnl_dereference(net->mpls.platform_label);
	for (index = 0; index < net->mpls.platform_labels; index++) {
		struct mpls_route *rt = rtnl_dereference(platform_label[index]);
		struct mpls_route *rt;

		rt = mpls_route_input(net, index);
		if (!rt)
			continue;