From 052c2dc7e1fb5c9ec793371b48b988cfeed1c87f Mon Sep 17 00:00:00 2001 From: Pierre Pfister Date: Mon, 20 Aug 2018 13:48:15 +0200 Subject: Enable storing state in flowhash hash tables Flowhash user can now rely on the table to be initialized to zero and know when an entry is cleaned up by the garbage collector. This is usefull to store state in flowhash entries without the need for callbacks when an entry timeouts. Change-Id: Ieece6b7277241f84ea3f2473d0771c6ee8ce460c Signed-off-by: Pierre Pfister --- src/vppinfra/flowhash_template.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/vppinfra') diff --git a/src/vppinfra/flowhash_template.h b/src/vppinfra/flowhash_template.h index 359b9690a50..92272563878 100644 --- a/src/vppinfra/flowhash_template.h +++ b/src/vppinfra/flowhash_template.h @@ -374,6 +374,7 @@ FVT(flowhash) *FV(flowhash_alloc)(u32 fixed_entries, u32 collision_buckets) /* Fill free elements list */ int i; + memset(h->entries, 0, sizeof(h->entries[0]) * entries); for (i = 1; i <= collision_buckets; i++) { h->free_buckets_indices[-i] = @@ -525,9 +526,13 @@ FV(__flowhash_get_chained) (FVT(flowhash) *h, FVT(flowhash_lkey) *k, } static_always_inline void -FV(flowhash_gc)(FVT(flowhash) *h, u32 time_now) +FV(flowhash_gc)(FVT(flowhash) *h, u32 time_now, + u32 *freed_index, u32 *freed_len) { u32 ei; + if (freed_index) + *freed_len = 0; + if (PREDICT_FALSE(h->collision_buckets_mask == (((u32)0) - 1))) return; @@ -565,6 +570,12 @@ FV(flowhash_gc)(FVT(flowhash) *h, u32 time_now) if (!found) { + /* Tell caller we freed this */ + if (freed_index) + { + *freed_index = ei; + *freed_len = FLOWHASH_ENTRIES_PER_BUCKETS; + } /* The bucket is not used. Let's free it. */ h->free_buckets_position--; /* Reset forward link */ -- cgit 1.2.3-korg