return 0;
 }
 
+static u64 mlxsw_sp_dpipe_table_erif_size_get(void *priv)
+{
+       struct mlxsw_sp *mlxsw_sp = priv;
+
+       return MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_RIFS);
+}
+
 static struct devlink_dpipe_table_ops mlxsw_sp_erif_ops = {
        .matches_dump = mlxsw_sp_dpipe_table_erif_matches_dump,
        .actions_dump = mlxsw_sp_dpipe_table_erif_actions_dump,
        .entries_dump = mlxsw_sp_dpipe_table_erif_entries_dump,
        .counters_set_update = mlxsw_sp_dpipe_table_erif_counters_update,
+       .size_get = mlxsw_sp_dpipe_table_erif_size_get,
 };
 
 static int mlxsw_sp_dpipe_erif_table_init(struct mlxsw_sp *mlxsw_sp)
 {
        struct devlink *devlink = priv_to_devlink(mlxsw_sp->core);
-       u64 table_size;
 
-       table_size = MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_RIFS);
        return devlink_dpipe_table_register(devlink,
                                            MLXSW_SP_DPIPE_TABLE_NAME_ERIF,
                                            &mlxsw_sp_erif_ops,
-                                           mlxsw_sp, table_size,
-                                           false);
+                                           mlxsw_sp, false);
 }
 
 static void mlxsw_sp_dpipe_erif_table_fini(struct mlxsw_sp *mlxsw_sp)
 
  * struct devlink_dpipe_table - table object
  * @priv: private
  * @name: table name
- * @size: maximum number of entries
  * @counters_enabled: indicates if counters are active
  * @counter_control_extern: indicates if counter control is in dpipe or
  *                         external tool
        void *priv;
        struct list_head list;
        const char *name;
-       u64 size;
        bool counters_enabled;
        bool counter_control_extern;
        struct devlink_dpipe_table_ops *table_ops;
  * @counters_set_update - when changing the counter status hardware sync
  *                       maybe needed to allocate/free counter related
  *                       resources
+ * @size_get - get size
  */
 struct devlink_dpipe_table_ops {
        int (*actions_dump)(void *priv, struct sk_buff *skb);
        int (*entries_dump)(void *priv, bool counters_enabled,
                            struct devlink_dpipe_dump_ctx *dump_ctx);
        int (*counters_set_update)(void *priv, bool enable);
+       u64 (*size_get)(void *priv);
 };
 
 /**
 int devlink_dpipe_table_register(struct devlink *devlink,
                                 const char *table_name,
                                 struct devlink_dpipe_table_ops *table_ops,
-                                void *priv, u64 size,
-                                bool counter_control_extern);
+                                void *priv, bool counter_control_extern);
 void devlink_dpipe_table_unregister(struct devlink *devlink,
                                    const char *table_name);
 int devlink_dpipe_headers_register(struct devlink *devlink,
 
                                   struct devlink_dpipe_table *table)
 {
        struct nlattr *table_attr;
+       u64 table_size;
 
+       table_size = table->table_ops->size_get(table->priv);
        table_attr = nla_nest_start(skb, DEVLINK_ATTR_DPIPE_TABLE);
        if (!table_attr)
                return -EMSGSIZE;
 
        if (nla_put_string(skb, DEVLINK_ATTR_DPIPE_TABLE_NAME, table->name) ||
-           nla_put_u64_64bit(skb, DEVLINK_ATTR_DPIPE_TABLE_SIZE, table->size,
+           nla_put_u64_64bit(skb, DEVLINK_ATTR_DPIPE_TABLE_SIZE, table_size,
                              DEVLINK_ATTR_PAD))
                goto nla_put_failure;
        if (nla_put_u8(skb, DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED,
  *     @table_name: table name
  *     @table_ops: table ops
  *     @priv: priv
- *     @size: size
  *     @counter_control_extern: external control for counters
  */
 int devlink_dpipe_table_register(struct devlink *devlink,
                                 const char *table_name,
                                 struct devlink_dpipe_table_ops *table_ops,
-                                void *priv, u64 size,
-                                bool counter_control_extern)
+                                void *priv, bool counter_control_extern)
 {
        struct devlink_dpipe_table *table;
 
        if (devlink_dpipe_table_find(&devlink->dpipe_table_list, table_name))
                return -EEXIST;
 
+       if (WARN_ON(!table_ops->size_get))
+               return -EINVAL;
+
        table = kzalloc(sizeof(*table), GFP_KERNEL);
        if (!table)
                return -ENOMEM;
        table->name = table_name;
        table->table_ops = table_ops;
        table->priv = priv;
-       table->size = size;
        table->counter_control_extern = counter_control_extern;
 
        mutex_lock(&devlink_mutex);