Received: by 2002:a05:6a10:c7c6:0:0:0:0 with SMTP id h6csp1642308pxy; Mon, 2 Aug 2021 06:56:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzLvWMG3gcFO7znKWvoLl49T2WiDX8UDMDRK/m56i6xElc4xQMJXjQxt2EX9W4JstXAM55g X-Received: by 2002:a02:a797:: with SMTP id e23mr15215354jaj.121.1627912566892; Mon, 02 Aug 2021 06:56:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627912566; cv=none; d=google.com; s=arc-20160816; b=nR/HV2UR5w0JHXBeMlmt4036MkQ4FKtCpyHJqTHYsmb9n1soKYErlcYqbFBiogBGAE 07/jV1xtAwu/VKcmB5K1nppy43+QYVAlqnaZtYD1NeyYBnkroFmfO6L43OANQU61z5jx mDBlz04ykNeEyyR+IfiifpeTs1vic63QhScKJL9ko4cr3uUCB+dVZGWTF4PwPm1WAG9y ZEYVk9cqCLeieUHcy3FnF3R2wTEYq5DWZB5BVAn17o2/Jx8fQJ9QThFHqby6VWx3+nbe xqHv/olNQ9G4AVbQn5XL+AZxQkVEY00UFGaWmkzt4W3WPnUokWsQ6V/2gaU5feBRNRI2 cBXw== 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=HgSQmMCrOiAna/Eb0+S4wWULGZ9/EaPmDtbKyWxOMdw=; b=hDAoDAvLwBy8g7mEXm2ldTSYGequd5B7+yScoYN0sKibQ5HcOTq5o6vI9d52MfiKf/ iNN1tg584yyGZ3J8eqJwCiPcF594wAzR4CR2cAuzCxjzIe77rNt6kimqca3MMnEsOovG TuLJSvMi2DvvRlH5+bx+wbF4ODwAfaUl9M4BwV/Cq7VupQ2haYbBDDdRTz66jWkXOgc2 +iuROF4ByYy+lySnQU5bgTdpnoAS+D47lkoCntEw1sch2v7sQfu52ytRCUUxNZlba7Cx E0ItEwgoudo7U4c5rjuk5LmsNehN1YEQ4XpGyt/cPA0VPqQMYYofvBUidwX/gQLfID0R nYag== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Dcju4q+F; 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 b11si15739309ilj.10.2021.08.02.06.55.55; Mon, 02 Aug 2021 06:56:06 -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=Dcju4q+F; 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 S236139AbhHBNzA (ORCPT + 99 others); Mon, 2 Aug 2021 09:55:00 -0400 Received: from mail.kernel.org ([198.145.29.99]:33720 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234468AbhHBNuJ (ORCPT ); Mon, 2 Aug 2021 09:50:09 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 697F461100; Mon, 2 Aug 2021 13:49:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1627912199; bh=FndJ1ltxFPginKLxbfbbkoswSQLimv+mTAj00VtZxtU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Dcju4q+F66CEVY+PUE2xMquDsNMISDRNDaYyoBQbtxJmdO1B3jrcQyuIIfSafWCWW TijFj20vQRhWN5YbuWUJZDaopgZ/8C1S4Vn4k97UATR7a+AGvVutDQzEUpDBOSUy9E 6dpQN9vWeMd+f2YFMZWFXULpQ5Rnr/CjgwwEAdiU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Maor Gottlieb , Mark Bloch , Saeed Mahameed , Sasha Levin Subject: [PATCH 4.19 23/30] net/mlx5: Fix flow table chaining Date: Mon, 2 Aug 2021 15:45:01 +0200 Message-Id: <20210802134334.811360207@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210802134334.081433902@linuxfoundation.org> References: <20210802134334.081433902@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: Maor Gottlieb [ Upstream commit 8b54874ef1617185048029a3083d510569e93751 ] Fix a bug when flow table is created in priority that already has other flow tables as shown in the below diagram. If the new flow table (FT-B) has the lowest level in the priority, we need to connect the flow tables from the previous priority (p0) to this new table. In addition when this flow table is destroyed (FT-B), we need to connect the flow tables from the previous priority (p0) to the next level flow table (FT-C) in the same priority of the destroyed table (if exists). --------- |root_ns| --------- | -------------------------------- | | | ---------- ---------- --------- |p(prio)-x| | p-y | | p-n | ---------- ---------- --------- | | ---------------- ------------------ |ns(e.g bypass)| |ns(e.g. kernel) | ---------------- ------------------ | | | ------- ------ ---- | p0 | | p1 | |p2| ------- ------ ---- | | \ -------- ------- ------ | FT-A | |FT-B | |FT-C| -------- ------- ------ Fixes: f90edfd279f3 ("net/mlx5_core: Connect flow tables") Signed-off-by: Maor Gottlieb Reviewed-by: Mark Bloch Signed-off-by: Saeed Mahameed Signed-off-by: Sasha Levin --- drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c index a38a0c86705a..774f0a619a6d 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c @@ -904,17 +904,19 @@ static int connect_fwd_rules(struct mlx5_core_dev *dev, static int connect_flow_table(struct mlx5_core_dev *dev, struct mlx5_flow_table *ft, struct fs_prio *prio) { - struct mlx5_flow_table *next_ft; + struct mlx5_flow_table *next_ft, *first_ft; int err = 0; /* Connect_prev_fts and update_root_ft_create are mutually exclusive */ - if (list_empty(&prio->node.children)) { + first_ft = list_first_entry_or_null(&prio->node.children, + struct mlx5_flow_table, node.list); + if (!first_ft || first_ft->level > ft->level) { err = connect_prev_fts(dev, ft, prio); if (err) return err; - next_ft = find_next_chained_ft(prio); + next_ft = first_ft ? first_ft : find_next_chained_ft(prio); err = connect_fwd_rules(dev, ft, next_ft); if (err) return err; @@ -1945,7 +1947,7 @@ static int disconnect_flow_table(struct mlx5_flow_table *ft) node.list) == ft)) return 0; - next_ft = find_next_chained_ft(prio); + next_ft = find_next_ft(ft); err = connect_fwd_rules(dev, next_ft, ft); if (err) return err; -- 2.30.2