From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D790DC10F14 for ; Tue, 16 Apr 2019 21:35:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A76232075B for ; Tue, 16 Apr 2019 21:35:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1555450545; bh=A2GaaKrr5OEJ35Yf3nQbmqhcxLUphV0uPBLIYPPxcFk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=p8OUxUxRGL75k/tQdPBYHYnAyBfn2AsU99Bx45lYYgYtEqL2TmaJqmcmhSP61PS9K jkjDr6OWSM1OSFdaCLgLDwpa+uz+Xc6wxhTCGnEaaNJNnOJNIRUu2A9wEQgdTE5DNZ q08TDjI+SXmVdKyMdtWxkvQIK9qCqf0D1s9TLCow= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730603AbfDPVfl (ORCPT ); Tue, 16 Apr 2019 17:35:41 -0400 Received: from mail.kernel.org ([198.145.29.99]:47832 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726986AbfDPVfi (ORCPT ); Tue, 16 Apr 2019 17:35:38 -0400 Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com [216.129.126.126]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id AF82521773; Tue, 16 Apr 2019 21:35:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1555450536; bh=A2GaaKrr5OEJ35Yf3nQbmqhcxLUphV0uPBLIYPPxcFk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fFvHXA4l22CPR9rkP68W/hbKP+NfceZL+P/dOfuLET/lLiVozANYRjO/1JOiQAkek o0NUctfUh5fQFxWiEeI+IMfg2UwHpAKDgHqZ2bKmViYSKFVg1Wrxm/yTF/B/5g2quX ZIH1MU2yxhvFBAF3GPl02kwag+0btcO2KZxTeOXk= From: David Ahern To: davem@davemloft.net, netdev@vger.kernel.org Cc: idosch@mellanox.com, David Ahern Subject: [PATCH v2 net-next 04/13] ipv6: Pass fib6_result to ip6_create_rt_rcu Date: Tue, 16 Apr 2019 14:36:02 -0700 Message-Id: <20190416213611.8724-5-dsahern@kernel.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190416213611.8724-1-dsahern@kernel.org> References: <20190416213611.8724-1-dsahern@kernel.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern Change ip6_create_rt_rcu to take fib6_result over a fib6_info. Signed-off-by: David Ahern --- net/ipv6/route.c | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/net/ipv6/route.c b/net/ipv6/route.c index f267b3060ac7..5e84d0894f6b 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -1038,22 +1038,24 @@ static bool ip6_hold_safe(struct net *net, struct rt6_info **prt) } /* called with rcu_lock held */ -static struct rt6_info *ip6_create_rt_rcu(struct fib6_info *rt) +static struct rt6_info *ip6_create_rt_rcu(const struct fib6_result *res) { - unsigned short flags = fib6_info_dst_flags(rt); - struct net_device *dev = rt->fib6_nh.fib_nh_dev; + struct net_device *dev = res->nh->fib_nh_dev; + struct fib6_info *f6i = res->f6i; + unsigned short flags; struct rt6_info *nrt; - if (!fib6_info_hold_safe(rt)) + if (!fib6_info_hold_safe(f6i)) goto fallback; + flags = fib6_info_dst_flags(f6i); nrt = ip6_dst_alloc(dev_net(dev), dev, flags); if (!nrt) { - fib6_info_release(rt); + fib6_info_release(f6i); goto fallback; } - ip6_rt_copy_init(nrt, rt); + ip6_rt_copy_init(nrt, f6i); return nrt; fallback: @@ -1104,7 +1106,7 @@ static struct rt6_info *ip6_pol_route_lookup(struct net *net, if (ip6_hold_safe(net, &rt)) dst_use_noref(&rt->dst, jiffies); } else { - rt = ip6_create_rt_rcu(res.f6i); + rt = ip6_create_rt_rcu(&res); } out: @@ -2413,12 +2415,13 @@ void ip6_sk_dst_store_flow(struct sock *sk, struct dst_entry *dst, NULL); } -static bool ip6_redirect_nh_match(struct fib6_info *f6i, - struct fib6_nh *nh, +static bool ip6_redirect_nh_match(const struct fib6_result *res, struct flowi6 *fl6, const struct in6_addr *gw, struct rt6_info **ret) { + const struct fib6_nh *nh = res->nh; + if (nh->fib_nh_flags & RTNH_F_DEAD || !nh->fib_nh_gw_family || fl6->flowi6_oif != nh->fib_nh_dev->ifindex) return false; @@ -2429,12 +2432,9 @@ static bool ip6_redirect_nh_match(struct fib6_info *f6i, * is different. */ if (!ipv6_addr_equal(gw, &nh->fib_nh_gw6)) { - struct fib6_result res = { - .f6i = f6i, - }; struct rt6_info *rt_cache; - rt_cache = rt6_find_cached_rt(&res, &fl6->daddr, &fl6->saddr); + rt_cache = rt6_find_cached_rt(res, &fl6->daddr, &fl6->saddr); if (rt_cache && ipv6_addr_equal(gw, &rt_cache->rt6i_gateway)) { *ret = rt_cache; @@ -2459,6 +2459,7 @@ static struct rt6_info *__ip6_route_redirect(struct net *net, { struct ip6rd_flowi *rdfl = (struct ip6rd_flowi *)fl6; struct rt6_info *ret = NULL; + struct fib6_result res = {}; struct fib6_info *rt; struct fib6_node *fn; @@ -2476,12 +2477,14 @@ static struct rt6_info *__ip6_route_redirect(struct net *net, fn = fib6_node_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr); restart: for_each_fib6_node_rt_rcu(fn) { + res.f6i = rt; + res.nh = &rt->fib6_nh; + if (fib6_check_expired(rt)) continue; if (rt->fib6_flags & RTF_REJECT) break; - if (ip6_redirect_nh_match(rt, &rt->fib6_nh, fl6, - &rdfl->gateway, &ret)) + if (ip6_redirect_nh_match(&res, fl6, &rdfl->gateway, &ret)) goto out; } @@ -2498,11 +2501,13 @@ static struct rt6_info *__ip6_route_redirect(struct net *net, goto restart; } + res.f6i = rt; + res.nh = &rt->fib6_nh; out: if (ret) ip6_hold_safe(net, &ret); else - ret = ip6_create_rt_rcu(rt); + ret = ip6_create_rt_rcu(&res); rcu_read_unlock(); -- 2.11.0