*datasize = mtu + ETH_HLEN;
 }
 
-int mana_pre_alloc_rxbufs(struct mana_port_context *mpc, int new_mtu)
+int mana_pre_alloc_rxbufs(struct mana_port_context *mpc, int new_mtu, int num_queues)
 {
        struct device *dev;
        struct page *page;
 
        dev = mpc->ac->gdma_dev->gdma_context->dev;
 
-       num_rxb = mpc->num_queues * mpc->rx_queue_size;
+       num_rxb = num_queues * mpc->rx_queue_size;
 
        WARN(mpc->rxbufs_pre, "mana rxbufs_pre exists\n");
        mpc->rxbufs_pre = kmalloc_array(num_rxb, sizeof(void *), GFP_KERNEL);
        int err;
 
        /* Pre-allocate buffers to prevent failure in mana_attach later */
-       err = mana_pre_alloc_rxbufs(mpc, new_mtu);
+       err = mana_pre_alloc_rxbufs(mpc, new_mtu, mpc->num_queues);
        if (err) {
                netdev_err(ndev, "Insufficient memory for new MTU\n");
                return err;
 
        struct mana_port_context *apc = netdev_priv(ndev);
        unsigned int new_count = channels->combined_count;
        unsigned int old_count = apc->num_queues;
-       int err, err2;
+       int err;
+
+       err = mana_pre_alloc_rxbufs(apc, ndev->mtu, new_count);
+       if (err) {
+               netdev_err(ndev, "Insufficient memory for new allocations");
+               return err;
+       }
 
        err = mana_detach(ndev, false);
        if (err) {
                netdev_err(ndev, "mana_detach failed: %d\n", err);
-               return err;
+               goto out;
        }
 
        apc->num_queues = new_count;
        err = mana_attach(ndev);
-       if (!err)
-               return 0;
-
-       netdev_err(ndev, "mana_attach failed: %d\n", err);
-
-       /* Try to roll it back to the old configuration. */
-       apc->num_queues = old_count;
-       err2 = mana_attach(ndev);
-       if (err2)
-               netdev_err(ndev, "mana re-attach failed: %d\n", err2);
+       if (err) {
+               apc->num_queues = old_count;
+               netdev_err(ndev, "mana_attach failed: %d\n", err);
+       }
 
+out:
+       mana_pre_dealloc_rxbufs(apc);
        return err;
 }
 
 
        /* pre-allocating new buffers to prevent failures in mana_attach() later */
        apc->rx_queue_size = new_rx;
-       err = mana_pre_alloc_rxbufs(apc, ndev->mtu);
+       err = mana_pre_alloc_rxbufs(apc, ndev->mtu, apc->num_queues);
        apc->rx_queue_size = old_rx;
        if (err) {
                netdev_err(ndev, "Insufficient memory for new allocations\n");
 
 void mana_chn_setxdp(struct mana_port_context *apc, struct bpf_prog *prog);
 int mana_bpf(struct net_device *ndev, struct netdev_bpf *bpf);
 void mana_query_gf_stats(struct mana_port_context *apc);
-int mana_pre_alloc_rxbufs(struct mana_port_context *apc, int mtu);
+int mana_pre_alloc_rxbufs(struct mana_port_context *apc, int mtu, int num_queues);
 void mana_pre_dealloc_rxbufs(struct mana_port_context *apc);
 
 extern const struct ethtool_ops mana_ethtool_ops;