X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Fflowhash_template.h;h=922725638781f212ced8fdcc95b13da019f6fb32;hb=12a30202ec213d1ffbee503e61b1cec0bc4861bb;hp=8f8fef2c495da7cb996d2bc7a1346b38810f00c1;hpb=953f551e3629a3b96c678a35f5e6f507ea67cd84;p=vpp.git diff --git a/src/vppinfra/flowhash_template.h b/src/vppinfra/flowhash_template.h index 8f8fef2c495..92272563878 100644 --- a/src/vppinfra/flowhash_template.h +++ b/src/vppinfra/flowhash_template.h @@ -357,7 +357,7 @@ static_always_inline FVT(flowhash) *FV(flowhash_alloc)(u32 fixed_entries, u32 collision_buckets) { FVT(flowhash) *h; - u32 size; + uword size; void *mem; u32 entries; @@ -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 */