From: Robert Shearman <rshea...@brocade.com> Date: Fri, 21 Apr 2017 21:34:59 +0100
> David reported that doing the following: > > ip li add red type vrf table 10 > ip link set dev eth1 vrf red > ip addr add 127.0.0.1/8 dev red > ip link set dev eth1 up > ip li set red up > ping -c1 -w1 -I red 127.0.0.1 > ip li del red > > when either policy routing IP rules are present or the local table > lookup ip rule is before the l3mdev lookup results in a hang with > these messages: > > unregister_netdevice: waiting for red to become free. Usage count = 1 > > The problem is caused by caching the dst used for sending the packet > out of the specified interface on a local route with a different > nexthop interface. Thus the dst could stay around until the route in > the table the lookup was done is deleted which may be never. > > Address the problem by not forcing output device to be the l3mdev in > the flow's output interface if the lookup didn't use the l3mdev. This > then results in the dst using the right device according to the route. > > Changes in v2: > - make the dev_out passed in by __ip_route_output_key_hash correct > instead of checking the nh dev if FLOWI_FLAG_SKIP_NH_OIF is set as > suggested by David. > > Fixes: 5f02ce24c2696 ("net: l3mdev: Allow the l3mdev to be a loopback") > Reported-by: David Ahern <d...@cumulusnetworks.com> > Suggested-by: David Ahern <d...@cumulusnetworks.com> > Signed-off-by: Robert Shearman <rshea...@brocade.com> Applied, thanks.