History

RDMA/mlx5: Add NIC TX namespace when getting a flow table

Add the ability to get a NIC TX flow table when using _get_flow_table(). This will allow to create a matcher and a flow rule on the NIC TX path.

Mark Bloch committed 8 years ago

Commit b47fd4f1 parent fa76d243 files · +32 −11Browse files

Unified · Split

3 files
  1. drivers/infiniband/hw/mlx5/flow.c +1 −0
  2. drivers/infiniband/hw/mlx5/main.c +30 −11
  3. drivers/infiniband/hw/mlx5/mlx5_ib.h +1 −0
drivers/infiniband/hw/mlx5/flow.c+1−0
@@ -189,6 +189,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_MATCHER_CREATE)( · 188 unmodified lines
189 if (!obj)189 if (!obj)
190 return -ENOMEM;190 return -ENOMEM;
191 191
192 obj->ns_type = MLX5_FLOW_NAMESPACE_BYPASS;
192 obj->mask_len = uverbs_attr_get_len(193 obj->mask_len = uverbs_attr_get_len(
193 attrs, MLX5_IB_ATTR_FLOW_MATCHER_MATCH_MASK);194 attrs, MLX5_IB_ATTR_FLOW_MATCHER_MATCH_MASK);
194 err = uverbs_copy_from(&obj->matcher_mask,195 err = uverbs_copy_from(&obj->matcher_mask,
drivers/infiniband/hw/mlx5/main.c+30−11
@@ -3719,34 +3719,54 @@ free_ucmd: · 3718 unmodified lines
3719 return ERR_PTR(err);3719 return ERR_PTR(err);
3720}3720}
3721 3721
3722static struct mlx5_ib_flow_prio *_get_flow_table(struct mlx5_ib_dev *dev,3722static struct mlx5_ib_flow_prio *
3723 int priority, bool mcast)3723_get_flow_table(struct mlx5_ib_dev *dev,
3724 struct mlx5_ib_flow_matcher *fs_matcher,
3725 bool mcast)
3724{3726{
3725 int max_table_size;
3726 struct mlx5_flow_namespace *ns = NULL;3727 struct mlx5_flow_namespace *ns = NULL;
3727 struct mlx5_ib_flow_prio *prio;3728 struct mlx5_ib_flow_prio *prio;
3729 int max_table_size;
3730 u32 flags = 0;
3731 int priority;
3732
3733 if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_BYPASS) {
3734 max_table_size = BIT(MLX5_CAP_FLOWTABLE_NIC_RX(dev->mdev,
3735 log_max_ft_size));
3736 if (MLX5_CAP_FLOWTABLE_NIC_RX(dev->mdev, decap))
3737 flags |= MLX5_FLOW_TABLE_TUNNEL_EN_DECAP;
3738 if (MLX5_CAP_FLOWTABLE_NIC_RX(dev->mdev,
3739 reformat_l3_tunnel_to_l2))
3740 flags |= MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT;
3741 } else { /* Can only be MLX5_FLOW_NAMESPACE_EGRESS */
3742 max_table_size = BIT(MLX5_CAP_FLOWTABLE_NIC_TX(dev->mdev,
3743 log_max_ft_size));
3744 if (MLX5_CAP_FLOWTABLE_NIC_TX(dev->mdev, reformat))
3745 flags |= MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT;
3746 }
3728 3747
3729 max_table_size = BIT(MLX5_CAP_FLOWTABLE_NIC_RX(dev->mdev,
3730 log_max_ft_size));
3731 if (max_table_size < MLX5_FS_MAX_ENTRIES)3748 if (max_table_size < MLX5_FS_MAX_ENTRIES)
3732 return ERR_PTR(-ENOMEM);3749 return ERR_PTR(-ENOMEM);
3733 3750
3734 if (mcast)3751 if (mcast)
3735 priority = MLX5_IB_FLOW_MCAST_PRIO;3752 priority = MLX5_IB_FLOW_MCAST_PRIO;
3736 else3753 else
3737 priority = ib_prio_to_core_prio(priority, false);3754 priority = ib_prio_to_core_prio(fs_matcher->priority, false);
3738 3755
3739 ns = mlx5_get_flow_namespace(dev->mdev, MLX5_FLOW_NAMESPACE_BYPASS);3756 ns = mlx5_get_flow_namespace(dev->mdev, fs_matcher->ns_type);
3740 if (!ns)3757 if (!ns)
3741 return ERR_PTR(-ENOTSUPP);3758 return ERR_PTR(-ENOTSUPP);
3742 3759
3743 prio = &dev->flow_db->prios[priority];3760 if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_BYPASS)
3761 prio = &dev->flow_db->prios[priority];
3762 else
3763 prio = &dev->flow_db->egress_prios[priority];
3744 3764
3745 if (prio->flow_table)3765 if (prio->flow_table)
3746 return prio;3766 return prio;
3747 3767
3748 return _get_prio(ns, prio, priority, MLX5_FS_MAX_ENTRIES,3768 return _get_prio(ns, prio, priority, MLX5_FS_MAX_ENTRIES,
3749 MLX5_FS_MAX_TYPES, 0);3769 MLX5_FS_MAX_TYPES, flags);
3750}3770}
3751 3771
3752static struct mlx5_ib_flow_handler *3772static struct mlx5_ib_flow_handler *
@@ -3845,7 +3865,6 @@ mlx5_ib_raw_fs_rule_add(struct mlx5_ib_dev *dev, · 92 unmodified lines
3845{3865{
3846 struct mlx5_flow_destination *dst;3866 struct mlx5_flow_destination *dst;
3847 struct mlx5_ib_flow_prio *ft_prio;3867 struct mlx5_ib_flow_prio *ft_prio;
3848 int priority = fs_matcher->priority;
3849 struct mlx5_ib_flow_handler *handler;3868 struct mlx5_ib_flow_handler *handler;
3850 bool mcast;3869 bool mcast;
3851 int err;3870 int err;
@@ -3863,7 +3882,7 @@ mlx5_ib_raw_fs_rule_add(struct mlx5_ib_dev *dev, · 11 unmodified lines
3863 mcast = raw_fs_is_multicast(fs_matcher, cmd_in);3882 mcast = raw_fs_is_multicast(fs_matcher, cmd_in);
3864 mutex_lock(&dev->flow_db->lock);3883 mutex_lock(&dev->flow_db->lock);
3865 3884
3866 ft_prio = _get_flow_table(dev, priority, mcast);3885 ft_prio = _get_flow_table(dev, fs_matcher, mcast);
3867 if (IS_ERR(ft_prio)) {3886 if (IS_ERR(ft_prio)) {
3868 err = PTR_ERR(ft_prio);3887 err = PTR_ERR(ft_prio);
3869 goto unlock;3888 goto unlock;
drivers/infiniband/hw/mlx5/mlx5_ib.h+1−0
@@ -190,6 +190,7 @@ struct mlx5_ib_flow_matcher { · 189 unmodified lines
190 struct mlx5_ib_match_params matcher_mask;190 struct mlx5_ib_match_params matcher_mask;
191 int mask_len;191 int mask_len;
192 enum mlx5_ib_flow_type flow_type;192 enum mlx5_ib_flow_type flow_type;
193 enum mlx5_flow_namespace_type ns_type;
193 u16 priority;194 u16 priority;
194 struct mlx5_core_dev *mdev;195 struct mlx5_core_dev *mdev;
195 atomic_t usecnt;196 atomic_t usecnt;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t