struct mlx5_eqe *eqe;
        int i;
 
-       for (i = 0; i < eq->nent; i++) {
+       for (i = 0; i < eq_get_size(eq); i++) {
                eqe = get_eqe(eq, i);
                eqe->owner = MLX5_EQE_OWNER_INIT_VAL;
        }
 create_map_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq,
              struct mlx5_eq_param *param)
 {
+       u8 log_eq_size = order_base_2(param->nent + MLX5_NUM_SPARE_EQE);
        struct mlx5_cq_table *cq_table = &eq->cq_table;
        u32 out[MLX5_ST_SZ_DW(create_eq_out)] = {0};
+       u8 log_eq_stride = ilog2(MLX5_EQE_SIZE);
        struct mlx5_priv *priv = &dev->priv;
        u8 vecidx = param->irq_index;
        __be64 *pas;
        spin_lock_init(&cq_table->lock);
        INIT_RADIX_TREE(&cq_table->tree, GFP_ATOMIC);
 
-       eq->nent = roundup_pow_of_two(param->nent + MLX5_NUM_SPARE_EQE);
        eq->cons_index = 0;
-       err = mlx5_buf_alloc(dev, eq->nent * MLX5_EQE_SIZE, &eq->buf);
+
+       err = mlx5_frag_buf_alloc_node(dev, wq_get_byte_sz(log_eq_size, log_eq_stride),
+                                      &eq->frag_buf, dev->priv.numa_node);
        if (err)
                return err;
 
+       mlx5_init_fbc(eq->frag_buf.frags, log_eq_stride, log_eq_size, &eq->fbc);
        init_eq_buf(eq);
 
        inlen = MLX5_ST_SZ_BYTES(create_eq_in) +
-               MLX5_FLD_SZ_BYTES(create_eq_in, pas[0]) * eq->buf.npages;
+               MLX5_FLD_SZ_BYTES(create_eq_in, pas[0]) * eq->frag_buf.npages;
 
        in = kvzalloc(inlen, GFP_KERNEL);
        if (!in) {
        }
 
        pas = (__be64 *)MLX5_ADDR_OF(create_eq_in, in, pas);
-       mlx5_fill_page_array(&eq->buf, pas);
+       mlx5_fill_page_frag_array(&eq->frag_buf, pas);
 
        MLX5_SET(create_eq_in, in, opcode, MLX5_CMD_OP_CREATE_EQ);
        if (!param->mask[0] && MLX5_CAP_GEN(dev, log_max_uctx))
                                 param->mask[i]);
 
        eqc = MLX5_ADDR_OF(create_eq_in, in, eq_context_entry);
-       MLX5_SET(eqc, eqc, log_eq_size, ilog2(eq->nent));
+       MLX5_SET(eqc, eqc, log_eq_size, eq->fbc.log_sz);
        MLX5_SET(eqc, eqc, uar_page, priv->uar->index);
        MLX5_SET(eqc, eqc, intr, vecidx);
        MLX5_SET(eqc, eqc, log_page_size,
-                eq->buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT);
+                eq->frag_buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT);
 
        err = mlx5_cmd_exec(dev, in, inlen, out, sizeof(out));
        if (err)
        kvfree(in);
 
 err_buf:
-       mlx5_buf_free(dev, &eq->buf);
+       mlx5_frag_buf_free(dev, &eq->frag_buf);
        return err;
 }
 
                               eq->eqn);
        synchronize_irq(eq->irqn);
 
-       mlx5_buf_free(dev, &eq->buf);
+       mlx5_frag_buf_free(dev, &eq->frag_buf);
 
        return err;
 }
 struct mlx5_eqe *mlx5_eq_get_eqe(struct mlx5_eq *eq, u32 cc)
 {
        u32 ci = eq->cons_index + cc;
+       u32 nent = eq_get_size(eq);
        struct mlx5_eqe *eqe;
 
-       eqe = get_eqe(eq, ci & (eq->nent - 1));
-       eqe = ((eqe->owner & 1) ^ !!(ci & eq->nent)) ? NULL : eqe;
+       eqe = get_eqe(eq, ci & (nent - 1));
+       eqe = ((eqe->owner & 1) ^ !!(ci & nent)) ? NULL : eqe;
        /* Make sure we read EQ entry contents after we've
         * checked the ownership bit.
         */
 
 };
 
 struct mlx5_eq {
+       struct mlx5_frag_buf_ctrl fbc;
+       struct mlx5_frag_buf    frag_buf;
        struct mlx5_core_dev    *dev;
        struct mlx5_cq_table    cq_table;
        __be32 __iomem          *doorbell;
        u32                     cons_index;
-       struct mlx5_frag_buf    buf;
        unsigned int            vecidx;
        unsigned int            irqn;
        u8                      eqn;
-       int                     nent;
        struct mlx5_rsc_debug   *dbg;
 };
 
        struct list_head        list;
 };
 
+static inline u32 eq_get_size(struct mlx5_eq *eq)
+{
+       return eq->fbc.sz_m1 + 1;
+}
+
 static inline struct mlx5_eqe *get_eqe(struct mlx5_eq *eq, u32 entry)
 {
-       return mlx5_buf_offset(&eq->buf, entry * MLX5_EQE_SIZE);
+       return mlx5_frag_buf_get_wqe(&eq->fbc, entry);
 }
 
 static inline struct mlx5_eqe *next_eqe_sw(struct mlx5_eq *eq)
 {
-       struct mlx5_eqe *eqe = get_eqe(eq, eq->cons_index & (eq->nent - 1));
+       struct mlx5_eqe *eqe = get_eqe(eq, eq->cons_index & eq->fbc.sz_m1);
 
-       return ((eqe->owner & 1) ^ !!(eq->cons_index & eq->nent)) ? NULL : eqe;
+       return (eqe->owner ^ (eq->cons_index >> eq->fbc.log_sz)) & 1 ? NULL : eqe;
 }
 
 static inline void eq_update_ci(struct mlx5_eq *eq, int arm)