MCPcopy Create free account
hub / github.com/F-Stack/f-stack / mlx5_flow_cache_flow_toggle

Function mlx5_flow_cache_flow_toggle

dpdk/drivers/net/mlx5/mlx5_flow.c:7818–7879  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

7816}
7817
7818static int
7819mlx5_flow_cache_flow_toggle(struct rte_eth_dev *dev, bool orig_prio)
7820{
7821 struct mlx5_priv *priv = dev->data->dev_private;
7822 struct rte_pmd_mlx5_flow_engine_mode_info *mode_info = &priv->mode_info;
7823 struct mlx5_dv_flow_info *flow_info;
7824 struct rte_flow_attr attr;
7825 struct rte_flow_error error;
7826 struct rte_flow *high, *low;
7827
7828 flow_info = LIST_FIRST(&mode_info->hot_upgrade);
7829 while (flow_info) {
7830 /* DUP flow may have the same priority. */
7831 if (flow_info->orig_prio != flow_info->attr.priority) {
7832 attr = flow_info->attr;
7833 if (orig_prio)
7834 attr.priority = flow_info->orig_prio;
7835 flow_info->flow_idx_high_prio = flow_list_create(dev, MLX5_FLOW_TYPE_GEN,
7836 &attr, flow_info->items, flow_info->actions,
7837 true, &error);
7838 if (!flow_info->flow_idx_high_prio) {
7839 DRV_LOG(ERR, "Priority toggle failed internally.");
7840 goto err;
7841 }
7842 }
7843 flow_info = LIST_NEXT(flow_info, next);
7844 }
7845 /* Delete the low priority rules and swap the flow handle. */
7846 flow_info = LIST_FIRST(&mode_info->hot_upgrade);
7847 while (flow_info) {
7848 MLX5_ASSERT(flow_info->flow_idx_low_prio);
7849 if (flow_info->orig_prio != flow_info->attr.priority) {
7850 high = mlx5_ipool_get(priv->flows[MLX5_FLOW_TYPE_GEN],
7851 flow_info->flow_idx_high_prio);
7852 low = mlx5_ipool_get(priv->flows[MLX5_FLOW_TYPE_GEN],
7853 flow_info->flow_idx_low_prio);
7854 if (high && low) {
7855 RTE_SWAP(*low, *high);
7856 flow_list_destroy(dev, MLX5_FLOW_TYPE_GEN,
7857 flow_info->flow_idx_low_prio);
7858 flow_info->flow_idx_high_prio = 0;
7859 }
7860 }
7861 flow_info = LIST_NEXT(flow_info, next);
7862 }
7863 return 0;
7864err:
7865 /* Destroy preceding successful high priority rules. */
7866 flow_info = LIST_FIRST(&mode_info->hot_upgrade);
7867 while (flow_info) {
7868 if (flow_info->orig_prio != flow_info->attr.priority) {
7869 if (flow_info->flow_idx_high_prio)
7870 flow_list_destroy(dev, MLX5_FLOW_TYPE_GEN,
7871 flow_info->flow_idx_high_prio);
7872 else
7873 break;
7874 flow_info->flow_idx_high_prio = 0;
7875 }

Callers 1

Calls 3

flow_list_createFunction · 0.85
mlx5_ipool_getFunction · 0.85
flow_list_destroyFunction · 0.85

Tested by

no test coverage detected