-#define pool_realloc_safe_aligned(P, align) \
- do \
- { \
- vlib_main_t *vm = vlib_get_main (); \
- u32 free_elts, max_elts, n_alloc; \
- ASSERT (vlib_get_thread_index () == 0); \
- vlib_worker_thread_barrier_sync (vm); \
- free_elts = pool_free_elts (P); \
- if (free_elts < POOL_REALLOC_SAFE_ELT_THRESH) \
- { \
- max_elts = pool_max_len (P); \
- n_alloc = clib_max (2 * max_elts, POOL_REALLOC_SAFE_ELT_THRESH); \
- pool_alloc_aligned (P, free_elts + n_alloc, align); \
- clib_bitmap_validate (pool_header (P)->free_bitmap, \
- max_elts + n_alloc); \
- } \
- pool_realloc_flag (P) = 0; \
- vlib_worker_thread_barrier_release (vm); \
- } \
- while (0)
+typedef struct pool_realloc_rpc_args_
+{
+ void **pool;
+ uword elt_size;
+ uword align;
+} pool_realloc_rpc_args_t;
+
+always_inline void
+pool_program_safe_realloc_rpc (void *args)
+{
+ vlib_main_t *vm = vlib_get_main ();
+ u32 free_elts, max_elts, n_alloc;
+ pool_realloc_rpc_args_t *pra;
+
+ ASSERT (vlib_get_thread_index () == 0);
+ pra = (pool_realloc_rpc_args_t *) args;
+
+ vlib_worker_thread_barrier_sync (vm);
+
+ free_elts = _pool_free_elts (*pra->pool, pra->elt_size);
+ if (free_elts < POOL_REALLOC_SAFE_ELT_THRESH)
+ {
+ max_elts = _vec_max_len (*pra->pool, pra->elt_size);
+ n_alloc = clib_max (2 * max_elts, POOL_REALLOC_SAFE_ELT_THRESH);
+ _pool_alloc (pra->pool, free_elts + n_alloc, pra->align, 0,
+ pra->elt_size);
+ }
+ pool_realloc_flag (*pra->pool) = 0;
+ clib_mem_free (args);
+
+ vlib_worker_thread_barrier_release (vm);
+}