if (fte->action.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
                list_for_each_entry(dst, &fte->node.children, node.list) {
                        enum mlx5_flow_destination_type type = dst->dest_attr.type;
-                       u32 id;
  
 -                      if (num_actions == MLX5_FLOW_CONTEXT_ACTION_MAX) {
 +                      if (num_actions == MLX5_FLOW_CONTEXT_ACTION_MAX ||
 +                          num_term_actions >= MLX5_FLOW_CONTEXT_ACTION_MAX) {
                                err = -ENOSPC;
                                goto free_actions;
                        }
  
-                       switch (type) {
-                       case MLX5_FLOW_DESTINATION_TYPE_COUNTER:
-                               id = dst->dest_attr.counter_id;
+                       if (type == MLX5_FLOW_DESTINATION_TYPE_COUNTER)
+                               continue;
  
-                               tmp_action =
-                                       mlx5dr_action_create_flow_counter(id);
-                               if (!tmp_action) {
-                                       err = -ENOMEM;
-                                       goto free_actions;
-                               }
-                               fs_dr_actions[fs_dr_num_actions++] = tmp_action;
-                               actions[num_actions++] = tmp_action;
-                               break;
+                       switch (type) {
                        case MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE:
 -                              tmp_action = create_ft_action(dev, dst);
 +                              tmp_action = create_ft_action(domain, dst);
                                if (!tmp_action) {
                                        err = -ENOMEM;
                                        goto free_actions;
                }
        }
  
+       if (fte->action.action & MLX5_FLOW_CONTEXT_ACTION_COUNT) {
+               list_for_each_entry(dst, &fte->node.children, node.list) {
+                       u32 id;
+ 
+                       if (dst->dest_attr.type !=
+                           MLX5_FLOW_DESTINATION_TYPE_COUNTER)
+                               continue;
+ 
+                       if (num_actions == MLX5_FLOW_CONTEXT_ACTION_MAX) {
+                               err = -ENOSPC;
+                               goto free_actions;
+                       }
+ 
+                       id = dst->dest_attr.counter_id;
+                       tmp_action =
+                               mlx5dr_action_create_flow_counter(id);
+                       if (!tmp_action) {
+                               err = -ENOMEM;
+                               goto free_actions;
+                       }
+ 
+                       fs_dr_actions[fs_dr_num_actions++] = tmp_action;
+                       actions[num_actions++] = tmp_action;
+               }
+       }
+ 
        params.match_sz = match_sz;
        params.match_buf = (u64 *)fte->val;
 -
 -      if (term_action)
 -              actions[num_actions++] = term_action;
 +      if (num_term_actions == 1) {
 +              if (term_actions->reformat)
 +                      actions[num_actions++] = term_actions->reformat;
 +
 +              actions[num_actions++] = term_actions->dest;
 +      } else if (num_term_actions > 1) {
 +              tmp_action = mlx5dr_action_create_mult_dest_tbl(domain,
 +                                                              term_actions,
 +                                                              num_term_actions);
 +              if (!tmp_action) {
 +                      err = -EOPNOTSUPP;
 +                      goto free_actions;
 +              }
 +              fs_dr_actions[fs_dr_num_actions++] = tmp_action;
 +              actions[num_actions++] = tmp_action;
 +      }
  
        rule = mlx5dr_rule_create(group->fs_dr_matcher.dr_matcher,
                                  ¶ms,
 
   */
  static void slip_write_wakeup(struct tty_struct *tty)
  {
-       struct slip *sl = tty->disc_data;
+       struct slip *sl;
+ 
+       rcu_read_lock();
+       sl = rcu_dereference(tty->disc_data);
+       if (!sl)
+               goto out;
  
        schedule_work(&sl->tx_work);
+ out:
+       rcu_read_unlock();
  }
  
 -static void sl_tx_timeout(struct net_device *dev)
 +static void sl_tx_timeout(struct net_device *dev, unsigned int txqueue)
  {
        struct slip *sl = netdev_priv(dev);