| 7816 | } |
| 7817 | |
| 7818 | static int |
| 7819 | mlx5_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; |
| 7864 | err: |
| 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 | } |
no test coverage detected