+static inline void __attribute__((always_inline)) +virtio_xmit_cleanup(struct virtqueue *vq) +{
Please don't use always inline, frustrating the compiler isn't going to help. + uint16_t i, desc_idx; + int nb_free = 0; + struct rte_mbuf *m, *free[VIRTIO_TX_MAX_FREE_BUF_SZ]; + + desc_idx = (uint16_t)(vq->vq_used_cons_idx & + ((vq->vq_nentries >> 1) - 1)); + free[0] = (struct rte_mbuf *)vq->vq_descx[desc_idx++].cookie; + nb_free = 1; + + for (i = 1; i < VIRTIO_TX_FREE_NR; i++) { + m = (struct rte_mbuf *)vq->vq_descx[desc_idx++].cookie; + if (likely(m->pool == free[0]->pool)) + free[nb_free++] = m; + else { + rte_mempool_put_bulk(free[0]->pool, (void **)free, + nb_free); + free[0] = m; + nb_free = 1; + } + } + + rte_mempool_put_bulk(free[0]->pool, (void **)free, nb_free); + vq->vq_used_cons_idx += VIRTIO_TX_FREE_NR; + vq->vq_free_cnt += (VIRTIO_TX_FREE_NR << 1); + + return; +} Don't add return; at end of void functions. It only clutters things for no reason.