Patch "lwtunnel: fix autoload of lwt modules" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
lwtunnel: fix autoload of lwt modules
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:
lwtunnel-fix-autoload-of-lwt-modules.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 Wed Feb 1 08:50:24 CET 2017
From: David Ahern <[email protected]>
Date: Tue, 17 Jan 2017 14:57:36 -0800
Subject: lwtunnel: fix autoload of lwt modules
From: David Ahern <[email protected]>
[ Upstream commit 9ed59592e3e379b2e9557dc1d9e9ec8fcbb33f16]
Trying to add an mpls encap route when the MPLS modules are not loaded hangs. For example:
CONFIG_MPLS=y
CONFIG_NET_MPLS_GSO=m
CONFIG_MPLS_ROUTING=m
CONFIG_MPLS_IPTUNNEL=m
$ ip route add 10.10.10.10/32 encap mpls 100 via inet 10.100.1.2The ip command hangs:
root 880 826 0 21:25 pts/0 00:00:00 ip route add 10.10.10.10/32 encap mpls 100 via inet 10.100.1.2
$ cat /proc/880/stack
[<ffffffff81065a9b>] call_usermodehelper_exec+0xd6/0x134
[<ffffffff81065efc>] __request_module+0x27b/0x30a
[<ffffffff814542f6>] lwtunnel_build_state+0xe4/0x178
[<ffffffff814aa1e4>] fib_create_info+0x47f/0xdd4
[<ffffffff814ae451>] fib_table_insert+0x90/0x41f
[<ffffffff814a8010>] inet_rtm_newroute+0x4b/0x52
...modprobe is trying to load rtnl-lwt-MPLS:
root 881 5 0 21:25 ? 00:00:00 /sbin/modprobe -q -- rtnl-lwt-MPLS
and it hangs after loading mpls_router:
$ cat /proc/881/stack
[<ffffffff81441537>] rtnl_lock+0x12/0x14
[<ffffffff8142ca2a>] register_netdevice_notifier+0x16/0x179
[<ffffffffa0033025>] mpls_init+0x25/0x1000 [mpls_router]
[<ffffffff81000471>] do_one_initcall+0x8e/0x13f
[<ffffffff81119961>] do_init_module+0x5a/0x1e5
[<ffffffff810bd070>] load_module+0x13bd/0x17d6
...The problem is that lwtunnel_build_state is called with rtnl lock held preventing mpls_init from registering.
Given the potential references held by the time lwtunnel_build_state it can not drop the rtnl lock to the load module. So, extract the module loading code from lwtunnel_build_state into a new function to validate the encap type. The new function is called while converting the user request into a fib_config which is well before any table, device or fib entries are examined.
--- include/net/lwtunnel.h | 11 ++++++++ net/core/lwtunnel.c | 62 +++++++++++++++++++++++++++++++++++++++++++----- net/ipv4/fib_frontend.c | 8 ++++++ net/ipv6/route.c | 12 ++++++++- 4 files changed, 86 insertions(+), 7 deletions(-)
include/net/lwtunnel.h +11 -0
@@ -106,6 +106,8 @@ int lwtunnel_encap_add_ops(const struct unsigned int num);int lwtunnel_encap_del_ops (const struct lwtunnel_encap_ops *op,unsigned int num); +int lwtunnel_valid_encap_type (u16 encap_type); +int lwtunnel_valid_encap_type_attr (struct nlattr *attr,int len); int lwtunnel_build_state(struct net_device *dev, u16 encap_type, struct nlattr *encap, unsigned int family, const void *cfg,
@@ -168,6 +170,15 @@ static inline int lwtunnel_encap_del_ops {return -EOPNOTSUPP ; } + +static inline int lwtunnel_valid_encap_type (u16 encap_type) +{ +return -EOPNOTSUPP ; +} +static inline int lwtunnel_valid_encap_type_attr (struct nlattr *attr,int len) +{ +return -EOPNOTSUPP ; +} static inline int lwtunnel_build_state(struct net_device *dev, u16 encap_type, struct nlattr *encap,
net/core/lwtunnel.c +56 -6
87 lines not on this page · raw message
net/ipv4/fib_frontend.c +8 -0
@@ -46,6 +46,7 @@#include <net/rtnetlink.h> #include <net/xfrm.h> #include <net/l3mdev.h> +#include <net/lwtunnel.h> #include <trace/events/fib.h> #ifndef CONFIG_IP_MULTIPLE_TABLES
@@ -676,6 +677,10 @@ static int rtm_to_fib_config(struct net cfg->fc_mx_len =nla_len (attr);break ;case RTA_MULTIPATH : + err =lwtunnel_valid_encap_type_attr (nla_data (attr), +nla_len (attr)); +if (err <0 ) + goto errout; cfg->fc_mp =nla_data (attr); cfg->fc_mp_len =nla_len (attr);break ;
@@ -690,6 +695,9 @@ static int rtm_to_fib_config(struct netbreak ;case RTA_ENCAP_TYPE : cfg->fc_encap_type =nla_get_u16 (attr); + err =lwtunnel_valid_encap_type (cfg->fc_encap_type); +if (err <0 ) + goto errout;break ; } }
net/ipv6/route.c +11 -1
@@ -2885,6 +2885,11 @@ static int rtm_to_fib6_config(struct sk_if (tb[RTA_MULTIPATH ]) { cfg->fc_mp =nla_data (tb[RTA_MULTIPATH ]); cfg->fc_mp_len =nla_len (tb[RTA_MULTIPATH ]); + + err =lwtunnel_valid_encap_type_attr (cfg->fc_mp, + cfg->fc_mp_len); +if (err <0 ) + goto errout; }if (tb[RTA_PREF ]) {
@@ -2898,9 +2903,14 @@ static int rtm_to_fib6_config(struct sk_if (tb[RTA_ENCAP ]) cfg->fc_encap = tb[RTA_ENCAP ]; -if (tb[RTA_ENCAP_TYPE ]) +if (tb[RTA_ENCAP_TYPE ]) { cfg->fc_encap_type =nla_get_u16 (tb[RTA_ENCAP_TYPE ]); + err =lwtunnel_valid_encap_type (cfg->fc_encap_type); +if (err <0 ) + goto errout; + } +if (tb[RTA_EXPIRES ]) {unsigned long timeout =addrconf_timeout_fixup (nla_get_u32 (tb[RTA_EXPIRES ]),HZ );
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/net-lwtunnel-handle-lwtunnel_fill_encap-failure.patch queue-4.9/lwtunnel-fix-autoload-of-lwt-modules.patch queue-4.9/net-ipv4-fix-table-id-in-getroute-response.patch queue-4.9/net-mpls-fix-multipath-selection-for-lsr-use-case.patch