X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_table%2Frte_table_array.c;h=cf7be88ae5a61623c04a02983e2e4d0040cacccd;hb=917f49cfd0d1fc6c1ae890528835ece018741baa;hp=4d3c05eecaadc9cc94d66dda1de0b35c542cfec6;hpb=58507670cf1a4832eba725eba872d57b81d85491;p=dpdk.git diff --git a/lib/librte_table/rte_table_array.c b/lib/librte_table/rte_table_array.c index 4d3c05eeca..cf7be88ae5 100644 --- a/lib/librte_table/rte_table_array.c +++ b/lib/librte_table/rte_table_array.c @@ -36,12 +36,29 @@ #include #include +#include #include #include #include "rte_table_array.h" +#ifdef RTE_TABLE_STATS_COLLECT + +#define RTE_TABLE_ARRAY_STATS_PKTS_IN_ADD(table, val) \ + table->stats.n_pkts_in += val +#define RTE_TABLE_ARRAY_STATS_PKTS_LOOKUP_MISS(table, val) \ + table->stats.n_pkts_lookup_miss += val + +#else + +#define RTE_TABLE_ARRAY_STATS_PKTS_IN_ADD(table, val) +#define RTE_TABLE_ARRAY_STATS_PKTS_LOOKUP_MISS(table, val) + +#endif + struct rte_table_array { + struct rte_table_stats stats; + /* Input parameters */ uint32_t entry_size; uint32_t n_entries; @@ -57,18 +74,15 @@ struct rte_table_array { static void * rte_table_array_create(void *params, int socket_id, uint32_t entry_size) { - struct rte_table_array_params *p = - (struct rte_table_array_params *) params; + struct rte_table_array_params *p = params; struct rte_table_array *t; uint32_t total_cl_size, total_size; /* Check input parameters */ if ((p == NULL) || (p->n_entries == 0) || - (!rte_is_power_of_2(p->n_entries)) || - ((p->offset & 0x3) != 0)) { + (!rte_is_power_of_2(p->n_entries))) return NULL; - } /* Memory allocation */ total_cl_size = (sizeof(struct rte_table_array) + @@ -96,7 +110,7 @@ rte_table_array_create(void *params, int socket_id, uint32_t entry_size) static int rte_table_array_free(void *table) { - struct rte_table_array *t = (struct rte_table_array *) table; + struct rte_table_array *t = table; /* Check input parameters */ if (t == NULL) { @@ -118,8 +132,8 @@ rte_table_array_entry_add( int *key_found, void **entry_ptr) { - struct rte_table_array *t = (struct rte_table_array *) table; - struct rte_table_array_key *k = (struct rte_table_array_key *) key; + struct rte_table_array *t = table; + struct rte_table_array_key *k = key; uint8_t *table_entry; /* Check input parameters */ @@ -163,7 +177,8 @@ rte_table_array_lookup( void **entries) { struct rte_table_array *t = (struct rte_table_array *) table; - + __rte_unused uint32_t n_pkts_in = __builtin_popcountll(pkts_mask); + RTE_TABLE_ARRAY_STATS_PKTS_IN_ADD(t, n_pkts_in); *lookup_hit_mask = pkts_mask; if ((pkts_mask & (pkts_mask + 1)) == 0) { @@ -195,10 +210,27 @@ rte_table_array_lookup( return 0; } +static int +rte_table_array_stats_read(void *table, struct rte_table_stats *stats, int clear) +{ + struct rte_table_array *array = table; + + if (stats != NULL) + memcpy(stats, &array->stats, sizeof(array->stats)); + + if (clear) + memset(&array->stats, 0, sizeof(array->stats)); + + return 0; +} + struct rte_table_ops rte_table_array_ops = { .f_create = rte_table_array_create, .f_free = rte_table_array_free, .f_add = rte_table_array_entry_add, .f_delete = NULL, + .f_add_bulk = NULL, + .f_delete_bulk = NULL, .f_lookup = rte_table_array_lookup, + .f_stats = rte_table_array_stats_read, };