Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2465171pxj; Mon, 10 May 2021 03:45:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzfCHuYNvAMBmFRYF8r1/CkoS2pIMTSIlE6P1rsZMBMTN0BS2dydHngbZtUYRVW6idTiPpj X-Received: by 2002:a5d:87d1:: with SMTP id q17mr17228058ios.82.1620643525132; Mon, 10 May 2021 03:45:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620643525; cv=none; d=google.com; s=arc-20160816; b=Z47Se/hmogHDigDYXnrrvQJpUJ211EzeCAj9zRuVvZamRBCKSXXz8NLeErjgIzWQQp ifRXOQNbBhjzUS79F3Ki2pRK5uPljbVOybR9VxMXxN5ypAGtQDgK47aJQ1N2qh6mKmbi 2lL83gJf+j88/O//CvFVL7bQaHdTKUf6FXUdtpDRDvYHEAnqrVHYTY5b66ny2cItxrXr SAw89Sl2yiggpiYQVNK6LCl3ac1BNRlgliEpx32EpjcntA3yD/g4FQlCVjDiY1+vYj9c lEr+zSY+yl8WiEBtldDqB3fNH+ocFIxylZPhSmPWK6HSciINGx60dC3P9Hqmvgx6tiFP brzA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=gOF/q3PgZBvOxPNRSb/NL8SEiYhNGx/MYtiKbhdrwSY=; b=RGKCTr6D7IXZyJOKxEjX974yrMNr37EwF2gjBYzfMubNmjgTLtWcoy6Kz6pGjXWKHO Lu8o4WDKMCKaXOwg/yD7JBOawRTZM640eIRyVI/zGE+UAgIAM6o1A3EUYsBQEkTJVlo9 sEhDwo7QRa68UzLRmnawmOYGUhxTC5VHmzHrpQDN3qwk8G5OexUlcNySTmI5HLx5Pmdl 6vn8tJxWW7Gga43IPWanFp7aIURM4nrlYEkIb1vvOO3EmE8/vBd/gJvJna+Fkmwd31CR PwSqa2ZYNE3Jjbz4gnTOQDwNagY6z6GcnMUEFX9rdS4pMokNabjAoLi4WnavkgY3D66B 8O2Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=E9WTpHlE; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s201si13566256ios.76.2021.05.10.03.45.11; Mon, 10 May 2021 03:45:25 -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=@linuxfoundation.org header.s=korg header.b=E9WTpHlE; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232959AbhEJKou (ORCPT + 99 others); Mon, 10 May 2021 06:44:50 -0400 Received: from mail.kernel.org ([198.145.29.99]:41322 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232257AbhEJKgL (ORCPT ); Mon, 10 May 2021 06:36:11 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 5C7C161458; Mon, 10 May 2021 10:29:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620642550; bh=SYlE30wYHz6hoXRJYV9/E8DRKDkO1zINApCXxlEA6H0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=E9WTpHlEt+XC5ZkA+aPpC9yUnPzTAaCljOz/1vK85K47fE/Oh/yM2RF93n34uSxAs aeL35Q6UkiHP18IRN2AnRZ4aa+q0GHeMO2L7mHX10rQMUrIUwsEn4JErShHDOef1WB pv20u5GbA9ErqQcHa1wDpjGRLrHwSpYuapXm9RY8= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ido Schimmel , Petr Machata , Jakub Kicinski Subject: [PATCH 5.4 141/184] mlxsw: spectrum_mr: Update egress RIF list before routes action Date: Mon, 10 May 2021 12:20:35 +0200 Message-Id: <20210510101954.763919966@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210510101950.200777181@linuxfoundation.org> References: <20210510101950.200777181@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ido Schimmel commit cbaf3f6af9c268caf558c8e7ec52bcb35c5455dd upstream. Each multicast route that is forwarding packets (as opposed to trapping them) points to a list of egress router interfaces (RIFs) through which packets are replicated. A route's action can transition from trap to forward when a RIF is created for one of the route's egress virtual interfaces (eVIF). When this happens, the route's action is first updated and only later the list of egress RIFs is committed to the device. This results in the route pointing to an invalid list. In case the list pointer is out of range (due to uninitialized memory), the device will complain: mlxsw_spectrum2 0000:06:00.0: EMAD reg access failed (tid=5733bf490000905c,reg_id=300f(pefa),type=write,status=7(bad parameter)) Fix this by first committing the list of egress RIFs to the device and only later update the route's action. Note that a fix is not needed in the reverse function (i.e., mlxsw_sp_mr_route_evif_unresolve()), as there the route's action is first updated and only later the RIF is removed from the list. Cc: stable@vger.kernel.org Fixes: c011ec1bbfd6 ("mlxsw: spectrum: Add the multicast routing offloading logic") Signed-off-by: Ido Schimmel Reviewed-by: Petr Machata Link: https://lore.kernel.org/r/20210506072308.3834303-1-idosch@idosch.org Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.c | 30 +++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.c @@ -524,6 +524,16 @@ mlxsw_sp_mr_route_evif_resolve(struct ml u16 erif_index = 0; int err; + /* Add the eRIF */ + if (mlxsw_sp_mr_vif_valid(rve->mr_vif)) { + erif_index = mlxsw_sp_rif_index(rve->mr_vif->rif); + err = mr->mr_ops->route_erif_add(mlxsw_sp, + rve->mr_route->route_priv, + erif_index); + if (err) + return err; + } + /* Update the route action, as the new eVIF can be a tunnel or a pimreg * device which will require updating the action. */ @@ -533,17 +543,7 @@ mlxsw_sp_mr_route_evif_resolve(struct ml rve->mr_route->route_priv, route_action); if (err) - return err; - } - - /* Add the eRIF */ - if (mlxsw_sp_mr_vif_valid(rve->mr_vif)) { - erif_index = mlxsw_sp_rif_index(rve->mr_vif->rif); - err = mr->mr_ops->route_erif_add(mlxsw_sp, - rve->mr_route->route_priv, - erif_index); - if (err) - goto err_route_erif_add; + goto err_route_action_update; } /* Update the minimum MTU */ @@ -561,14 +561,14 @@ mlxsw_sp_mr_route_evif_resolve(struct ml return 0; err_route_min_mtu_update: - if (mlxsw_sp_mr_vif_valid(rve->mr_vif)) - mr->mr_ops->route_erif_del(mlxsw_sp, rve->mr_route->route_priv, - erif_index); -err_route_erif_add: if (route_action != rve->mr_route->route_action) mr->mr_ops->route_action_update(mlxsw_sp, rve->mr_route->route_priv, rve->mr_route->route_action); +err_route_action_update: + if (mlxsw_sp_mr_vif_valid(rve->mr_vif)) + mr->mr_ops->route_erif_del(mlxsw_sp, rve->mr_route->route_priv, + erif_index); return err; }