mempool: fix slow allocation of large mempools
[dpdk.git] / lib / librte_hash / rte_fbk_hash.c
index 4aff40e..576e8e6 100644 (file)
@@ -20,6 +20,7 @@
 #include <rte_cpuflags.h>
 #include <rte_log.h>
 #include <rte_spinlock.h>
+#include <rte_tailq.h>
 
 #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);