-/* Make sure free list has at least given number of free buffers. */
-uword
-CLIB_MULTIARCH_FN (dpdk_buffer_fill_free_list) (vlib_main_t * vm,
- vlib_buffer_free_list_t * fl,
- uword min_free_buffers)
-{
- dpdk_main_t *dm = &dpdk_main;
- dpdk_buffer_main_t *dbm = &dpdk_buffer_main;
- struct rte_mbuf **mb;
- uword n_left, first;
- word n_alloc;
- unsigned socket_id = rte_socket_id ();
- u32 thread_index = vlib_get_thread_index ();
- dpdk_buffer_per_thread_data *d = vec_elt_at_index (dbm->ptd, thread_index);
- struct rte_mempool *rmp = dm->pktmbuf_pools[socket_id];
- dpdk_mempool_private_t *privp = rte_mempool_get_priv (rmp);
- vlib_buffer_t bt;
- u32 *bi;
-
- /* Too early? */
- if (PREDICT_FALSE (rmp == 0))
- return 0;
-
- /* Already have enough free buffers on free list? */
- n_alloc = min_free_buffers - vec_len (fl->buffers);
- if (n_alloc <= 0)
- return min_free_buffers;
-
- /* Always allocate round number of buffers. */
- n_alloc = round_pow2 (n_alloc, CLIB_CACHE_LINE_BYTES / sizeof (u32));
-
- /* Always allocate new buffers in reasonably large sized chunks. */
- n_alloc = clib_max (n_alloc, fl->min_n_buffers_each_alloc);
-
- vec_validate_aligned (d->mbuf_alloc_list, n_alloc - 1,
- CLIB_CACHE_LINE_BYTES);
-
- if (rte_mempool_get_bulk (rmp, (void *) d->mbuf_alloc_list, n_alloc) < 0)
- return 0;
-
- clib_memset (&bt, 0, sizeof (vlib_buffer_t));
- vlib_buffer_init_for_free_list (&bt, fl);
- bt.buffer_pool_index = privp->buffer_pool_index;
-
- _vec_len (d->mbuf_alloc_list) = n_alloc;