rhashtable_destroy(&fg->ftes_hash);
        ida_destroy(&fg->fte_allocator);
-       if (ft->autogroup.active)
+       if (ft->autogroup.active && fg->max_ftes == ft->autogroup.group_size)
                ft->autogroup.num_groups--;
        err = rhltable_remove(&ft->fgs_hash,
                              &fg->hash,
 
        ft->autogroup.active = true;
        ft->autogroup.required_groups = max_num_groups;
+       /* We save place for flow groups in addition to max types */
+       ft->autogroup.group_size = ft->max_fte / (max_num_groups + 1);
 
        return ft;
 }
                return ERR_PTR(-ENOENT);
 
        if (ft->autogroup.num_groups < ft->autogroup.required_groups)
-               /* We save place for flow groups in addition to max types */
-               group_size = ft->max_fte / (ft->autogroup.required_groups + 1);
+               group_size = ft->autogroup.group_size;
 
        /*  ft->max_fte == ft->autogroup.max_types */
        if (group_size == 0)
        if (IS_ERR(fg))
                goto out;
 
-       ft->autogroup.num_groups++;
+       if (group_size == ft->autogroup.group_size)
+               ft->autogroup.num_groups++;
 
 out:
        return fg;