The enic_clsf_init() function is called once per enic instance, but it used a static name to create the hash table. Consequently when using more than one enic instance, there was a name collision which caused errors:
EAL: memzone_reserve_aligned_thread_unsafe(): memzone<RG_HT_enicpmd_clsf_hash> already exists RING: Cannot reserve memory HASH: memory allocation failed PMD: rte_enic_pmd: Init of hash table for clsf failed. Flow director feature will not work This patch changes the name to be unique per enic instance. Fixes: fefed3d1e62c ("enic: new driver") Signed-off-by: Nelson Escobar <neescoba at cisco.com> Reviewed-by: John Daley <johndale at cisco.com> --- v2: - use snprintf instead of sprintf drivers/net/enic/enic_clsf.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/net/enic/enic_clsf.c b/drivers/net/enic/enic_clsf.c index edb56e1..2050818 100644 --- a/drivers/net/enic/enic_clsf.c +++ b/drivers/net/enic/enic_clsf.c @@ -239,15 +239,16 @@ void enic_clsf_destroy(struct enic *enic) int enic_clsf_init(struct enic *enic) { + char clsf_name[RTE_HASH_NAMESIZE]; struct rte_hash_parameters hash_params = { - .name = "enicpmd_clsf_hash", + .name = clsf_name, .entries = ENICPMD_CLSF_HASH_ENTRIES, .key_len = sizeof(struct rte_eth_fdir_filter), .hash_func = DEFAULT_HASH_FUNC, .hash_func_init_val = 0, .socket_id = SOCKET_ID_ANY, }; - + snprintf(clsf_name, RTE_HASH_NAMESIZE, "enic_clsf_%s", enic->bdf_name); enic->fdir.hash = rte_hash_create(&hash_params); memset(&enic->fdir.stats, 0, sizeof(enic->fdir.stats)); enic->fdir.stats.free = ENICPMD_FDIR_MAX; -- 2.7.0