netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2
@ 2020-11-17 17:46 Ido Schimmel
  2020-11-17 17:46 ` [PATCH net-next 1/9] mlxsw: spectrum_router: Fix wrong kfree() in error path Ido Schimmel
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Ido Schimmel @ 2020-11-17 17:46 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, jiri, dsahern, mlxsw, Ido Schimmel

From: Ido Schimmel <idosch@nvidia.com>

This patch set contains the second round of preparations towards nexthop
objects support in mlxsw. Follow up patches can be found here [1].

The patches are mostly small and trivial and contain non-functional
changes aimed at making it easier to integrate nexthop objects with
mlxsw.

Patch #1 is a fix for an issue introduced in previous submission. Found
by Coverity.

[1] https://github.com/idosch/linux/tree/submit/nexthop_objects

Ido Schimmel (9):
  mlxsw: spectrum_router: Fix wrong kfree() in error path
  mlxsw: spectrum_router: Set ifindex for IPv4 nexthops
  mlxsw: spectrum_router: Pass ifindex to
    mlxsw_sp_ipip_entry_find_by_decap()
  mlxsw: spectrum_router: Set FIB entry's type after creating nexthop
    group
  mlxsw: spectrum_router: Set FIB entry's type based on nexthop group
  mlxsw: spectrum_router: Re-order mlxsw_sp_nexthop6_group_get()
  mlxsw: spectrum_router: Only clear offload indication from valid IPv6
    FIB info
  mlxsw: spectrum_router: Add an indication if a nexthop group can be
    destroyed
  mlxsw: spectrum_router: Allow returning errors from
    mlxsw_sp_nexthop_group_refresh()

 .../ethernet/mellanox/mlxsw/spectrum_router.c | 103 ++++++++++++------
 1 file changed, 67 insertions(+), 36 deletions(-)

-- 
2.28.0


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH net-next 1/9] mlxsw: spectrum_router: Fix wrong kfree() in error path
  2020-11-17 17:46 [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2 Ido Schimmel
@ 2020-11-17 17:46 ` Ido Schimmel
  2020-11-17 17:46 ` [PATCH net-next 2/9] mlxsw: spectrum_router: Set ifindex for IPv4 nexthops Ido Schimmel
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Ido Schimmel @ 2020-11-17 17:46 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, jiri, dsahern, mlxsw, Ido Schimmel

From: Ido Schimmel <idosch@nvidia.com>

The function allocates 'nhgi', not 'nh_grp', so it needs to free the
former in its error path.

Fixes: 7f7a417e6a11 ("mlxsw: spectrum_router: Split nexthop group configuration to a different struct")
Addresses-Coverity: ("Memory - corruptions  (USE_AFTER_FREE)")
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
---
 drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index a2e81ad5790f..7dbf02f45913 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -5423,7 +5423,7 @@ mlxsw_sp_nexthop6_group_info_init(struct mlxsw_sp *mlxsw_sp,
 		nh = &nhgi->nexthops[i];
 		mlxsw_sp_nexthop6_fini(mlxsw_sp, nh);
 	}
-	kfree(nh_grp);
+	kfree(nhgi);
 	return err;
 }
 
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH net-next 2/9] mlxsw: spectrum_router: Set ifindex for IPv4 nexthops
  2020-11-17 17:46 [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2 Ido Schimmel
  2020-11-17 17:46 ` [PATCH net-next 1/9] mlxsw: spectrum_router: Fix wrong kfree() in error path Ido Schimmel
@ 2020-11-17 17:46 ` Ido Schimmel
  2020-11-17 17:46 ` [PATCH net-next 3/9] mlxsw: spectrum_router: Pass ifindex to mlxsw_sp_ipip_entry_find_by_decap() Ido Schimmel
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Ido Schimmel @ 2020-11-17 17:46 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, jiri, dsahern, mlxsw, Ido Schimmel

From: Ido Schimmel <idosch@nvidia.com>

The ifindex of the nexthop device was never set for IPv4 nexthops,
unlike IPv6 nexthops. This went unnoticed since only IPv6 nexthops use
it.

