return ((ntc >= ntu) ? 0 : ring->desc_num) + ntc - ntu;
 }
 
-static void hns3_nic_alloc_rx_buffers(struct hns3_enet_ring *ring,
+/* Return true if there is any allocation failure */
+static bool hns3_nic_alloc_rx_buffers(struct hns3_enet_ring *ring,
                                      int cleand_count)
 {
        struct hns3_desc_cb *desc_cb;
                                hns3_rl_err(ring_to_netdev(ring),
                                            "alloc rx buffer failed: %d\n",
                                            ret);
-                               break;
+
+                               writel(i, ring->tqp->io_base +
+                                      HNS3_RING_RX_RING_HEAD_REG);
+                               return true;
                        }
                        hns3_replace_buffer(ring, ring->next_to_use, &res_cbs);
 
        }
 
        writel(i, ring->tqp->io_base + HNS3_RING_RX_RING_HEAD_REG);
+       return false;
 }
 
 static bool hns3_can_reuse_page(struct hns3_desc_cb *cb)
 {
 #define RCB_NOF_ALLOC_RX_BUFF_ONCE 16
        int unused_count = hns3_desc_unused(ring);
+       bool failure = false;
        int recv_pkts = 0;
        int err;
 
        while (recv_pkts < budget) {
                /* Reuse or realloc buffers */
                if (unused_count >= RCB_NOF_ALLOC_RX_BUFF_ONCE) {
-                       hns3_nic_alloc_rx_buffers(ring, unused_count);
-                       unused_count = hns3_desc_unused(ring) -
-                                       ring->pending_buf;
+                       failure = failure ||
+                               hns3_nic_alloc_rx_buffers(ring, unused_count);
+                       unused_count = 0;
                }
 
                /* Poll one pkt */
        }
 
 out:
-       /* Make all data has been write before submit */
-       if (unused_count > 0)
-               hns3_nic_alloc_rx_buffers(ring, unused_count);
-
-       return recv_pkts;
+       return failure ? budget : recv_pkts;
 }
 
 static void hns3_update_rx_int_coalesce(struct hns3_enet_tqp_vector *tqp_vector)