Skip to contentSkip to conversation

Patch "mpls: Do not decrement alive counter for unregister events" has been added to the 4.9-stable tree

PATCH [email protected] 1 participant 1 message Mar 18, 2017

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

mpls: Do not decrement alive counter for unregister events

to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
mpls-do-not-decrement-alive-counter-for-unregister-events.patch
and it can be found in the queue-4.9 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From foo@baz Sat Mar 18 22:03:25 CST 2017

From: David Ahern <[email protected]>
Date: Fri, 10 Mar 2017 14:11:39 -0800
Subject: mpls: Do not decrement alive counter for unregister events

From: David Ahern <[email protected]>

[ Upstream commit 79099aab38c8f5c746748b066ae74ba984fe2cc8 ]

Multipath routes can be rendered usesless when a device in one of the paths is deleted. For example:

$ ip -f mpls ro ls
100
	nexthop as to 200 via inet 172.16.2.2  dev virt12
	nexthop as to 300 via inet 172.16.3.2  dev br0
101
	nexthop as to 201 via inet6 2000:2::2  dev virt12
	nexthop as to 301 via inet6 2000:3::2  dev br0
$ ip li del br0

When br0 is deleted the other hop is not considered in mpls_select_multipath because of the alive check -- rt_nhn_alive is 0.

rt_nhn_alive is decremented once in mpls_ifdown when the device is taken down (NETDEV_DOWN) and again when it is deleted (NETDEV_UNREGISTER). For a 2 hop route, deleting one device drops the alive count to 0. Since devices are taken down before unregistering, the decrement on NETDEV_UNREGISTER is redundant.

Fixes c89359a42e2a4 ("mpls: support for dead routes")
---
 net/mpls/af_mpls.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
net/mpls/af_mpls.c +2 -1
@@ -956,7 +956,8 @@ static void mpls_ifdown(struct net_devic
 				/* fall through */
 			case NETDEV_CHANGE:
 				nh->nh_flags |= RTNH_F_LINKDOWN;
-				ACCESS_ONCE(rt->rt_nhn_alive) = rt->rt_nhn_alive - 1;
+				if (event != NETDEV_UNREGISTER)
+					ACCESS_ONCE(rt->rt_nhn_alive) = rt->rt_nhn_alive - 1;
 				break;
 			}
 			if (event == NETDEV_UNREGISTER)

Patches currently in stable-queue which might be from [email protected] are

queue-4.9/vrf-fix-use-after-free-in-vrf_xmit.patch queue-4.9/mpls-do-not-decrement-alive-counter-for-unregister-events.patch queue-4.9/mpls-send-route-delete-notifications-when-router-module-is-unloaded.patch