Set the ifindex for IPv4 nexthops in order to be consistent with IPv6
and also because it will be used by a later patch.

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
---
 drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index 7dbf02f45913..1ea338786479 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -3971,6 +3971,7 @@ static int mlxsw_sp_nexthop4_init(struct mlxsw_sp *mlxsw_sp,
 
 	if (!dev)
 		return 0;
+	nh->ifindex = dev->ifindex;
 
 	rcu_read_lock();
 	in_dev = __in_dev_get_rcu(dev);
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH net-next 3/9] mlxsw: spectrum_router: Pass ifindex to mlxsw_sp_ipip_entry_find_by_decap()
  2020-11-17 17:46 [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2 Ido Schimmel
  2020-11-17 17:46 ` [PATCH net-next 1/9] mlxsw: spectrum_router: Fix wrong kfree() in error path Ido Schimmel
  2020-11-17 17:46 ` [PATCH net-next 2/9] mlxsw: spectrum_router: Set ifindex for IPv4 nexthops Ido Schimmel
@ 2020-11-17 17:46 ` Ido Schimmel
  2020-11-17 17:46 ` [PATCH net-next 4/9] mlxsw: spectrum_router: Set FIB entry's type after creating nexthop group Ido Schimmel
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Ido Schimmel @ 2020-11-17 17:46 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, jiri, dsahern, mlxsw, Ido Schimmel

From: Ido Schimmel <idosch@nvidia.com>

The sole caller of the function will soon only have the ifindex
available, instead of the pointer itself.

Therefore, change the function to take the ifindex as input and have it
get the pointer.

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
---
 .../ethernet/mellanox/mlxsw/spectrum_router.c | 24 ++++++++++++++-----
 1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index 1ea338786479..89b44dc543a5 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -1353,21 +1353,33 @@ mlxsw_sp_ipip_entry_matches_decap(struct mlxsw_sp *mlxsw_sp,
 
 /* Given decap parameters, find the corresponding IPIP entry. */
 static struct mlxsw_sp_ipip_entry *
-mlxsw_sp_ipip_entry_find_by_decap(struct mlxsw_sp *mlxsw_sp,
-				  const struct net_device *ul_dev,
+mlxsw_sp_ipip_entry_find_by_decap(struct mlxsw_sp *mlxsw_sp, int ul_dev_ifindex,
 				  enum mlxsw_sp_l3proto ul_proto,
 				  union mlxsw_sp_l3addr ul_dip)
 {
-	struct mlxsw_sp_ipip_entry *ipip_entry;
+	struct mlxsw_sp_ipip_entry *ipip_entry = NULL;
+	struct net_device *ul_dev;
+
+	rcu_read_lock();
+
+	ul_dev = dev_get_by_index_rcu(mlxsw_sp_net(mlxsw_sp), ul_dev_ifindex);
+	if (!ul_dev)
+		goto out_unlock;
 
 	list_for_each_entry(ipip_entry, &mlxsw_sp->router->ipip_list,
 			    ipip_list_node)
 		if (mlxsw_sp_ipip_entry_matches_decap(mlxsw_sp, ul_dev,
 						      ul_proto, ul_dip,
 						      ipip_entry))
-			return ipip_entry;
+			goto out_unlock;
+
+	rcu_read_unlock();
 
 	return NULL;
+
+out_unlock:
+	rcu_read_unlock();
+	return ipip_entry;
 }
 
 static bool mlxsw_sp_netdev_ipip_type(const struct mlxsw_sp *mlxsw_sp,
@@ -4775,8 +4787,8 @@ mlxsw_sp_fib4_entry_type_set(struct mlxsw_sp *mlxsw_sp,
 
 	switch (fen_info->type) {
 	case RTN_LOCAL:
-		ipip_entry = mlxsw_sp_ipip_entry_find_by_decap(mlxsw_sp, dev,
-						 MLXSW_SP_L3_PROTO_IPV4, dip);
+		ipip_entry = mlxsw_sp_ipip_entry_find_by_decap(mlxsw_sp, dev->ifindex,
+							       MLXSW_SP_L3_PROTO_IPV4, dip);
 		if (ipip_entry && ipip_entry->ol_dev->flags & IFF_UP) {
 			fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_IPIP_DECAP;
 			return mlxsw_sp_fib_entry_decap_init(mlxsw_sp,
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH net-next 4/9] mlxsw: spectrum_router: Set FIB entry's type after creating nexthop group
  2020-11-17 17:46 [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2 Ido Schimmel
                   ` (2 preceding siblings ...)
  2020-11-17 17:46 ` [PATCH net-next 3/9] mlxsw: spectrum_router: Pass ifindex to mlxsw_sp_ipip_entry_find_by_decap() Ido Schimmel
@ 2020-11-17 17:46 ` Ido Schimmel
  2020-11-17 17:47 ` [PATCH net-next 5/9] mlxsw: spectrum_router: Set FIB entry's type based on " Ido Schimmel
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Ido Schimmel @ 2020-11-17 17:46 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, jiri, dsahern, mlxsw, Ido Schimmel

From: Ido Schimmel <idosch@nvidia.com>

Each FIB entry has a type (e.g., remote, local) that determines how the
entry is programmed to the device. In order to determine if the entry is
local (directly connected) or remote (has a gateway) the relevant FIB
info structures (e.g., 'struct fib_info') are checked.

When entries that use nexthop objects are supported, these checks will
need to be changed to take into account 'struct nexthop'.

Instead, first associate the entry with a nexthop group so that the next
patch could determine the entry's type based on the associated nexthop
group's type.

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
---
 .../ethernet/mellanox/mlxsw/spectrum_router.c  | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index 89b44dc543a5..c791e7f75cca 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -4864,14 +4864,14 @@ mlxsw_sp_fib4_entry_create(struct mlxsw_sp *mlxsw_sp,
 		goto err_fib_entry_priv_create;
 	}
 
-	err = mlxsw_sp_fib4_entry_type_set(mlxsw_sp, fen_info, fib_entry);
-	if (err)
-		goto err_fib4_entry_type_set;
-
 	err = mlxsw_sp_nexthop4_group_get(mlxsw_sp, fib_entry, fen_info->fi);
 	if (err)
 		goto err_nexthop4_group_get;
 
+	err = mlxsw_sp_fib4_entry_type_set(mlxsw_sp, fen_info, fib_entry);
+	if (err)
+		goto err_fib4_entry_type_set;
+
 	fib4_entry->fi = fen_info->fi;
 	fib_info_hold(fib4_entry->fi);
 	fib4_entry->tb_id = fen_info->tb_id;
@@ -4882,9 +4882,9 @@ mlxsw_sp_fib4_entry_create(struct mlxsw_sp *mlxsw_sp,
 
 	return fib4_entry;
 
-err_nexthop4_group_get:
-	mlxsw_sp_fib4_entry_type_unset(mlxsw_sp, fib_entry);
 err_fib4_entry_type_set:
+	mlxsw_sp_nexthop4_group_put(mlxsw_sp, &fib4_entry->common);
+err_nexthop4_group_get:
 	mlxsw_sp_fib_entry_priv_put(fib_entry->priv);
 err_fib_entry_priv_create:
 	kfree(fib4_entry);
@@ -4895,8 +4895,8 @@ static void mlxsw_sp_fib4_entry_destroy(struct mlxsw_sp *mlxsw_sp,
 					struct mlxsw_sp_fib4_entry *fib4_entry)
 {
 	fib_info_put(fib4_entry->fi);
-	mlxsw_sp_nexthop4_group_put(mlxsw_sp, &fib4_entry->common);
 	mlxsw_sp_fib4_entry_type_unset(mlxsw_sp, &fib4_entry->common);
+	mlxsw_sp_nexthop4_group_put(mlxsw_sp, &fib4_entry->common);
 	mlxsw_sp_fib_entry_priv_put(fib4_entry->common.priv);
 	kfree(fib4_entry);
 }
@@ -5692,12 +5692,12 @@ mlxsw_sp_fib6_entry_create(struct mlxsw_sp *mlxsw_sp,
 		fib6_entry->nrt6++;
 	}
 
-	mlxsw_sp_fib6_entry_type_set(mlxsw_sp, fib_entry, rt_arr[0]);
-
 	err = mlxsw_sp_nexthop6_group_get(mlxsw_sp, fib6_entry);
 	if (err)
 		goto err_nexthop6_group_get;
 
+	mlxsw_sp_fib6_entry_type_set(mlxsw_sp, fib_entry, rt_arr[0]);
+
 	fib_entry->fib_node = fib_node;
 
 	return fib6_entry;
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH net-next 5/9] mlxsw: spectrum_router: Set FIB entry's type based on nexthop group
  2020-11-17 17:46 [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2 Ido Schimmel
                   ` (3 preceding siblings ...)
  2020-11-17 17:46 ` [PATCH net-next 4/9] mlxsw: spectrum_router: Set FIB entry's type after creating nexthop group Ido Schimmel
@ 2020-11-17 17:47 ` Ido Schimmel
  2020-11-17 17:47 ` [PATCH net-next 6/9] mlxsw: spectrum_router: Re-order mlxsw_sp_nexthop6_group_get() Ido Schimmel
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Ido Schimmel @ 2020-11-17 17:47 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, jiri, dsahern, mlxsw, Ido Schimmel

From: Ido Schimmel <idosch@nvidia.com>

The previous patch associated a nexthop group with the FIB entry before
the entry's type is determined.

Make use of the nexthop group when determining the entry's type instead
of relying on helpers that assume that the nexthop info is not a nexthop
object (i.e., 'struct nexthop').

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
---
 drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index c791e7f75cca..4f5c135bc587 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -4778,16 +4778,16 @@ mlxsw_sp_fib4_entry_type_set(struct mlxsw_sp *mlxsw_sp,
 			     const struct fib_entry_notifier_info *fen_info,
 			     struct mlxsw_sp_fib_entry *fib_entry)
 {
-	struct net_device *dev = fib_info_nh(fen_info->fi, 0)->fib_nh_dev;
+	struct mlxsw_sp_nexthop_group_info *nhgi = fib_entry->nh_group->nhgi;
 	union mlxsw_sp_l3addr dip = { .addr4 = htonl(fen_info->dst) };
 	struct mlxsw_sp_router *router = mlxsw_sp->router;
 	u32 tb_id = mlxsw_sp_fix_tb_id(fen_info->tb_id);
+	int ifindex = nhgi->nexthops[0].ifindex;
 	struct mlxsw_sp_ipip_entry *ipip_entry;
-	struct fib_info *fi = fen_info->fi;
 
 	switch (fen_info->type) {
 	case RTN_LOCAL:
-		ipip_entry = mlxsw_sp_ipip_entry_find_by_decap(mlxsw_sp, dev->ifindex,
+		ipip_entry = mlxsw_sp_ipip_entry_find_by_decap(mlxsw_sp, ifindex,
 							       MLXSW_SP_L3_PROTO_IPV4, dip);
 		if (ipip_entry && ipip_entry->ol_dev->flags & IFF_UP) {
 			fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_IPIP_DECAP;
@@ -4821,7 +4821,7 @@ mlxsw_sp_fib4_entry_type_set(struct mlxsw_sp *mlxsw_sp,
 		fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_UNREACHABLE;
 		return 0;
 	case RTN_UNICAST:
-		if (mlxsw_sp_fi_is_gateway(mlxsw_sp, fi))
+		if (nhgi->gateway)
 			fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_REMOTE;
 		else
 			fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_LOCAL;
@@ -5640,7 +5640,7 @@ static void mlxsw_sp_fib6_entry_type_set(struct mlxsw_sp *mlxsw_sp,
 		fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_BLACKHOLE;
 	else if (rt->fib6_flags & RTF_REJECT)
 		fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_UNREACHABLE;
-	else if (mlxsw_sp_rt6_is_gateway(mlxsw_sp, rt))
+	else if (fib_entry->nh_group->nhgi->gateway)
 		fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_REMOTE;
 	else
 		fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_LOCAL;
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH net-next 6/9] mlxsw: spectrum_router: Re-order mlxsw_sp_nexthop6_group_get()
  2020-11-17 17:46 [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2 Ido Schimmel
                   ` (4 preceding siblings ...)
  2020-11-17 17:47 ` [PATCH net-next 5/9] mlxsw: spectrum_router: Set FIB entry's type based on " Ido Schimmel
@ 2020-11-17 17:47 ` Ido Schimmel
  2020-11-17 17:47 ` [PATCH net-next 7/9] mlxsw: spectrum_router: Only clear offload indication from valid IPv6 FIB info Ido Schimmel
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Ido Schimmel @ 2020-11-17 17:47 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, jiri, dsahern, mlxsw, Ido Schimmel

From: Ido Schimmel <idosch@nvidia.com>

Attach the FIB entry to the nexthop group after setting the offload flag
on the IPv6 FIB info (i.e., 'struct fib6_info'). The second operation is
not needed when the nexthop group is a nexthop object. This will allow
us to have a common exit path from the function, regardless of the
nexthop group's type.

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
---
 drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index 4f5c135bc587..49cd6eba0661 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -5508,15 +5508,15 @@ static int mlxsw_sp_nexthop6_group_get(struct mlxsw_sp *mlxsw_sp,
 			return PTR_ERR(nh_grp);
 	}
 
-	list_add_tail(&fib6_entry->common.nexthop_group_node,
-		      &nh_grp->fib_list);
-	fib6_entry->common.nh_group = nh_grp;
-
 	/* The route and the nexthop are described by the same struct, so we
 	 * need to the update the nexthop offload indication for the new route.
 	 */
 	__mlxsw_sp_nexthop6_group_offload_refresh(nh_grp, fib6_entry);
 
+	list_add_tail(&fib6_entry->common.nexthop_group_node,
+		      &nh_grp->fib_list);
+	fib6_entry->common.nh_group = nh_grp;
+
 	return 0;
 }
 
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH net-next 7/9] mlxsw: spectrum_router: Only clear offload indication from valid IPv6 FIB info
  2020-11-17 17:46 [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2 Ido Schimmel
                   ` (5 preceding siblings ...)
  2020-11-17 17:47 ` [PATCH net-next 6/9] mlxsw: spectrum_router: Re-order mlxsw_sp_nexthop6_group_get() Ido Schimmel
@ 2020-11-17 17:47 ` Ido Schimmel
  2020-11-17 17:47 ` [PATCH net-next 8/9] mlxsw: spectrum_router: Add an indication if a nexthop group can be destroyed Ido Schimmel
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Ido Schimmel @ 2020-11-17 17:47 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, jiri, dsahern, mlxsw, Ido Schimmel

From: Ido Schimmel <idosch@nvidia.com>

When the IPv6 FIB info has a nexthop object, the nexthop offload
indication is set on the nexthop object and not on the FIB info itself.

Therefore, do not try to clear the offload indication from the FIB info
when it has a nexthop object.

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
---
 drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index 49cd6eba0661..645ec70314d2 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -5324,7 +5324,8 @@ static void mlxsw_sp_rt6_destroy(struct mlxsw_sp_rt6 *mlxsw_sp_rt6)
 {
 	struct fib6_nh *fib6_nh = mlxsw_sp_rt6->rt->fib6_nh;
 
-	fib6_nh->fib_nh_flags &= ~RTNH_F_OFFLOAD;
+	if (!mlxsw_sp_rt6->rt->nh)
+		fib6_nh->fib_nh_flags &= ~RTNH_F_OFFLOAD;
 	mlxsw_sp_rt6_release(mlxsw_sp_rt6->rt);
 	kfree(mlxsw_sp_rt6);
 }
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH net-next 8/9] mlxsw: spectrum_router: Add an indication if a nexthop group can be destroyed
  2020-11-17 17:46 [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2 Ido Schimmel
                   ` (6 preceding siblings ...)
  2020-11-17 17:47 ` [PATCH net-next 7/9] mlxsw: spectrum_router: Only clear offload indication from valid IPv6 FIB info Ido Schimmel
@ 2020-11-17 17:47 ` Ido Schimmel
  2020-11-17 17:47 ` [PATCH net-next 9/9] mlxsw: spectrum_router: Allow returning errors from mlxsw_sp_nexthop_group_refresh() Ido Schimmel
  2020-11-18 20:00 ` [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2 patchwork-bot+netdevbpf
  9 siblings, 0 replies; 11+ messages in thread
From: Ido Schimmel @ 2020-11-17 17:47 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, jiri, dsahern, mlxsw, Ido Schimmel

From: Ido Schimmel <idosch@nvidia.com>

Currently, a nexthop group is destroyed when the last FIB entry is
detached from it.

When nexthop objects are supported, this can no longer be the case, as
the group is a separate object whose lifetime is managed by user space.

Add an indication if a nexthop group can be destroyed and always set it
to true for the existing IPv4 and IPv6 nexthop groups.

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
---
 drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index 645ec70314d2..87b8c8db688b 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -2897,6 +2897,7 @@ struct mlxsw_sp_nexthop_group {
 	};
 	struct mlxsw_sp_nexthop_group_info *nhgi;
 	enum mlxsw_sp_nexthop_group_type type;
+	bool can_destroy;
 };
 
 void mlxsw_sp_nexthop_counter_alloc(struct mlxsw_sp *mlxsw_sp,
@@ -4173,6 +4174,8 @@ mlxsw_sp_nexthop4_group_create(struct mlxsw_sp *mlxsw_sp, struct fib_info *fi)
 	if (err)
 		goto err_nexthop_group_insert;
 
+	nh_grp->can_destroy = true;
+
 	return nh_grp;
 
 err_nexthop_group_insert:
@@ -4187,6 +4190,8 @@ static void
 mlxsw_sp_nexthop4_group_destroy(struct mlxsw_sp *mlxsw_sp,
 				struct mlxsw_sp_nexthop_group *nh_grp)
 {
+	if (!nh_grp->can_destroy)
+		return;
 	mlxsw_sp_nexthop_group_remove(mlxsw_sp, nh_grp);
 	mlxsw_sp_nexthop4_group_info_fini(mlxsw_sp, nh_grp);
 	fib_info_put(nh_grp->ipv4.fi);
@@ -5479,6 +5484,8 @@ mlxsw_sp_nexthop6_group_create(struct mlxsw_sp *mlxsw_sp,
 	if (err)
 		goto err_nexthop_group_insert;
 
+	nh_grp->can_destroy = true;
+
 	return nh_grp;
 
 err_nexthop_group_insert:
@@ -5492,6 +5499,8 @@ static void
 mlxsw_sp_nexthop6_group_destroy(struct mlxsw_sp *mlxsw_sp,
 				struct mlxsw_sp_nexthop_group *nh_grp)
 {
+	if (!nh_grp->can_destroy)
+		return;
 	mlxsw_sp_nexthop_group_remove(mlxsw_sp, nh_grp);
 	mlxsw_sp_nexthop6_group_info_fini(mlxsw_sp, nh_grp);
 	kfree(nh_grp);
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH net-next 9/9] mlxsw: spectrum_router: Allow returning errors from mlxsw_sp_nexthop_group_refresh()
  2020-11-17 17:46 [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2 Ido Schimmel
                   ` (7 preceding siblings ...)
  2020-11-17 17:47 ` [PATCH net-next 8/9] mlxsw: spectrum_router: Add an indication if a nexthop group can be destroyed Ido Schimmel
@ 2020-11-17 17:47 ` Ido Schimmel
  2020-11-18 20:00 ` [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2 patchwork-bot+netdevbpf
  9 siblings, 0 replies; 11+ messages in thread
From: Ido Schimmel @ 2020-11-17 17:47 UTC (permalink / raw)
  To: netdev; +Cc: davem, kuba, jiri, dsahern, mlxsw, Ido Schimmel

From: Ido Schimmel <idosch@nvidia.com>

The function is responsible for allocating the adjacency entries used by
the nexthop group and populating them with the adjacency information
such as egress RIF and MAC address.

Allow the function to return an error when it encounters a problem and
have the relevant call sites check it.

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
---
 .../ethernet/mellanox/mlxsw/spectrum_router.c | 30 ++++++++++++-------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index 87b8c8db688b..147dd8fab2af 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -3552,7 +3552,7 @@ mlxsw_sp_nexthop_group_offload_refresh(struct mlxsw_sp *mlxsw_sp,
 	}
 }
 
-static void
+static int
 mlxsw_sp_nexthop_group_refresh(struct mlxsw_sp *mlxsw_sp,
 			       struct mlxsw_sp_nexthop_group *nh_grp)
 {
@@ -3562,13 +3562,12 @@ mlxsw_sp_nexthop_group_refresh(struct mlxsw_sp *mlxsw_sp,
 	bool offload_change = false;
 	u32 adj_index;
 	bool old_adj_index_valid;
+	int i, err2, err = 0;
 	u32 old_adj_index;
-	int i;
-	int err;
 
 	if (!nhgi->gateway) {
 		mlxsw_sp_nexthop_fib_entries_update(mlxsw_sp, nh_grp);
-		return;
+		return 0;
 	}
 
 	for (i = 0; i < nhgi->count; i++) {
@@ -3589,7 +3588,7 @@ mlxsw_sp_nexthop_group_refresh(struct mlxsw_sp *mlxsw_sp,
 			dev_warn(mlxsw_sp->bus_info->dev, "Failed to update neigh MAC in adjacency table.\n");
 			goto set_trap;
 		}
-		return;
+		return 0;
 	}
 	mlxsw_sp_nexthop_group_normalize(nhgi);
 	if (!nhgi->sum_norm_weight)
@@ -3637,7 +3636,7 @@ mlxsw_sp_nexthop_group_refresh(struct mlxsw_sp *mlxsw_sp,
 			dev_warn(mlxsw_sp->bus_info->dev, "Failed to add adjacency index to fib entries.\n");
 			goto set_trap;
 		}
-		return;
+		return 0;
 	}
 
 	err = mlxsw_sp_adj_index_mass_update(mlxsw_sp, nh_grp,
@@ -3649,7 +3648,7 @@ mlxsw_sp_nexthop_group_refresh(struct mlxsw_sp *mlxsw_sp,
 		goto set_trap;
 	}
 
-	return;
+	return 0;
 
 set_trap:
 	old_adj_index_valid = nhgi->adj_index_valid;
@@ -3658,13 +3657,14 @@ mlxsw_sp_nexthop_group_refresh(struct mlxsw_sp *mlxsw_sp,
 		nh = &nhgi->nexthops[i];
 		nh->offloaded = 0;
 	}
-	err = mlxsw_sp_nexthop_fib_entries_update(mlxsw_sp, nh_grp);
-	if (err)
+	err2 = mlxsw_sp_nexthop_fib_entries_update(mlxsw_sp, nh_grp);
+	if (err2)
 		dev_warn(mlxsw_sp->bus_info->dev, "Failed to set traps for fib entries.\n");
 	mlxsw_sp_nexthop_group_offload_refresh(mlxsw_sp, nh_grp);
 	if (old_adj_index_valid)
 		mlxsw_sp_kvdl_free(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ,
 				   nhgi->ecmp_size, nhgi->adj_index);
+	return err;
 }
 
 static void __mlxsw_sp_nexthop_neigh_update(struct mlxsw_sp_nexthop *nh,
@@ -4122,10 +4122,14 @@ mlxsw_sp_nexthop4_group_info_init(struct mlxsw_sp *mlxsw_sp,
 		if (err)
 			goto err_nexthop4_init;
 	}
-	mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp);
+	err = mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp);
+	if (err)
+		goto err_group_refresh;
 
 	return 0;
 
+err_group_refresh:
+	i = nhgi->count;
 err_nexthop4_init:
 	for (i--; i >= 0; i--) {
 		nh = &nhgi->nexthops[i];
@@ -5433,10 +5437,14 @@ mlxsw_sp_nexthop6_group_info_init(struct mlxsw_sp *mlxsw_sp,
 		mlxsw_sp_rt6 = list_next_entry(mlxsw_sp_rt6, list);
 	}
 	nh_grp->nhgi = nhgi;
-	mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp);
+	err = mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp);
+	if (err)
+		goto err_group_refresh;
 
 	return 0;
 
+err_group_refresh:
+	i = nhgi->count;
 err_nexthop6_init:
 	for (i--; i >= 0; i--) {
 		nh = &nhgi->nexthops[i];
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2
  2020-11-17 17:46 [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2 Ido Schimmel
                   ` (8 preceding siblings ...)
  2020-11-17 17:47 ` [PATCH net-next 9/9] mlxsw: spectrum_router: Allow returning errors from mlxsw_sp_nexthop_group_refresh() Ido Schimmel
@ 2020-11-18 20:00 ` patchwork-bot+netdevbpf
  9 siblings, 0 replies; 11+ messages in thread
From: patchwork-bot+netdevbpf @ 2020-11-18 20:00 UTC (permalink / raw)
  To: Ido Schimmel; +Cc: netdev, davem, kuba, jiri, dsahern, mlxsw, idosch

Hello:

This series was applied to netdev/net-next.git (refs/heads/master):

On Tue, 17 Nov 2020 19:46:55 +0200 you wrote:
> From: Ido Schimmel <idosch@nvidia.com>
> 
> This patch set contains the second round of preparations towards nexthop
> objects support in mlxsw. Follow up patches can be found here [1].
> 
> The patches are mostly small and trivial and contain non-functional
> changes aimed at making it easier to integrate nexthop objects with
> mlxsw.
> 
> [...]

Here is the summary with links:
  - [net-next,1/9] mlxsw: spectrum_router: Fix wrong kfree() in error path
    https://git.kernel.org/netdev/net-next/c/fbf805bf1fcd
  - [net-next,2/9] mlxsw: spectrum_router: Set ifindex for IPv4 nexthops
    https://git.kernel.org/netdev/net-next/c/ff8a24182acc
  - [net-next,3/9] mlxsw: spectrum_router: Pass ifindex to mlxsw_sp_ipip_entry_find_by_decap()
    https://git.kernel.org/netdev/net-next/c/c68e248d538b
  - [net-next,4/9] mlxsw: spectrum_router: Set FIB entry's type after creating nexthop group
    https://git.kernel.org/netdev/net-next/c/5c9a3b24518c
  - [net-next,5/9] mlxsw: spectrum_router: Set FIB entry's type based on nexthop group
    https://git.kernel.org/netdev/net-next/c/c0351b7c25ff
  - [net-next,6/9] mlxsw: spectrum_router: Re-order mlxsw_sp_nexthop6_group_get()
    https://git.kernel.org/netdev/net-next/c/5b9954e1e7b8
  - [net-next,7/9] mlxsw: spectrum_router: Only clear offload indication from valid IPv6 FIB info
    https://git.kernel.org/netdev/net-next/c/a9a711a3f78b
  - [net-next,8/9] mlxsw: spectrum_router: Add an indication if a nexthop group can be destroyed
    https://git.kernel.org/netdev/net-next/c/2efca2bfba99
  - [net-next,9/9] mlxsw: spectrum_router: Allow returning errors from mlxsw_sp_nexthop_group_refresh()
    https://git.kernel.org/netdev/net-next/c/e3ddfb45bacd

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2020-11-18 20:00 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-17 17:46 [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2 Ido Schimmel
2020-11-17 17:46 ` [PATCH net-next 1/9] mlxsw: spectrum_router: Fix wrong kfree() in error path Ido Schimmel
2020-11-17 17:46 ` [PATCH net-next 2/9] mlxsw: spectrum_router: Set ifindex for IPv4 nexthops Ido Schimmel
2020-11-17 17:46 ` [PATCH net-next 3/9] mlxsw: spectrum_router: Pass ifindex to mlxsw_sp_ipip_entry_find_by_decap() Ido Schimmel
2020-11-17 17:46 ` [PATCH net-next 4/9] mlxsw: spectrum_router: Set FIB entry's type after creating nexthop group Ido Schimmel
2020-11-17 17:47 ` [PATCH net-next 5/9] mlxsw: spectrum_router: Set FIB entry's type based on " Ido Schimmel
2020-11-17 17:47 ` [PATCH net-next 6/9] mlxsw: spectrum_router: Re-order mlxsw_sp_nexthop6_group_get() Ido Schimmel
2020-11-17 17:47 ` [PATCH net-next 7/9] mlxsw: spectrum_router: Only clear offload indication from valid IPv6 FIB info Ido Schimmel
2020-11-17 17:47 ` [PATCH net-next 8/9] mlxsw: spectrum_router: Add an indication if a nexthop group can be destroyed Ido Schimmel
2020-11-17 17:47 ` [PATCH net-next 9/9] mlxsw: spectrum_router: Allow returning errors from mlxsw_sp_nexthop_group_refresh() Ido Schimmel
2020-11-18 20:00 ` [PATCH net-next 0/9] mlxsw: Preparations for nexthop objects support - part 2/2 patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).