From: Eric Dumazet <eric.duma...@gmail.com> Date: Thu, 24 Mar 2016 09:45:34 -0700
> On Thu, 2016-03-24 at 08:25 -0700, David Ahern wrote: >> Multipath route lookups should consider knowledge about next hops and not >> select a hop that is known to be failed. > > Does not look a net candidate to me. > >> Signed-off-by: David Ahern <d...@cumulusnetworks.com> >> --- >> net/ipv4/fib_semantics.c | 34 ++++++++++++++++++++++++++++++++-- >> 1 file changed, 32 insertions(+), 2 deletions(-) >> >> diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c >> index d97268e8ff10..28fc6700c2b1 100644 >> --- a/net/ipv4/fib_semantics.c >> +++ b/net/ipv4/fib_semantics.c >> @@ -1563,13 +1563,43 @@ int fib_sync_up(struct net_device *dev, unsigned int >> nh_flags) >> void fib_select_multipath(struct fib_result *res, int hash) >> { >> struct fib_info *fi = res->fi; >> + struct neighbour *n; >> + int state; >> >> for_nexthops(fi) { >> if (hash > atomic_read(&nh->nh_upper_bound)) >> continue; >> >> - res->nh_sel = nhsel; >> - return; >> + state = NUD_NONE; >> + n = neigh_lookup(&arp_tbl, &nh->nh_gw, fi->fib_dev); >> + if (n) { >> + state = n->nud_state; >> + neigh_release(n); >> + } > > This looks like something that could use RCU to avoid expensive > refcounting ? Indeed, this is way too expensive as-is.