Commit 823f7a54 authored by David S. Miller's avatar David S. Miller

Merge branch 'mlx5-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux

Saeed Mahameed says:

====================
mlx5-next branch 2021-12-15

Hi Dave, Jakub, Jason

This pulls mlx5-next branch into net-next and rdma branches.
All patches already reviewed on both rdma and netdev mailing lists.

Please pull and let me know if there's any problem.

1) Add multiple FDB steering priorities [1]
2) Introduce HW bits needed to configure MAC list size of VF/SF.
   Required for ("net/mlx5: Memory optimizations") upcoming series [2].

[1] https://lore.kernel.org/netdev/20211201193621.9129-1-saeed@kernel.org/
[2] https://lore.kernel.org/lkml/20211208141722.13646-1-shayd@nvidia.com/
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents bd1d97d8 685b1afd
...@@ -1508,7 +1508,7 @@ _get_flow_table(struct mlx5_ib_dev *dev, ...@@ -1508,7 +1508,7 @@ _get_flow_table(struct mlx5_ib_dev *dev,
!esw_encap) !esw_encap)
flags |= MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT; flags |= MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT;
break; break;
case MLX5_FLOW_NAMESPACE_FDB: case MLX5_FLOW_NAMESPACE_FDB_BYPASS:
max_table_size = BIT( max_table_size = BIT(
MLX5_CAP_ESW_FLOWTABLE_FDB(dev->mdev, log_max_ft_size)); MLX5_CAP_ESW_FLOWTABLE_FDB(dev->mdev, log_max_ft_size));
if (MLX5_CAP_ESW_FLOWTABLE_FDB(dev->mdev, decap) && esw_encap) if (MLX5_CAP_ESW_FLOWTABLE_FDB(dev->mdev, decap) && esw_encap)
...@@ -1517,7 +1517,7 @@ _get_flow_table(struct mlx5_ib_dev *dev, ...@@ -1517,7 +1517,7 @@ _get_flow_table(struct mlx5_ib_dev *dev,
reformat_l3_tunnel_to_l2) && reformat_l3_tunnel_to_l2) &&
esw_encap) esw_encap)
flags |= MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT; flags |= MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT;
priority = FDB_BYPASS_PATH; priority = fs_matcher->priority;
break; break;
case MLX5_FLOW_NAMESPACE_RDMA_RX: case MLX5_FLOW_NAMESPACE_RDMA_RX:
max_table_size = BIT( max_table_size = BIT(
...@@ -1546,8 +1546,8 @@ _get_flow_table(struct mlx5_ib_dev *dev, ...@@ -1546,8 +1546,8 @@ _get_flow_table(struct mlx5_ib_dev *dev,
case MLX5_FLOW_NAMESPACE_EGRESS: case MLX5_FLOW_NAMESPACE_EGRESS:
prio = &dev->flow_db->egress_prios[priority]; prio = &dev->flow_db->egress_prios[priority];
break; break;
case MLX5_FLOW_NAMESPACE_FDB: case MLX5_FLOW_NAMESPACE_FDB_BYPASS:
prio = &dev->flow_db->fdb; prio = &dev->flow_db->fdb[priority];
break; break;
case MLX5_FLOW_NAMESPACE_RDMA_RX: case MLX5_FLOW_NAMESPACE_RDMA_RX:
prio = &dev->flow_db->rdma_rx[priority]; prio = &dev->flow_db->rdma_rx[priority];
...@@ -1937,7 +1937,7 @@ mlx5_ib_ft_type_to_namespace(enum mlx5_ib_uapi_flow_table_type table_type, ...@@ -1937,7 +1937,7 @@ mlx5_ib_ft_type_to_namespace(enum mlx5_ib_uapi_flow_table_type table_type,
*namespace = MLX5_FLOW_NAMESPACE_EGRESS; *namespace = MLX5_FLOW_NAMESPACE_EGRESS;
break; break;
case MLX5_IB_UAPI_FLOW_TABLE_TYPE_FDB: case MLX5_IB_UAPI_FLOW_TABLE_TYPE_FDB:
*namespace = MLX5_FLOW_NAMESPACE_FDB; *namespace = MLX5_FLOW_NAMESPACE_FDB_BYPASS;
break; break;
case MLX5_IB_UAPI_FLOW_TABLE_TYPE_RDMA_RX: case MLX5_IB_UAPI_FLOW_TABLE_TYPE_RDMA_RX:
*namespace = MLX5_FLOW_NAMESPACE_RDMA_RX; *namespace = MLX5_FLOW_NAMESPACE_RDMA_RX;
...@@ -2029,8 +2029,8 @@ static int get_dests(struct uverbs_attr_bundle *attrs, ...@@ -2029,8 +2029,8 @@ static int get_dests(struct uverbs_attr_bundle *attrs,
} }
/* Allow only DEVX object, drop as dest for FDB */ /* Allow only DEVX object, drop as dest for FDB */
if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB && !(dest_devx || if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB_BYPASS &&
(*flags & MLX5_IB_ATTR_CREATE_FLOW_FLAGS_DROP))) !(dest_devx || (*flags & MLX5_IB_ATTR_CREATE_FLOW_FLAGS_DROP)))
return -EINVAL; return -EINVAL;
/* Allow only DEVX object or QP as dest when inserting to RDMA_RX */ /* Allow only DEVX object or QP as dest when inserting to RDMA_RX */
...@@ -2050,7 +2050,7 @@ static int get_dests(struct uverbs_attr_bundle *attrs, ...@@ -2050,7 +2050,7 @@ static int get_dests(struct uverbs_attr_bundle *attrs,
if (!is_flow_dest(devx_obj, dest_id, dest_type)) if (!is_flow_dest(devx_obj, dest_id, dest_type))
return -EINVAL; return -EINVAL;
/* Allow only flow table as dest when inserting to FDB or RDMA_RX */ /* Allow only flow table as dest when inserting to FDB or RDMA_RX */
if ((fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB || if ((fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB_BYPASS ||
fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_RDMA_RX) && fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_RDMA_RX) &&
*dest_type != MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE) *dest_type != MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE)
return -EINVAL; return -EINVAL;
...@@ -2320,7 +2320,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_MATCHER_CREATE)( ...@@ -2320,7 +2320,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_MATCHER_CREATE)(
if (err) if (err)
goto end; goto end;
if (obj->ns_type == MLX5_FLOW_NAMESPACE_FDB && if (obj->ns_type == MLX5_FLOW_NAMESPACE_FDB_BYPASS &&
mlx5_eswitch_mode(dev->mdev) != MLX5_ESWITCH_OFFLOADS) { mlx5_eswitch_mode(dev->mdev) != MLX5_ESWITCH_OFFLOADS) {
err = -EINVAL; err = -EINVAL;
goto end; goto end;
......
...@@ -232,6 +232,7 @@ enum { ...@@ -232,6 +232,7 @@ enum {
#define MLX5_IB_NUM_FLOW_FT (MLX5_IB_FLOW_LEFTOVERS_PRIO + 1) #define MLX5_IB_NUM_FLOW_FT (MLX5_IB_FLOW_LEFTOVERS_PRIO + 1)
#define MLX5_IB_NUM_SNIFFER_FTS 2 #define MLX5_IB_NUM_SNIFFER_FTS 2
#define MLX5_IB_NUM_EGRESS_FTS 1 #define MLX5_IB_NUM_EGRESS_FTS 1
#define MLX5_IB_NUM_FDB_FTS MLX5_BY_PASS_NUM_REGULAR_PRIOS
struct mlx5_ib_flow_prio { struct mlx5_ib_flow_prio {
struct mlx5_flow_table *flow_table; struct mlx5_flow_table *flow_table;
unsigned int refcount; unsigned int refcount;
...@@ -276,7 +277,7 @@ struct mlx5_ib_flow_db { ...@@ -276,7 +277,7 @@ struct mlx5_ib_flow_db {
struct mlx5_ib_flow_prio egress_prios[MLX5_IB_NUM_FLOW_FT]; struct mlx5_ib_flow_prio egress_prios[MLX5_IB_NUM_FLOW_FT];
struct mlx5_ib_flow_prio sniffer[MLX5_IB_NUM_SNIFFER_FTS]; struct mlx5_ib_flow_prio sniffer[MLX5_IB_NUM_SNIFFER_FTS];
struct mlx5_ib_flow_prio egress[MLX5_IB_NUM_EGRESS_FTS]; struct mlx5_ib_flow_prio egress[MLX5_IB_NUM_EGRESS_FTS];
struct mlx5_ib_flow_prio fdb; struct mlx5_ib_flow_prio fdb[MLX5_IB_NUM_FDB_FTS];
struct mlx5_ib_flow_prio rdma_rx[MLX5_IB_NUM_FLOW_FT]; struct mlx5_ib_flow_prio rdma_rx[MLX5_IB_NUM_FLOW_FT];
struct mlx5_ib_flow_prio rdma_tx[MLX5_IB_NUM_FLOW_FT]; struct mlx5_ib_flow_prio rdma_tx[MLX5_IB_NUM_FLOW_FT];
struct mlx5_ib_flow_prio opfcs[MLX5_IB_OPCOUNTER_MAX]; struct mlx5_ib_flow_prio opfcs[MLX5_IB_OPCOUNTER_MAX];
......
...@@ -788,7 +788,8 @@ static int mlx5_cmd_packet_reformat_alloc(struct mlx5_flow_root_namespace *ns, ...@@ -788,7 +788,8 @@ static int mlx5_cmd_packet_reformat_alloc(struct mlx5_flow_root_namespace *ns,
int err; int err;
u32 *in; u32 *in;
if (namespace == MLX5_FLOW_NAMESPACE_FDB) if (namespace == MLX5_FLOW_NAMESPACE_FDB ||
namespace == MLX5_FLOW_NAMESPACE_FDB_BYPASS)
max_encap_size = MLX5_CAP_ESW(dev, max_encap_header_size); max_encap_size = MLX5_CAP_ESW(dev, max_encap_header_size);
else else
max_encap_size = MLX5_CAP_FLOWTABLE(dev, max_encap_header_size); max_encap_size = MLX5_CAP_FLOWTABLE(dev, max_encap_header_size);
...@@ -860,6 +861,7 @@ static int mlx5_cmd_modify_header_alloc(struct mlx5_flow_root_namespace *ns, ...@@ -860,6 +861,7 @@ static int mlx5_cmd_modify_header_alloc(struct mlx5_flow_root_namespace *ns,
switch (namespace) { switch (namespace) {
case MLX5_FLOW_NAMESPACE_FDB: case MLX5_FLOW_NAMESPACE_FDB:
case MLX5_FLOW_NAMESPACE_FDB_BYPASS:
max_actions = MLX5_CAP_ESW_FLOWTABLE_FDB(dev, max_modify_header_actions); max_actions = MLX5_CAP_ESW_FLOWTABLE_FDB(dev, max_modify_header_actions);
table_type = FS_FT_FDB; table_type = FS_FT_FDB;
break; break;
......
...@@ -2206,6 +2206,22 @@ struct mlx5_flow_namespace *mlx5_get_fdb_sub_ns(struct mlx5_core_dev *dev, ...@@ -2206,6 +2206,22 @@ struct mlx5_flow_namespace *mlx5_get_fdb_sub_ns(struct mlx5_core_dev *dev,
} }
EXPORT_SYMBOL(mlx5_get_fdb_sub_ns); EXPORT_SYMBOL(mlx5_get_fdb_sub_ns);
static bool is_nic_rx_ns(enum mlx5_flow_namespace_type type)
{
switch (type) {
case MLX5_FLOW_NAMESPACE_BYPASS:
case MLX5_FLOW_NAMESPACE_LAG:
case MLX5_FLOW_NAMESPACE_OFFLOADS:
case MLX5_FLOW_NAMESPACE_ETHTOOL:
case MLX5_FLOW_NAMESPACE_KERNEL:
case MLX5_FLOW_NAMESPACE_LEFTOVERS:
case MLX5_FLOW_NAMESPACE_ANCHOR:
return true;
default:
return false;
}
}
struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev, struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
enum mlx5_flow_namespace_type type) enum mlx5_flow_namespace_type type)
{ {
...@@ -2235,31 +2251,39 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev, ...@@ -2235,31 +2251,39 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
if (steering->sniffer_tx_root_ns) if (steering->sniffer_tx_root_ns)
return &steering->sniffer_tx_root_ns->ns; return &steering->sniffer_tx_root_ns->ns;
return NULL; return NULL;
default: case MLX5_FLOW_NAMESPACE_FDB_BYPASS:
root_ns = steering->fdb_root_ns;
prio = FDB_BYPASS_PATH;
break; break;
} case MLX5_FLOW_NAMESPACE_EGRESS:
case MLX5_FLOW_NAMESPACE_EGRESS_KERNEL:
if (type == MLX5_FLOW_NAMESPACE_EGRESS ||
type == MLX5_FLOW_NAMESPACE_EGRESS_KERNEL) {
root_ns = steering->egress_root_ns; root_ns = steering->egress_root_ns;
prio = type - MLX5_FLOW_NAMESPACE_EGRESS; prio = type - MLX5_FLOW_NAMESPACE_EGRESS;
} else if (type == MLX5_FLOW_NAMESPACE_RDMA_RX) { break;
case MLX5_FLOW_NAMESPACE_RDMA_RX:
root_ns = steering->rdma_rx_root_ns; root_ns = steering->rdma_rx_root_ns;
prio = RDMA_RX_BYPASS_PRIO; prio = RDMA_RX_BYPASS_PRIO;
} else if (type == MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL) { break;
case MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL:
root_ns = steering->rdma_rx_root_ns; root_ns = steering->rdma_rx_root_ns;
prio = RDMA_RX_KERNEL_PRIO; prio = RDMA_RX_KERNEL_PRIO;
} else if (type == MLX5_FLOW_NAMESPACE_RDMA_TX) { break;
case MLX5_FLOW_NAMESPACE_RDMA_TX:
root_ns = steering->rdma_tx_root_ns; root_ns = steering->rdma_tx_root_ns;
} else if (type == MLX5_FLOW_NAMESPACE_RDMA_RX_COUNTERS) { break;
case MLX5_FLOW_NAMESPACE_RDMA_RX_COUNTERS:
root_ns = steering->rdma_rx_root_ns; root_ns = steering->rdma_rx_root_ns;
prio = RDMA_RX_COUNTERS_PRIO; prio = RDMA_RX_COUNTERS_PRIO;
} else if (type == MLX5_FLOW_NAMESPACE_RDMA_TX_COUNTERS) { break;
case MLX5_FLOW_NAMESPACE_RDMA_TX_COUNTERS:
root_ns = steering->rdma_tx_root_ns; root_ns = steering->rdma_tx_root_ns;
prio = RDMA_TX_COUNTERS_PRIO; prio = RDMA_TX_COUNTERS_PRIO;
} else { /* Must be NIC RX */ break;
default: /* Must be NIC RX */
WARN_ON(!is_nic_rx_ns(type));
root_ns = steering->root_ns; root_ns = steering->root_ns;
prio = type; prio = type;
break;
} }
if (!root_ns) if (!root_ns)
...@@ -2822,6 +2846,28 @@ static int create_fdb_fast_path(struct mlx5_flow_steering *steering) ...@@ -2822,6 +2846,28 @@ static int create_fdb_fast_path(struct mlx5_flow_steering *steering)
return 0; return 0;
} }
static int create_fdb_bypass(struct mlx5_flow_steering *steering)
{
struct mlx5_flow_namespace *ns;
struct fs_prio *prio;
int i;
prio = fs_create_prio(&steering->fdb_root_ns->ns, FDB_BYPASS_PATH, 0);
if (IS_ERR(prio))
return PTR_ERR(prio);
ns = fs_create_namespace(prio, MLX5_FLOW_TABLE_MISS_ACTION_DEF);
if (IS_ERR(ns))
return PTR_ERR(ns);
for (i = 0; i < MLX5_BY_PASS_NUM_REGULAR_PRIOS; i++) {
prio = fs_create_prio(ns, i, 1);
if (IS_ERR(prio))
return PTR_ERR(prio);
}
return 0;
}
static int init_fdb_root_ns(struct mlx5_flow_steering *steering) static int init_fdb_root_ns(struct mlx5_flow_steering *steering)
{ {
struct fs_prio *maj_prio; struct fs_prio *maj_prio;
...@@ -2831,12 +2877,10 @@ static int init_fdb_root_ns(struct mlx5_flow_steering *steering) ...@@ -2831,12 +2877,10 @@ static int init_fdb_root_ns(struct mlx5_flow_steering *steering)
if (!steering->fdb_root_ns) if (!steering->fdb_root_ns)
return -ENOMEM; return -ENOMEM;
maj_prio = fs_create_prio(&steering->fdb_root_ns->ns, FDB_BYPASS_PATH, err = create_fdb_bypass(steering);
1); if (err)
if (IS_ERR(maj_prio)) {
err = PTR_ERR(maj_prio);
goto out_err; goto out_err;
}
err = create_fdb_fast_path(steering); err = create_fdb_fast_path(steering);
if (err) if (err)
goto out_err; goto out_err;
......
...@@ -73,6 +73,7 @@ enum mlx5_flow_namespace_type { ...@@ -73,6 +73,7 @@ enum mlx5_flow_namespace_type {
MLX5_FLOW_NAMESPACE_KERNEL, MLX5_FLOW_NAMESPACE_KERNEL,
MLX5_FLOW_NAMESPACE_LEFTOVERS, MLX5_FLOW_NAMESPACE_LEFTOVERS,
MLX5_FLOW_NAMESPACE_ANCHOR, MLX5_FLOW_NAMESPACE_ANCHOR,
MLX5_FLOW_NAMESPACE_FDB_BYPASS,
MLX5_FLOW_NAMESPACE_FDB, MLX5_FLOW_NAMESPACE_FDB,
MLX5_FLOW_NAMESPACE_ESW_EGRESS, MLX5_FLOW_NAMESPACE_ESW_EGRESS,
MLX5_FLOW_NAMESPACE_ESW_INGRESS, MLX5_FLOW_NAMESPACE_ESW_INGRESS,
......
...@@ -1621,7 +1621,7 @@ struct mlx5_ifc_cmd_hca_cap_bits { ...@@ -1621,7 +1621,7 @@ struct mlx5_ifc_cmd_hca_cap_bits {
u8 ext_stride_num_range[0x1]; u8 ext_stride_num_range[0x1];
u8 roce_rw_supported[0x1]; u8 roce_rw_supported[0x1];
u8 reserved_at_3a2[0x1]; u8 log_max_current_uc_list_wr_supported[0x1];
u8 log_max_stride_sz_rq[0x5]; u8 log_max_stride_sz_rq[0x5];
u8 reserved_at_3a8[0x3]; u8 reserved_at_3a8[0x3];
u8 log_min_stride_sz_rq[0x5]; u8 log_min_stride_sz_rq[0x5];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment