X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=lib%2Flibrte_hash%2Frte_fbk_hash.c;h=576e8e66624ca6aae9c4815bb584542cfbfb96c6;hb=refs%2Fheads%2Fmempool_20200116b;hp=4aff40e6779d22d7845b8fd98a76a3ce830c5346;hpb=134975073af3a1b208e51e1fc588c53324ae2065;p=dpdk.git diff --git a/lib/librte_hash/rte_fbk_hash.c b/lib/librte_hash/rte_fbk_hash.c index 4aff40e677..576e8e6662 100644 --- a/lib/librte_hash/rte_fbk_hash.c +++ b/lib/librte_hash/rte_fbk_hash.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "rte_fbk_hash.h" @@ -50,13 +51,13 @@ rte_fbk_hash_find_existing(const char *name) fbk_hash_list = RTE_TAILQ_CAST(rte_fbk_hash_tailq.head, rte_fbk_hash_list); - rte_rwlock_read_lock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_read_lock(); TAILQ_FOREACH(te, fbk_hash_list, next) { h = (struct rte_fbk_hash_table *) te->data; if (strncmp(name, h->name, RTE_FBK_HASH_NAMESIZE) == 0) break; } - rte_rwlock_read_unlock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_read_unlock(); if (te == NULL) { rte_errno = ENOENT; return NULL; @@ -84,6 +85,7 @@ rte_fbk_hash_create(const struct rte_fbk_hash_params *params) sizeof(*ht) + (sizeof(ht->t[0]) * params->entries); uint32_t i; struct rte_fbk_hash_list *fbk_hash_list; + rte_fbk_hash_fn default_hash_func = (rte_fbk_hash_fn)rte_jhash_1word; fbk_hash_list = RTE_TAILQ_CAST(rte_fbk_hash_tailq.head, rte_fbk_hash_list); @@ -102,7 +104,7 @@ rte_fbk_hash_create(const struct rte_fbk_hash_params *params) snprintf(hash_name, sizeof(hash_name), "FBK_%s", params->name); - rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_write_lock(); /* guarantee there's no existing */ TAILQ_FOREACH(te, fbk_hash_list, next) { @@ -131,8 +133,16 @@ rte_fbk_hash_create(const struct rte_fbk_hash_params *params) goto exit; } + /* Default hash function */ +#if defined(RTE_ARCH_X86) + default_hash_func = (rte_fbk_hash_fn)rte_hash_crc_4byte; +#elif defined(RTE_ARCH_ARM64) + if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_CRC32)) + default_hash_func = (rte_fbk_hash_fn)rte_hash_crc_4byte; +#endif + /* Set up hash table context. */ - snprintf(ht->name, sizeof(ht->name), "%s", params->name); + strlcpy(ht->name, params->name, sizeof(ht->name)); ht->entries = params->entries; ht->entries_per_bucket = params->entries_per_bucket; ht->used_entries = 0; @@ -147,7 +157,7 @@ rte_fbk_hash_create(const struct rte_fbk_hash_params *params) ht->init_val = params->init_val; } else { - ht->hash_func = RTE_FBK_HASH_FUNC_DEFAULT; + ht->hash_func = default_hash_func; ht->init_val = RTE_FBK_HASH_INIT_VAL_DEFAULT; } @@ -156,7 +166,7 @@ rte_fbk_hash_create(const struct rte_fbk_hash_params *params) TAILQ_INSERT_TAIL(fbk_hash_list, te, next); exit: - rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_write_unlock(); return ht; } @@ -179,7 +189,7 @@ rte_fbk_hash_free(struct rte_fbk_hash_table *ht) fbk_hash_list = RTE_TAILQ_CAST(rte_fbk_hash_tailq.head, rte_fbk_hash_list); - rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_write_lock(); /* find out tailq entry */ TAILQ_FOREACH(te, fbk_hash_list, next) { @@ -188,13 +198,13 @@ rte_fbk_hash_free(struct rte_fbk_hash_table *ht) } if (te == NULL) { - rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_write_unlock(); return; } TAILQ_REMOVE(fbk_hash_list, te, next); - rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK); + rte_mcfg_tailq_write_unlock(); rte_free(ht); rte_free(te);