Received: by 2002:a25:683:0:0:0:0:0 with SMTP id 125csp689743ybg; Mon, 1 Jun 2020 11:45:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz8MyoqwQkvrAhmuuIGedBOde409wMyJl2yJZnpmgRpCtqQ5sJJOXu0EJ5lZKDuHVgvJPrR X-Received: by 2002:a50:cd56:: with SMTP id d22mr10821871edj.374.1591037140975; Mon, 01 Jun 2020 11:45:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1591037140; cv=none; d=google.com; s=arc-20160816; b=qZ9IBxQJZ1WD9mP5risOOzR/e5dUo7XC4mmwOUUpjfya6MoVD03hGIISv8jd52xzuE otGhHRfBQb2Igik9OexeCN4h+Mlshddmf92VdE+yEfAj8i6A75H6D0UDgIMScJqBgtBp /HMbWVZtICuFXqqJDHpCRfBYma1EfTQR86iGAkkPgZV4rRdQGciVRMxPd8wMv4XmqZ6+ gGPr69oohYe5W3TMheozNUdoGa41t2W+1Cc4C/roftoVtqnkX1NY+CJ9XlKCO1lOoWdF XqaQY2bQOhGmCobwMDDrfzlYDeTPypImfvxus1johL2laXRXDpmawyXQUCHnunxRPt2M cvjg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=Vch2/sSEt0Om8HwM20ExBDSAP05Bd4lEhqp2n3rtGTM=; b=m7Zul6LOH3sB2fzrR5IIg3S+kCjcp6EFXTmNrkOvZQ+W9uJpvTejyXgCVEC1vQXV0T d0zmYoWm9JSJOcQCxTJVmamPA2+C3Cjn/cJD/e638AgNSiAShBxpxXiZDGzv/p29CtxH b36aGysx0M70z1GLY0whM4xDtY/fRGtnitb1P1Q2j0238L1UrUcV7vnVlxQZ4q/Q7cyk oB82SMYkiSFWtpqZg/SZXpNPyJ7qA9Q1VrF8u9+nBzb9rvb+n8d/BGIypku63/BqFARR iINp9yRHn/W6UlXX0WHcYQUkDMflJLrLUZ0IB1qGaHI2uAO8tkf+cG0uk7DQpd3XKQ9W uQug== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=NHfp623Q; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id zo8si197384ejb.156.2020.06.01.11.45.17; Mon, 01 Jun 2020 11:45:40 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=NHfp623Q; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731055AbgFASLT (ORCPT + 99 others); Mon, 1 Jun 2020 14:11:19 -0400 Received: from mail.kernel.org ([198.145.29.99]:58112 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730157AbgFASLD (ORCPT ); Mon, 1 Jun 2020 14:11:03 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id F01872065C; Mon, 1 Jun 2020 18:11:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1591035062; bh=/ueERacqKCvBCeDX7uFQVBAHO7WaNeHHjAAedKNnKy0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NHfp623QL68eCP9ZvpVcRmERESZnIj+En0Z/SmfaLme8udD8q9+tq4s1EqsdN1qS0 ENSklH2IdBw1LUoe7eNP9xnNr3ycS0Ca7PWp7ixHpwB20j3Ig3lCvrBky9hy3icBIn nmaCBtuyVqzxqyuUXlxgiubF9XtGaxbWkx9rBMTc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, David Ahern , Nikolay Aleksandrov , "David S. Miller" Subject: [PATCH 5.4 134/142] nexthop: Expand nexthop_is_multipath in a few places Date: Mon, 1 Jun 2020 19:54:52 +0200 Message-Id: <20200601174051.606199324@linuxfoundation.org> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200601174037.904070960@linuxfoundation.org> References: <20200601174037.904070960@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: David Ahern commit 0b5e2e39739e861fa5fc84ab27a35dbe62a15330 upstream. I got too fancy consolidating checks on multipath type. The result is that path lookups can access 2 different nh_grp structs as exposed by Nik's torture tests. Expand nexthop_is_multipath within nexthop.h to avoid multiple, nh_grp dereferences and make decisions based on the consistent struct. Only 2 places left using nexthop_is_multipath are within IPv6, both only check that the nexthop is a multipath for a branching decision which are acceptable. Fixes: 430a049190de ("nexthop: Add support for nexthop groups") Signed-off-by: David Ahern Acked-by: Nikolay Aleksandrov Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- include/net/nexthop.h | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) --- a/include/net/nexthop.h +++ b/include/net/nexthop.h @@ -137,21 +137,20 @@ static inline unsigned int nexthop_num_p { unsigned int rc = 1; - if (nexthop_is_multipath(nh)) { + if (nh->is_group) { struct nh_group *nh_grp; nh_grp = rcu_dereference_rtnl(nh->nh_grp); - rc = nh_grp->num_nh; + if (nh_grp->mpath) + rc = nh_grp->num_nh; } return rc; } static inline -struct nexthop *nexthop_mpath_select(const struct nexthop *nh, int nhsel) +struct nexthop *nexthop_mpath_select(const struct nh_group *nhg, int nhsel) { - const struct nh_group *nhg = rcu_dereference_rtnl(nh->nh_grp); - /* for_nexthops macros in fib_semantics.c grabs a pointer to * the nexthop before checking nhsel */ @@ -186,12 +185,14 @@ static inline bool nexthop_is_blackhole( { const struct nh_info *nhi; - if (nexthop_is_multipath(nh)) { - if (nexthop_num_path(nh) > 1) - return false; - nh = nexthop_mpath_select(nh, 0); - if (!nh) + if (nh->is_group) { + struct nh_group *nh_grp; + + nh_grp = rcu_dereference_rtnl(nh->nh_grp); + if (nh_grp->num_nh > 1) return false; + + nh = nh_grp->nh_entries[0].nh; } nhi = rcu_dereference_rtnl(nh->nh_info); @@ -217,10 +218,15 @@ struct fib_nh_common *nexthop_fib_nhc(st BUILD_BUG_ON(offsetof(struct fib_nh, nh_common) != 0); BUILD_BUG_ON(offsetof(struct fib6_nh, nh_common) != 0); - if (nexthop_is_multipath(nh)) { - nh = nexthop_mpath_select(nh, nhsel); - if (!nh) - return NULL; + if (nh->is_group) { + struct nh_group *nh_grp; + + nh_grp = rcu_dereference_rtnl(nh->nh_grp); + if (nh_grp->mpath) { + nh = nexthop_mpath_select(nh_grp, nhsel); + if (!nh) + return NULL; + } } nhi = rcu_dereference_rtnl(nh->nh_info); @@ -264,8 +270,11 @@ static inline struct fib6_nh *nexthop_fi { struct nh_info *nhi; - if (nexthop_is_multipath(nh)) { - nh = nexthop_mpath_select(nh, 0); + if (nh->is_group) { + struct nh_group *nh_grp; + + nh_grp = rcu_dereference_rtnl(nh->nh_grp); + nh = nexthop_mpath_select(nh_grp, 0); if (!nh) return NULL; }