vppinfra: add bihash_init2
Add controls to list / not list a specific bihash in clib_all_bihashes, to immediately initialize a bihash. clib_bihash_init2 is now the primary API. It takes a typical args_t structure. clib_bihash_init becomes a compatibility widget. It fabricates an args_t and calls init2... Type: refactor Ticket: VPP-1758 Signed-off-by: Dave Barach <dave@barachs.net> Change-Id: Ib3e1304884997cf7025af20bdc67a7dda290f15b (cherry picked from commit bdf9b97774f02458ede6b7c7ae2d5728bddba000)
This commit is contained in:
Dave Barach
committed by
Damjan Marion
parent
08940a2cb8
commit
5bdc1f5245
@ -46,18 +46,21 @@ void BV (clib_bihash_instantiate) (BVT (clib_bihash) * h)
|
||||
h->instantiated = 1;
|
||||
}
|
||||
|
||||
void BV (clib_bihash_init)
|
||||
(BVT (clib_bihash) * h, char *name, u32 nbuckets, uword memory_size)
|
||||
void BV (clib_bihash_init2) (BVT (clib_bihash_init2_args) * a)
|
||||
{
|
||||
int i;
|
||||
void *oldheap;
|
||||
nbuckets = 1 << (max_log2 (nbuckets));
|
||||
BVT (clib_bihash) * h = a->h;
|
||||
|
||||
h->name = (u8 *) name;
|
||||
h->nbuckets = nbuckets;
|
||||
h->log2_nbuckets = max_log2 (nbuckets);
|
||||
h->memory_size = memory_size;
|
||||
a->nbuckets = 1 << (max_log2 (a->nbuckets));
|
||||
|
||||
h->name = (u8 *) a->name;
|
||||
h->nbuckets = a->nbuckets;
|
||||
h->log2_nbuckets = max_log2 (a->nbuckets);
|
||||
h->memory_size = a->memory_size;
|
||||
h->instantiated = 0;
|
||||
h->fmt_fn = a->fmt_fn;
|
||||
|
||||
alloc_arena (h) = 0;
|
||||
|
||||
/*
|
||||
@ -66,19 +69,22 @@ void BV (clib_bihash_init)
|
||||
* If someone starts complaining that's not enough, we can shift
|
||||
* the offset by CLIB_LOG2_CACHE_LINE_BYTES...
|
||||
*/
|
||||
ASSERT (memory_size < (1ULL << BIHASH_BUCKET_OFFSET_BITS));
|
||||
h->fmt_fn = NULL;
|
||||
ASSERT (h->memory_size < (1ULL << BIHASH_BUCKET_OFFSET_BITS));
|
||||
|
||||
/* Add this hash table to the list */
|
||||
if (a->dont_add_to_all_bihash_list == 0)
|
||||
{
|
||||
for (i = 0; i < vec_len (clib_all_bihashes); i++)
|
||||
if (clib_all_bihashes[i] == h)
|
||||
return;
|
||||
|
||||
/* Unfortunately, the heap push/pop is required.... */
|
||||
goto do_lock;
|
||||
oldheap = clib_all_bihash_set_heap ();
|
||||
vec_add1 (clib_all_bihashes, (void *) h);
|
||||
clib_mem_set_heap (oldheap);
|
||||
}
|
||||
|
||||
do_lock:
|
||||
if (h->alloc_lock)
|
||||
clib_mem_free ((void *) h->alloc_lock);
|
||||
|
||||
/*
|
||||
* Set up the lock now, so we can use it to make the first add
|
||||
@ -88,9 +94,23 @@ void BV (clib_bihash_init)
|
||||
CLIB_CACHE_LINE_BYTES);
|
||||
h->alloc_lock[0] = 0;
|
||||
|
||||
#if BIHASH_INSTANTIATE_IMMEDIATELY
|
||||
if (a->instantiate_immediately)
|
||||
BV (clib_bihash_instantiate) (h);
|
||||
#endif
|
||||
}
|
||||
|
||||
void BV (clib_bihash_init)
|
||||
(BVT (clib_bihash) * h, char *name, u32 nbuckets, uword memory_size)
|
||||
{
|
||||
BVT (clib_bihash_init2_args) _a, *a = &_a;
|
||||
|
||||
memset (a, 0, sizeof (*a));
|
||||
|
||||
a->h = h;
|
||||
a->name = name;
|
||||
a->nbuckets = nbuckets;
|
||||
a->memory_size = memory_size;
|
||||
|
||||
BV (clib_bihash_init2) (a);
|
||||
}
|
||||
|
||||
#if BIHASH_32_64_SVM
|
||||
|
@ -159,6 +159,17 @@ BVS (clib_bihash)
|
||||
|
||||
} BVT (clib_bihash);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
BVT (clib_bihash) * h;
|
||||
char *name;
|
||||
u32 nbuckets;
|
||||
uword memory_size;
|
||||
format_function_t *fmt_fn;
|
||||
u8 instantiate_immediately;
|
||||
u8 dont_add_to_all_bihash_list;
|
||||
} BVT (clib_bihash_init2_args);
|
||||
|
||||
extern void **clib_all_bihashes;
|
||||
|
||||
#if BIHASH_32_64_SVM
|
||||
@ -291,6 +302,8 @@ static inline uword BV (clib_bihash_get_offset) (BVT (clib_bihash) * h,
|
||||
void BV (clib_bihash_init)
|
||||
(BVT (clib_bihash) * h, char *name, u32 nbuckets, uword memory_size);
|
||||
|
||||
void BV (clib_bihash_init2) (BVT (clib_bihash_init2_args) * a);
|
||||
|
||||
#if BIHASH_32_64_SVM
|
||||
void BV (clib_bihash_master_init_svm)
|
||||
(BVT (clib_bihash) * h, char *name, u32 nbuckets, u64 memory_size);
|
||||
|
Reference in New Issue
Block a user