- /* *INDENT-OFF* */
- pool_foreach_index (index, rm->pool, ({
- reass = pool_elt_at_index (rm->pool, index);
- if (now > reass->last_heard + rm->timeout)
- {
- vec_add1 (pool_indexes_to_free, index);
- }
- }));
- /* *INDENT-ON* */
- int *i;
- /* *INDENT-OFF* */
- vec_foreach (i, pool_indexes_to_free)
- {
- ip4_reass_t *reass = pool_elt_at_index (rm->pool, i[0]);
- ip4_reass_on_timeout (vm, rm, reass, &vec_drop_timeout);
- ip4_reass_free (rm, reass);
- }
- /* *INDENT-ON* */
+ const uword nthreads = os_get_nthreads ();
+ for (thread_index = 0; thread_index < nthreads; ++thread_index)
+ {
+ ip4_reass_per_thread_t *rt = &rm->per_thread_data[thread_index];
+ clib_spinlock_lock (&rt->lock);
+
+ vec_reset_length (pool_indexes_to_free);
+ /* *INDENT-OFF* */
+ pool_foreach_index (index, rt->pool, ({
+ reass = pool_elt_at_index (rt->pool, index);
+ if (now > reass->last_heard + rm->timeout)
+ {
+ vec_add1 (pool_indexes_to_free, index);
+ }
+ }));
+ /* *INDENT-ON* */
+ int *i;
+ /* *INDENT-OFF* */
+ vec_foreach (i, pool_indexes_to_free)
+ {
+ ip4_reass_t *reass = pool_elt_at_index (rt->pool, i[0]);
+ u32 before = vec_len (vec_drop_timeout);
+ vlib_buffer_t *b = vlib_get_buffer (vm, reass->first_bi);
+ if (PREDICT_FALSE (b->flags & VLIB_BUFFER_IS_TRACED))
+ {
+ if (pool_is_free_index (vm->trace_main.trace_buffer_pool,
+ b->trace_index))
+ {
+ /* the trace is gone, don't trace this buffer anymore */
+ b->flags &= ~VLIB_BUFFER_IS_TRACED;
+ }
+ }
+ ip4_reass_on_timeout (vm, rm, reass, &vec_drop_timeout);
+ u32 after = vec_len (vec_drop_timeout);
+ ASSERT (rt->buffers_n >= (after - before));
+ rt->buffers_n -= (after - before);
+ ip4_reass_free (rm, rt, reass);
+ }
+ /* *INDENT-ON* */
+
+ clib_spinlock_unlock (&rt->lock);
+ }