From patchwork Fri Jun 16 17:47:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wei Wang X-Patchwork-Id: 776921 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3wq7D82BsWz9s8N for ; Sat, 17 Jun 2017 03:49:28 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="XroNaMPr"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752664AbdFPRtW (ORCPT ); Fri, 16 Jun 2017 13:49:22 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:34534 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752514AbdFPRsa (ORCPT ); Fri, 16 Jun 2017 13:48:30 -0400 Received: by mail-pf0-f194.google.com with SMTP id d5so7559832pfe.1 for ; Fri, 16 Jun 2017 10:48:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=2yPqNUssJAXAg475rCQOG3t1ZhLv0LHfwvqizitLbZM=; b=XroNaMPrXsGXUppAd+RchXjoQC3UKTh1gWTZx2QOqkwtI3fqFzkSCPQaknTKM9Z+Zy 0dkC4Dr/HEwt93m/s01XS11oHD72MYS1AUsiUoo6t0PLMcI5Q+FLbM+nypGDPSdg7Ez7 3LN3Nz4unwpIOa3YNmucxxwMS186B34ilWidTsuFkOyYJe6avALhVfNSVxcw/AQFSsen UT6ycJw6mFjCLyqy2CFcbNkcS+TH+yNjUmihS1oEWUaHypRmVGvSYWyejEA9dgXUuKIM A8ZxjjpMTjl4mHmf4DAFjZuV2Fl9QeC4F0BAIvEMDokxtmhLYTCnaUh3kUyKYYYb/6gq Fe0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=2yPqNUssJAXAg475rCQOG3t1ZhLv0LHfwvqizitLbZM=; b=gPnyGfCH3YUpUEWcrcGYSTKrv9ENkxVmVksLBI4YzB/pxV5K5lD1aQo0b1wpcPoBeB vnAnvKmmrbJ5zcD26Mzh+/CxdTHBHSyOFUg/hGWU39dVDNwI7QWjIQlLFocWdnRHLnt7 lvz7gEWmoCpXk+tl8bEHobQEq1BvxltYgtj6qa0CeRP/0RRjl1UD2DFtztFIuYV4GW/M iCfKjqk2sqggEpwbNl/XULtopd1uOKrYix/nSvjhxH4FMnKcbeQDRwY/dDnYcY3buTPT G06wSYsNRa6ktjtgKFoT8IJDE38fGv4apG7DqoT8yxajvfTr/6UBX9Hzzp1rTqig1DDG zYkg== X-Gm-Message-State: AKS2vOwp2JjdfT8297mXz6agf7XLk/oLS1J5M4s87Es3h7A1NChCHN/p HA4dw/euPPXzV+VZ+5I= X-Received: by 10.84.224.74 with SMTP id a10mr3523820plt.219.1497635305140; Fri, 16 Jun 2017 10:48:25 -0700 (PDT) Received: from weiwan0.mtv.corp.google.com ([100.123.230.66]) by smtp.gmail.com with ESMTPSA id v62sm5292290pfb.124.2017.06.16.10.48.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 16 Jun 2017 10:48:24 -0700 (PDT) From: Wei Wang To: David Miller , netdev@vger.kernel.org Cc: Eric Dumazet , Martin KaFai Lau , Wei Wang Subject: [PATCH net-next 07/21] ipv4: call dst_dev_put() properly Date: Fri, 16 Jun 2017 10:47:30 -0700 Message-Id: <20170616174744.139688-8-tracywwnj@gmail.com> X-Mailer: git-send-email 2.13.1.518.g3df882009-goog In-Reply-To: <20170616174744.139688-1-tracywwnj@gmail.com> References: <20170616174744.139688-1-tracywwnj@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Wei Wang As the intend of this patch series is to completely remove dst gc, we need to call dst_dev_put() to release the reference to dst->dev when removing routes from fib because we won't keep the gc list anymore and will lose the dst pointer right after removing the routes. Without the gc list, there is no way to find all the dst's that have dst->dev pointing to the going-down dev. Hence, we are doing dst_dev_put() immediately before we lose the last reference of the dst from the routing code. The next dst_check() will trigger a route re-lookup to find another route (if there is any). Signed-off-by: Wei Wang Acked-by: Martin KaFai Lau --- net/ipv4/fib_semantics.c | 2 ++ net/ipv4/route.c | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index 53b3e9c2da4c..f163fa0a1164 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c @@ -152,6 +152,7 @@ static void rt_fibinfo_free(struct rtable __rcu **rtp) * free_fib_info_rcu() */ + dst_dev_put(&rt->dst); dst_release(&rt->dst); dst_free(&rt->dst); } @@ -196,6 +197,7 @@ static void rt_fibinfo_free_cpus(struct rtable __rcu * __percpu *rtp) rt = rcu_dereference_protected(*per_cpu_ptr(rtp, cpu), 1); if (rt) { + dst_dev_put(&rt->dst); dst_release(&rt->dst); dst_free(&rt->dst); } diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 3dee0043117e..d986d80258d2 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -603,12 +603,14 @@ static void fnhe_flush_routes(struct fib_nh_exception *fnhe) rt = rcu_dereference(fnhe->fnhe_rth_input); if (rt) { RCU_INIT_POINTER(fnhe->fnhe_rth_input, NULL); + dst_dev_put(&rt->dst); dst_release(&rt->dst); rt_free(rt); } rt = rcu_dereference(fnhe->fnhe_rth_output); if (rt) { RCU_INIT_POINTER(fnhe->fnhe_rth_output, NULL); + dst_dev_put(&rt->dst); dst_release(&rt->dst); rt_free(rt); } @@ -1337,6 +1339,7 @@ static bool rt_bind_exception(struct rtable *rt, struct fib_nh_exception *fnhe, dst_hold(&rt->dst); rcu_assign_pointer(*porig, rt); if (orig) { + dst_dev_put(&orig->dst); dst_release(&orig->dst); rt_free(orig); } @@ -1369,6 +1372,7 @@ static bool rt_cache_route(struct fib_nh *nh, struct rtable *rt) prev = cmpxchg(p, orig, rt); if (prev == orig) { if (orig) { + dst_dev_put(&orig->dst); dst_release(&orig->dst); rt_free(orig); }