ix  += fbc->strides_offset;
        frag = ix >> fbc->log_frag_strides;
  
 -      return fbc->frag_buf.frags[frag].buf +
 -              ((fbc->frag_sz_m1 & ix) << fbc->log_stride);
 +      return fbc->frags[frag].buf + ((fbc->frag_sz_m1 & ix) << fbc->log_stride);
  }
  
+ static inline u32
+ mlx5_frag_buf_get_idx_last_contig_stride(struct mlx5_frag_buf_ctrl *fbc, u32 ix)
+ {
+       u32 last_frag_stride_idx = (ix + fbc->strides_offset) | fbc->frag_sz_m1;
+ 
+       return min_t(u32, last_frag_stride_idx - fbc->strides_offset, fbc->sz_m1);
+ }
+ 
  int mlx5_cmd_init(struct mlx5_core_dev *dev);
  void mlx5_cmd_cleanup(struct mlx5_core_dev *dev);
  void mlx5_cmd_use_events(struct mlx5_core_dev *dev);
 
  }
  EXPORT_SYMBOL(mr_fill_mroute);
  
-       e = 0;
-       s_e = 0;
 +static bool mr_mfc_uses_dev(const struct mr_table *mrt,
 +                          const struct mr_mfc *c,
 +                          const struct net_device *dev)
 +{
 +      int ct;
 +
 +      for (ct = c->mfc_un.res.minvif; ct < c->mfc_un.res.maxvif; ct++) {
 +              if (VIF_EXISTS(mrt, ct) && c->mfc_un.res.ttls[ct] < 255) {
 +                      const struct vif_device *vif;
 +
 +                      vif = &mrt->vif_table[ct];
 +                      if (vif->dev == dev)
 +                              return true;
 +              }
 +      }
 +      return false;
 +}
 +
 +int mr_table_dump(struct mr_table *mrt, struct sk_buff *skb,
 +                struct netlink_callback *cb,
 +                int (*fill)(struct mr_table *mrt, struct sk_buff *skb,
 +                            u32 portid, u32 seq, struct mr_mfc *c,
 +                            int cmd, int flags),
 +                spinlock_t *lock, struct fib_dump_filter *filter)
 +{
 +      unsigned int e = 0, s_e = cb->args[1];
 +      unsigned int flags = NLM_F_MULTI;
 +      struct mr_mfc *mfc;
 +      int err;
 +
 +      if (filter->filter_set)
 +              flags |= NLM_F_DUMP_FILTERED;
 +
 +      list_for_each_entry_rcu(mfc, &mrt->mfc_cache_list, list) {
 +              if (e < s_e)
 +                      goto next_entry;
 +              if (filter->dev &&
 +                  !mr_mfc_uses_dev(mrt, mfc, filter->dev))
 +                      goto next_entry;
 +
 +              err = fill(mrt, skb, NETLINK_CB(cb->skb).portid,
 +                         cb->nlh->nlmsg_seq, mfc, RTM_NEWROUTE, flags);
 +              if (err < 0)
 +                      goto out;
 +next_entry:
 +              e++;
 +      }
 +
 +      spin_lock_bh(lock);
 +      list_for_each_entry(mfc, &mrt->mfc_unres_queue, list) {
 +              if (e < s_e)
 +                      goto next_entry2;
 +              if (filter->dev &&
 +                  !mr_mfc_uses_dev(mrt, mfc, filter->dev))
 +                      goto next_entry2;
 +
 +              err = fill(mrt, skb, NETLINK_CB(cb->skb).portid,
 +                         cb->nlh->nlmsg_seq, mfc, RTM_NEWROUTE, flags);
 +              if (err < 0) {
 +                      spin_unlock_bh(lock);
 +                      goto out;
 +              }
 +next_entry2:
 +              e++;
 +      }
 +      spin_unlock_bh(lock);
 +      err = 0;
 +      e = 0;
 +
 +out:
 +      cb->args[1] = e;
 +      return err;
 +}
 +EXPORT_SYMBOL(mr_table_dump);
 +
  int mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb,
                     struct mr_table *(*iter)(struct net *net,
                                              struct mr_table *mrt),