Add RDMA TRANSPORT steering domain
Subsystems (5)
cover Add RDMA TRANSPORT steering domain
From Patrisious,
The following series adds two new steering domains:RDMA_TRANSPORT_RX - Packets will traverse through it after RDMA_RX RDMA_TRANSPORT_TX - Packets will traverse through it before RDMA_TX
These domains created on the vport group manager for each vport. So RDMA application running on VF(or SF) is not aware of this domain, and the main motivation behind it is to catch control packets, forward them to VF QP as well as the control SW to help with congestion control.
These new domains are also exposed to users through mlx5dv_create_flow_matcher() which will now support these two new table types which have to be created with its corresponding ib_port.
Thanks
Patrisious Haddad (3):
net/mlx5: Query ADV_RDMA capabilities
net/mlx5: fs, add RDMA TRANSPORT steering domain support RDMA/mlx5: Expose RDMA TRANSPORT flow table types to userspace
drivers/infiniband/hw/mlx5/fs.c | 140 ++++++++++++-- drivers/infiniband/hw/mlx5/fs.h | 2 + drivers/infiniband/hw/mlx5/mlx5_ib.h | 3 + .../mellanox/mlx5/core/esw/acl/helper.c | 2 +- .../mellanox/mlx5/core/eswitch_offloads.c | 6 +- .../net/ethernet/mellanox/mlx5/core/fs_cmd.c | 2 + .../net/ethernet/mellanox/mlx5/core/fs_core.c | 178 ++++++++++++++++-- .../net/ethernet/mellanox/mlx5/core/fs_core.h | 12 +- drivers/net/ethernet/mellanox/mlx5/core/fw.c | 7 + .../net/ethernet/mellanox/mlx5/core/main.c | 1 + include/linux/mlx5/device.h | 11 ++ include/linux/mlx5/fs.h | 11 +- include/linux/mlx5/mlx5_ifc.h | 42 ++++- include/uapi/rdma/mlx5_user_ioctl_cmds.h | 1 + include/uapi/rdma/mlx5_user_ioctl_verbs.h | 2 + 15 files changed, 385 insertions(+), 35 deletions(-)
Signature · 1 line
2.47.1
PATCH 1/3 net/mlx5: Query ADV_RDMA capabilities
From: Patrisious Haddad <[email protected]>
Query ADV_RDMA capabilities which provide information for advanced RDMA related features.
--- drivers/net/ethernet/mellanox/mlx5/core/fw.c | 7 ++++ .../net/ethernet/mellanox/mlx5/core/main.c | 1 + include/linux/mlx5/device.h | 5 +++ include/linux/mlx5/mlx5_ifc.h | 42 ++++++++++++++++++- 4 files changed, 54 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/fw.c +7 -0
@@ -281,6 +281,13 @@ int mlx5_query_hca_caps(struct mlx5_core_dev *dev)return err; } +if (MLX5_CAP_GEN (dev, adv_rdma)) { + err =mlx5_core_get_caps_mode (dev,MLX5_CAP_ADV_RDMA , +HCA_CAP_OPMOD_GET_CUR ); +if (err) +return err; + } +return 0 ; }
drivers/net/ethernet/mellanox/mlx5/core/main.c +1 -0
@@ -1788,6 +1788,7 @@ static const int types[] = {MLX5_CAP_MACSEC ,MLX5_CAP_ADV_VIRTUALIZATION ,MLX5_CAP_CRYPTO , + MLX5_CAP_ADV_RDMA, };static void mlx5_hca_caps_free (struct mlx5_core_dev *dev)
include/linux/mlx5/device.h +5 -0
@@ -1249,6 +1249,7 @@ enum mlx5_cap_type {MLX5_CAP_GENERAL_2 =0x20 ,MLX5_CAP_PORT_SELECTION =0x25 ,MLX5_CAP_ADV_VIRTUALIZATION =0x26 , +MLX5_CAP_ADV_RDMA =0x28 ,/* NUM OF CAP Types */ MLX5_CAP_NUM };
@@ -1382,6 +1383,10 @@ enum mlx5_qcam_feature_groups {MLX5_GET (adv_virtualization_cap, \ mdev->caps.hca[MLX5_CAP_ADV_VIRTUALIZATION]->cur, cap) +#define MLX5_CAP_ADV_RDMA (mdev, cap) \ + MLX5_GET(adv_rdma_cap, \ + mdev->caps.hca[MLX5_CAP_ADV_RDMA]->cur, cap) +#define MLX5_CAP_FLOWTABLE_PORT_SELECTION (mdev, cap) \ MLX5_CAP_PORT_SELECTION(mdev, flow_table_properties_port_selection.cap)
include/linux/mlx5/mlx5_ifc.h +41 -1
54 lines not on this page · raw message
Signature · 1 line
2.47.1
PATCH 3/3 RDMA/mlx5: Expose RDMA TRANSPORT flow table types to userspace
In reply to Leon RomanovskyFrom: Patrisious Haddad <[email protected]>
This patch adds RDMA_TRANSPORT_RX and RDMA_TRANSPORT_TX as a new flow table type for matcher creation.
--- drivers/infiniband/hw/mlx5/fs.c | 140 ++++++++++++++++++++-- drivers/infiniband/hw/mlx5/fs.h | 2 + drivers/infiniband/hw/mlx5/mlx5_ib.h | 3 + include/uapi/rdma/mlx5_user_ioctl_cmds.h | 1 + include/uapi/rdma/mlx5_user_ioctl_verbs.h | 2 + 5 files changed, 135 insertions(+), 13 deletions(-)
drivers/infiniband/hw/mlx5/fs.c +127 -13
@@ -690,7 +690,7 @@ static struct mlx5_ib_flow_prio *_get_prio(struct mlx5_ib_dev *dev,struct mlx5_ib_flow_prio *prio, int priority, int num_entries, int num_groups, - u32 flags) + u32 flags, u16 vport) { struct mlx5_flow_table_attr ft_attr = {};struct mlx5_flow_table *ft;
@@ -698,6 +698,7 @@ static struct mlx5_ib_flow_prio *_get_prio(struct mlx5_ib_dev *dev, ft_attr.prio = priority; ft_attr.max_fte = num_entries; ft_attr.flags = flags; + ft_attr.vport = vport; ft_attr.autogroup.max_num_groups = num_groups; ft =mlx5_create_auto_grouped_flow_table (ns, &ft_attr);if (IS_ERR (ft))
@@ -792,7 +793,7 @@ static struct mlx5_ib_flow_prio *get_flow_table(struct mlx5_ib_dev *dev, ft = prio->flow_table;if (!ft)return _get_prio (dev, ns, prio, priority, max_table_size, - num_groups, flags); + num_groups, flags,0 );return prio; }
@@ -935,7 +936,7 @@ int mlx5_ib_fs_add_op_fc(struct mlx5_ib_dev *dev, u32 port_num, prio = &dev->flow_db->opfcs[type];if (!prio->flow_table) { prio =_get_prio (dev, ns, prio, priority, - dev->num_ports *MAX_OPFC_RULES ,1 ,0 ); + dev->num_ports *MAX_OPFC_RULES ,1 ,0 ,0 );if (IS_ERR (prio)) { err =PTR_ERR (prio); goto free;
@@ -1413,17 +1414,51 @@ static struct ib_flow *mlx5_ib_create_flow(struct ib_qp *qp,return ERR_PTR (err); } +static int mlx5_ib_fill_transport_ns_info (struct mlx5_ib_dev *dev, +enum mlx5_flow_namespace_type type, +u32 *flags,u16 *vport_idx, +u16 *vport, +struct mlx5_core_dev **ft_mdev, +u32 ib_port) +{ +struct mlx5_core_dev *esw_mdev; + +if (!is_mdev_switchdev_mode (dev->mdev)) +return 0 ; + +if (!MLX5_CAP_ADV_RDMA (dev->mdev, rdma_transport_manager)) +return -EOPNOTSUPP ; + +if (!dev->port[ib_port -1 ].rep) +return -EINVAL ; + + esw_mdev =mlx5_eswitch_get_core_dev (dev->port[ib_port -1 ].rep->esw); +if (esw_mdev != dev->mdev) +return -EOPNOTSUPP ; + + *flags |=MLX5_FLOW_TABLE_OTHER_VPORT ; + *ft_mdev = esw_mdev; + *vport = dev->port[ib_port -1 ].rep->vport; + *vport_idx = dev->port[ib_port -1 ].rep->vport_index; + +return 0 ; +} +static struct mlx5_ib_flow_prio *_get_flow_table (struct mlx5_ib_dev *dev,u16 user_priority,enum mlx5_flow_namespace_type ns_type, -bool mcast) +bool mcast,u32 ib_port) { +struct mlx5_core_dev *ft_mdev = dev->mdev;struct mlx5_flow_namespace *ns =NULL ;struct mlx5_ib_flow_prio *prio =NULL ;int max_table_size =0 ; +u16 vport_idx =0 ;bool esw_encap;u32 flags =0 ; +u16 vport =0 ;int priority; +int ret;if (mcast) priority =MLX5_IB_FLOW_MCAST_PRIO ;
@@ -1471,13 +1506,38 @@ _get_flow_table(struct mlx5_ib_dev *dev, u16 user_priority, MLX5_CAP_FLOWTABLE_RDMA_TX(dev->mdev, log_max_ft_size)); priority = user_priority;break ; +case MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_RX : +case MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_TX : +if (ib_port ==0 || user_priority >MLX5_RDMA_TRANSPORT_BYPASS_PRIO ) +return ERR_PTR (-EINVAL ); + ret =mlx5_ib_fill_transport_ns_info (dev, ns_type, &flags, + &vport_idx, &vport, + &ft_mdev, ib_port); +if (ret) +return ERR_PTR (ret); + +if (ns_type ==MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_RX ) + max_table_size = +BIT (MLX5_CAP_FLOWTABLE_RDMA_TRANSPORT_RX ( + ft_mdev, log_max_ft_size)); +else + max_table_size = +BIT (MLX5_CAP_FLOWTABLE_RDMA_TRANSPORT_TX ( + ft_mdev, log_max_ft_size)); + priority = user_priority; +break ;default :break ; } max_table_size =min_t (int, max_table_size,MLX5_FS_MAX_ENTRIES ); - ns =mlx5_get_flow_namespace (dev->mdev, ns_type); +if (ns_type ==MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_RX || + ns_type ==MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_TX ) + ns =mlx5_get_flow_vport_namespace (ft_mdev, ns_type, vport_idx); +else + ns =mlx5_get_flow_namespace (ft_mdev, ns_type); +if (!ns)return ERR_PTR (-EOPNOTSUPP );
@@ -1497,6 +1557,12 @@ _get_flow_table(struct mlx5_ib_dev *dev, u16 user_priority,case MLX5_FLOW_NAMESPACE_RDMA_TX : prio = &dev->flow_db->rdma_tx[priority];break ; +case MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_RX : + prio = &dev->flow_db->rdma_transport_rx[ib_port -1 ]; +break ; +case MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_TX : + prio = &dev->flow_db->rdma_transport_tx[ib_port -1 ]; +break ;default :return ERR_PTR (-EINVAL ); }
@@ -1507,7 +1573,7 @@ _get_flow_table(struct mlx5_ib_dev *dev, u16 user_priority,return prio;return _get_prio (dev, ns, prio, priority, max_table_size, -MLX5_FS_MAX_TYPES , flags); +MLX5_FS_MAX_TYPES , flags, vport); } static struct mlx5_ib_flow_handler *
@@ -1626,7 +1692,8 @@ static struct mlx5_ib_flow_handler *raw_fs_rule_add(mutex_lock (&dev->flow_db->lock); ft_prio =_get_flow_table (dev, fs_matcher->priority, - fs_matcher->ns_type, mcast); + fs_matcher->ns_type, mcast, + fs_matcher->ib_port);if (IS_ERR (ft_prio)) { err =PTR_ERR (ft_prio); goto unlock;
@@ -1738,6 +1805,12 @@ mlx5_ib_ft_type_to_namespace(enum mlx5_ib_uapi_flow_table_type table_type,case MLX5_IB_UAPI_FLOW_TABLE_TYPE_RDMA_TX : *namespace =MLX5_FLOW_NAMESPACE_RDMA_TX ;break ; +case MLX5_IB_UAPI_FLOW_TABLE_TYPE_RDMA_TRANSPORT_RX : + *namespace =MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_RX ; +break ; +case MLX5_IB_UAPI_FLOW_TABLE_TYPE_RDMA_TRANSPORT_TX : + *namespace =MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_TX ; +break ;default :return -EINVAL ; }
@@ -1827,7 +1900,8 @@ static int get_dests(struct uverbs_attr_bundle *attrs,return -EINVAL ;/* Allow only DEVX object or QP as dest when inserting to RDMA_RX */ -if ((fs_matcher->ns_type ==MLX5_FLOW_NAMESPACE_RDMA_RX ) && +if ((fs_matcher->ns_type ==MLX5_FLOW_NAMESPACE_RDMA_RX || + fs_matcher->ns_type ==MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_RX ) && ((!dest_devx && !dest_qp) || (dest_devx && dest_qp)))return -EINVAL ;
@@ -1844,7 +1918,8 @@ static int get_dests(struct uverbs_attr_bundle *attrs,return -EINVAL ;/* Allow only flow table as dest when inserting to FDB or RDMA_RX */ 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 || + fs_matcher->ns_type ==MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_RX ) && *dest_type !=MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE )return -EINVAL ; }else if (dest_qp) {
@@ -1865,14 +1940,16 @@ static int get_dests(struct uverbs_attr_bundle *attrs, *dest_id = mqp->raw_packet_qp.rq.tirn; *dest_type =MLX5_FLOW_DESTINATION_TYPE_TIR ; }else if ((fs_matcher->ns_type ==MLX5_FLOW_NAMESPACE_EGRESS || - fs_matcher->ns_type ==MLX5_FLOW_NAMESPACE_RDMA_TX ) && + fs_matcher->ns_type ==MLX5_FLOW_NAMESPACE_RDMA_TX || + fs_matcher->ns_type ==MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_TX ) && !(*flags &MLX5_IB_ATTR_CREATE_FLOW_FLAGS_DROP )) { *dest_type =MLX5_FLOW_DESTINATION_TYPE_PORT ; }if (*dest_type ==MLX5_FLOW_DESTINATION_TYPE_TIR && (fs_matcher->ns_type ==MLX5_FLOW_NAMESPACE_EGRESS || - fs_matcher->ns_type ==MLX5_FLOW_NAMESPACE_RDMA_TX )) + fs_matcher->ns_type ==MLX5_FLOW_NAMESPACE_RDMA_TX || + fs_matcher->ns_type ==MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_TX ))return -EINVAL ;return 0 ;
@@ -2386,6 +2463,22 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_MATCHER_CREATE)( goto end; } +if (uverbs_attr_is_valid (attrs,MLX5_IB_ATTR_FLOW_MATCHER_IB_PORT )) { + err =uverbs_copy_from (&obj->ib_port, attrs, +MLX5_IB_ATTR_FLOW_MATCHER_IB_PORT ); +if (err) + goto end; +if (!rdma_is_port_valid (&dev->ib_dev, obj->ib_port)) { + err = -EINVAL ; + goto end; + } +if (obj->ns_type !=MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_RX && + obj->ns_type !=MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_TX ) { + err = -EINVAL ; + goto end; + } + } + uobj->object = obj; obj->mdev = dev->mdev;atomic_set (&obj->usecnt,0 );
@@ -2433,7 +2526,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_STEERING_ANCHOR_CREATE)(mutex_lock (&dev->flow_db->lock); - ft_prio =_get_flow_table (dev, priority, ns_type,0 ); + ft_prio =_get_flow_table (dev, priority, ns_type,0 ,0 );if (IS_ERR (ft_prio)) { err =PTR_ERR (ft_prio); goto free_obj;
@@ -2819,7 +2912,10 @@ DECLARE_UVERBS_NAMED_METHOD( UA_OPTIONAL),UVERBS_ATTR_CONST_IN (MLX5_IB_ATTR_FLOW_MATCHER_FT_TYPE ,enum mlx5_ib_uapi_flow_table_type , - UA_OPTIONAL)); +UA_OPTIONAL ), +UVERBS_ATTR_PTR_IN (MLX5_IB_ATTR_FLOW_MATCHER_IB_PORT , +UVERBS_ATTR_TYPE (u32 ), + UA_OPTIONAL)); DECLARE_UVERBS_NAMED_METHOD_DESTROY( MLX5_IB_METHOD_FLOW_MATCHER_DESTROY,
@@ -2889,8 +2985,26 @@ int mlx5_ib_fs_init(struct mlx5_ib_dev *dev)if (!dev->flow_db)return -ENOMEM ; + dev->flow_db->rdma_transport_rx =kcalloc (dev->num_ports, +sizeof (struct mlx5_ib_flow_prio ), +GFP_KERNEL ); +if (!dev->flow_db->rdma_transport_rx) + goto free_flow_db; + + dev->flow_db->rdma_transport_tx =kcalloc (dev->num_ports, +sizeof (struct mlx5_ib_flow_prio ), +GFP_KERNEL ); +if (!dev->flow_db->rdma_transport_tx) + goto free_rdma_transport_rx; +mutex_init (&dev->flow_db->lock);ib_set_device_ops (&dev->ib_dev, &flow_ops);return 0 ; + +free_rdma_transport_rx: +kfree (dev->flow_db->rdma_transport_rx); +free_flow_db: +kfree (dev->flow_db); +return -ENOMEM ; }
drivers/infiniband/hw/mlx5/fs.h +2 -0
@@ -40,6 +40,8 @@ static inline void mlx5_ib_fs_cleanup(struct mlx5_ib_dev *dev)* is a safe assumption that all references are gone. */ mlx5_ib_fs_cleanup_anchor (dev); +kfree (dev->flow_db->rdma_transport_tx); +kfree (dev->flow_db->rdma_transport_rx); kfree(dev->flow_db); }#endif /* _MLX5_IB_FS_H */
drivers/infiniband/hw/mlx5/mlx5_ib.h +3 -0
@@ -276,6 +276,7 @@ struct mlx5_ib_flow_matcher {struct mlx5_core_dev *mdev;atomic_t usecnt;u8 match_criteria_enable; +u32 ib_port; };struct mlx5_ib_steering_anchor {
@@ -307,6 +308,8 @@ struct mlx5_ib_flow_db {struct mlx5_ib_flow_prio rdma_tx[MLX5_IB_NUM_FLOW_FT ];struct mlx5_ib_flow_prio opfcs[MLX5_IB_OPCOUNTER_MAX ];struct mlx5_flow_table *lag_demux_ft; +struct mlx5_ib_flow_prio *rdma_transport_rx; +struct mlx5_ib_flow_prio *rdma_transport_tx;/* Protect flow steering bypass flow tables * when add/del flow rules. * only single add/removal of flow steering rule could be done
include/uapi/rdma/mlx5_user_ioctl_cmds.h +1 -0
@@ -239,6 +239,7 @@ enum mlx5_ib_flow_matcher_create_attrs {MLX5_IB_ATTR_FLOW_MATCHER_MATCH_CRITERIA ,MLX5_IB_ATTR_FLOW_MATCHER_FLOW_FLAGS ,MLX5_IB_ATTR_FLOW_MATCHER_FT_TYPE , + MLX5_IB_ATTR_FLOW_MATCHER_IB_PORT, }; enum mlx5_ib_flow_matcher_destroy_attrs {
include/uapi/rdma/mlx5_user_ioctl_verbs.h +2 -0
@@ -45,6 +45,8 @@ enum mlx5_ib_uapi_flow_table_type {MLX5_IB_UAPI_FLOW_TABLE_TYPE_FDB =0x2 ,MLX5_IB_UAPI_FLOW_TABLE_TYPE_RDMA_RX =0x3 ,MLX5_IB_UAPI_FLOW_TABLE_TYPE_RDMA_TX =0x4 , +MLX5_IB_UAPI_FLOW_TABLE_TYPE_RDMA_TRANSPORT_RX =0x5 , + MLX5_IB_UAPI_FLOW_TABLE_TYPE_RDMA_TRANSPORT_TX = 0x6, }; enum mlx5_ib_uapi_flow_action_packet_reformat_type {
Signature · 1 line
2.47.1
PATCH 2/3 net/mlx5: fs, add RDMA TRANSPORT steering domain support
In reply to Leon RomanovskyFrom: Patrisious Haddad <[email protected]>
Add RX and TX RDMA_TRANSPORT flow table namespace, and the ability to create flow tables in those namespaces.
The RDMA_TRANSPORT RX and TX are per vport.
Packets will traverse through RDMA_TRANSPORT_RX after RDMA_RX and through RDMA_TRANSPORT_TX before RDMA_TX, ensuring proper control and management.
RDMA_TRANSPORT domains are managed by the vport group manager.
--- .../mellanox/mlx5/core/esw/acl/helper.c | 2 +- .../mellanox/mlx5/core/eswitch_offloads.c | 6 +- .../net/ethernet/mellanox/mlx5/core/fs_cmd.c | 2 + .../net/ethernet/mellanox/mlx5/core/fs_core.c | 178 ++++++++++++++++-- .../net/ethernet/mellanox/mlx5/core/fs_core.h | 12 +- include/linux/mlx5/device.h | 6 + include/linux/mlx5/fs.h | 11 +- 7 files changed, 196 insertions(+), 21 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/esw/acl/helper.c +1 -1
@@ -27,7 +27,7 @@ esw_acl_table_create(struct mlx5_eswitch *esw, struct mlx5_vport *vport, int ns,esw_debug (dev,"Create vport[%d] %s ACL table\n" , vport_num, ns ==MLX5_FLOW_NAMESPACE_ESW_INGRESS ?"ingress" :"egress" ); - root_ns =mlx5_get_flow_vport_acl_namespace (dev, ns, vport->index); + root_ns =mlx5_get_flow_vport_namespace (dev, ns, vport->index);if (!root_ns) {esw_warn (dev,"Failed to get E-Switch root namespace for vport (%d)\n" , vport_num);
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +3 -3
@@ -2831,9 +2831,9 @@ static int esw_set_master_egress_rule(struct mlx5_core_dev *master,if (IS_ERR (vport))return PTR_ERR (vport); - egress_ns =mlx5_get_flow_vport_acl_namespace (master, -MLX5_FLOW_NAMESPACE_ESW_EGRESS , - vport->index); + egress_ns =mlx5_get_flow_vport_namespace (master, +MLX5_FLOW_NAMESPACE_ESW_EGRESS , + vport->index);if (!egress_ns)return -EINVAL ;
drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c +2 -0
@@ -1141,6 +1141,8 @@ const struct mlx5_flow_cmds *mlx5_fs_cmd_get_default(enum fs_flow_table_type typcase FS_FT_RDMA_RX :case FS_FT_RDMA_TX :case FS_FT_PORT_SEL : +case FS_FT_RDMA_TRANSPORT_RX : +case FS_FT_RDMA_TRANSPORT_TX :return mlx5_fs_cmd_get_fw_cmds ();default :return mlx5_fs_cmd_get_stub_cmds ();
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +166 -12
233 lines not on this page · raw message
drivers/net/ethernet/mellanox/mlx5/core/fs_core.h +10 -2
@@ -112,7 +112,9 @@ enum fs_flow_table_type {FS_FT_PORT_SEL =0X9 ,FS_FT_FDB_RX =0xa ,FS_FT_FDB_TX =0xb , - FS_FT_MAX_TYPE = FS_FT_FDB_TX, +FS_FT_RDMA_TRANSPORT_RX =0xd , +FS_FT_RDMA_TRANSPORT_TX =0xe , + FS_FT_MAX_TYPE = FS_FT_RDMA_TRANSPORT_TX, }; enum fs_flow_table_op_mod {
@@ -154,6 +156,10 @@ struct mlx5_flow_steering {struct mlx5_flow_root_namespace *port_sel_root_ns;int esw_egress_acl_vports;int esw_ingress_acl_vports; +struct mlx5_flow_root_namespace **rdma_transport_rx_root_ns; +struct mlx5_flow_root_namespace **rdma_transport_tx_root_ns; +int rdma_transport_rx_vports; +int rdma_transport_tx_vports; };struct fs_node {
@@ -382,7 +388,9 @@ struct mlx5_flow_root_namespace *find_root(struct fs_node *node); (type ==FS_FT_PORT_SEL ) ?MLX5_CAP_FLOWTABLE_PORT_SELECTION (mdev, cap) : \ (type ==FS_FT_FDB_RX ) ?MLX5_CAP_ESW_FLOWTABLE_FDB (mdev, cap) : \ (type ==FS_FT_FDB_TX ) ?MLX5_CAP_ESW_FLOWTABLE_FDB (mdev, cap) : \ - (BUILD_BUG_ON_ZERO(FS_FT_FDB_TX != FS_FT_MAX_TYPE))\ + (type ==FS_FT_RDMA_TRANSPORT_RX ) ?MLX5_CAP_FLOWTABLE_RDMA_TRANSPORT_RX (mdev, cap) : \ + (type ==FS_FT_RDMA_TRANSPORT_TX ) ?MLX5_CAP_FLOWTABLE_RDMA_TRANSPORT_TX (mdev, cap) : \ + (BUILD_BUG_ON_ZERO (FS_FT_RDMA_TRANSPORT_TX !=FS_FT_MAX_TYPE ))\ ) #endif
include/linux/mlx5/device.h +6 -0
@@ -1344,6 +1344,12 @@ enum mlx5_qcam_feature_groups {#define MLX5_CAP_FLOWTABLE_RDMA_TX (mdev, cap) \ MLX5_CAP_FLOWTABLE(mdev, flow_table_properties_nic_transmit_rdma.cap) +#define MLX5_CAP_FLOWTABLE_RDMA_TRANSPORT_RX (mdev, cap) \ + MLX5_CAP_ADV_RDMA(mdev, rdma_transport_rx_flow_table_properties.cap) + +#define MLX5_CAP_FLOWTABLE_RDMA_TRANSPORT_TX (mdev, cap) \ + MLX5_CAP_ADV_RDMA(mdev, rdma_transport_tx_flow_table_properties.cap) +#define MLX5_CAP_ESW_FLOWTABLE (mdev, cap) \ MLX5_GET(flow_table_eswitch_cap, \ mdev->caps.hca[MLX5_CAP_ESWITCH_FLOW_TABLE]->cur, cap)
include/linux/mlx5/fs.h +8 -3
@@ -40,6 +40,8 @@#define MLX5_SET_CFG (p, f, v) MLX5_SET(create_flow_group_in, p, f, v) +#define MLX5_RDMA_TRANSPORT_BYPASS_PRIO 0 +enum mlx5_flow_destination_type {MLX5_FLOW_DESTINATION_TYPE_NONE ,MLX5_FLOW_DESTINATION_TYPE_VPORT ,
@@ -108,6 +110,8 @@ enum mlx5_flow_namespace_type {MLX5_FLOW_NAMESPACE_RDMA_TX_IPSEC ,MLX5_FLOW_NAMESPACE_RDMA_RX_MACSEC ,MLX5_FLOW_NAMESPACE_RDMA_TX_MACSEC , +MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_RX , + MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_TX, }; enum {
@@ -192,9 +196,9 @@ struct mlx5_flow_namespace * mlx5_get_flow_namespace(struct mlx5_core_dev *dev, enum mlx5_flow_namespace_type type);struct mlx5_flow_namespace * -mlx5_get_flow_vport_acl_namespace (struct mlx5_core_dev *dev, -enum mlx5_flow_namespace_type type, -int vport); +mlx5_get_flow_vport_namespace (struct mlx5_core_dev *dev, +enum mlx5_flow_namespace_type type, +int vport_idx);struct mlx5_flow_table_attr {int prio;
@@ -202,6 +206,7 @@ struct mlx5_flow_table_attr {u32 level;u32 flags;u16 uid; +u16 vport;struct mlx5_flow_table *next_ft;struct {
Signature · 1 line
2.47.1