distributor: skip building if power library not found
[dpdk.git] / lib / librte_efd / rte_efd.c
index e15ff04..14e493b 100644 (file)
@@ -9,6 +9,7 @@
 #include <stdarg.h>
 #include <sys/queue.h>
 
+#include <rte_string_fns.h>
 #include <rte_log.h>
 #include <rte_eal_memconfig.h>
 #include <rte_errno.h>
@@ -558,7 +559,7 @@ rte_efd_create(const char *name, uint32_t max_num_rules, uint32_t key_len,
        }
 
        /* Create a new EFD table management structure */
-       table = (struct rte_efd_table *) rte_zmalloc_socket(NULL,
+       table = rte_zmalloc_socket(NULL,
                        sizeof(struct rte_efd_table),
                        RTE_CACHE_LINE_SIZE,
                        offline_cpu_socket);
@@ -580,7 +581,7 @@ rte_efd_create(const char *name, uint32_t max_num_rules, uint32_t key_len,
        table->key_len = key_len;
 
        /* key_array */
-       key_array = (uint8_t *) rte_zmalloc_socket(NULL,
+       key_array = rte_zmalloc_socket(NULL,
                        table->max_num_rules * table->key_len,
                        RTE_CACHE_LINE_SIZE,
                        offline_cpu_socket);
@@ -591,7 +592,7 @@ rte_efd_create(const char *name, uint32_t max_num_rules, uint32_t key_len,
                goto error_unlock_exit;
        }
        table->keys = key_array;
-       snprintf(table->name, sizeof(table->name), "%s", name);
+       strlcpy(table->name, name, sizeof(table->name));
 
        RTE_LOG(DEBUG, EFD, "Creating an EFD table with %u chunks,"
                        " which potentially supports %u entries\n",
@@ -616,7 +617,7 @@ rte_efd_create(const char *name, uint32_t max_num_rules, uint32_t key_len,
                         * as a continuous block
                         */
                        table->chunks[socket_id] =
-                               (struct efd_online_chunk *) rte_zmalloc_socket(
+                               rte_zmalloc_socket(
                                NULL,
                                online_table_size,
                                RTE_CACHE_LINE_SIZE,
@@ -666,7 +667,7 @@ rte_efd_create(const char *name, uint32_t max_num_rules, uint32_t key_len,
         */
        offline_table_size = num_chunks * sizeof(struct efd_offline_chunk_rules);
        table->offline_chunks =
-                       (struct efd_offline_chunk_rules *) rte_zmalloc_socket(NULL,
+                       rte_zmalloc_socket(NULL,
                        offline_table_size,
                        RTE_CACHE_LINE_SIZE,
                        offline_cpu_socket);
@@ -692,7 +693,8 @@ rte_efd_create(const char *name, uint32_t max_num_rules, uint32_t key_len,
                        offline_cpu_socket, 0);
        if (r == NULL) {
                RTE_LOG(ERR, EFD, "memory allocation failed\n");
-               goto error_unlock_exit;
+               rte_efd_free(table);
+               return NULL;
        }
 
        /* Populate free slots ring. Entry zero is reserved for key misses. */
@@ -739,6 +741,8 @@ void
 rte_efd_free(struct rte_efd_table *table)
 {
        uint8_t socket_id;
+       struct rte_efd_list *efd_list;
+       struct rte_tailq_entry *te, *temp;
 
        if (table == NULL)
                return;
@@ -746,6 +750,18 @@ rte_efd_free(struct rte_efd_table *table)
        for (socket_id = 0; socket_id < RTE_MAX_NUMA_NODES; socket_id++)
                rte_free(table->chunks[socket_id]);
 
+       efd_list = RTE_TAILQ_CAST(rte_efd_tailq.head, rte_efd_list);
+       rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK);
+
+       TAILQ_FOREACH_SAFE(te, efd_list, next, temp) {
+               if (te->data == (void *) table) {
+                       TAILQ_REMOVE(efd_list, te, next);
+                       rte_free(te);
+                       break;
+               }
+       }
+
+       rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK);
        rte_ring_free(table->free_slots);
        rte_free(table->offline_chunks);
        rte_free(table->keys);