hash: enable GFNI Toeplitz hash implementation
This patch enables new GFNI Toeplitz hash in predictable RSS library. Signed-off-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com> Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
This commit is contained in:
parent
31d7c06947
commit
d27e2b7e9c
@ -87,6 +87,8 @@ struct rte_thash_ctx {
|
||||
uint32_t reta_sz_log; /** < size of the RSS ReTa in bits */
|
||||
uint32_t subtuples_nb; /** < number of subtuples */
|
||||
uint32_t flags;
|
||||
uint64_t *matrices;
|
||||
/**< matrices used with rte_thash_gfni implementation */
|
||||
uint8_t hash_key[0];
|
||||
};
|
||||
|
||||
@ -267,12 +269,28 @@ rte_thash_init_ctx(const char *name, uint32_t key_len, uint32_t reta_sz,
|
||||
ctx->hash_key[i] = rte_rand();
|
||||
}
|
||||
|
||||
if (rte_thash_gfni_supported()) {
|
||||
ctx->matrices = rte_zmalloc(NULL, key_len * sizeof(uint64_t),
|
||||
RTE_CACHE_LINE_SIZE);
|
||||
if (ctx->matrices == NULL) {
|
||||
RTE_LOG(ERR, HASH, "Cannot allocate matrices\n");
|
||||
rte_errno = ENOMEM;
|
||||
goto free_ctx;
|
||||
}
|
||||
|
||||
rte_thash_complete_matrix(ctx->matrices, ctx->hash_key,
|
||||
key_len);
|
||||
}
|
||||
|
||||
te->data = (void *)ctx;
|
||||
TAILQ_INSERT_TAIL(thash_list, te, next);
|
||||
|
||||
rte_mcfg_tailq_write_unlock();
|
||||
|
||||
return ctx;
|
||||
|
||||
free_ctx:
|
||||
rte_free(ctx);
|
||||
free_te:
|
||||
rte_free(te);
|
||||
exit:
|
||||
@ -386,6 +404,10 @@ generate_subkey(struct rte_thash_ctx *ctx, struct thash_lfsr *lfsr,
|
||||
set_bit(ctx->hash_key, get_rev_bit_lfsr(lfsr), i);
|
||||
}
|
||||
|
||||
if (ctx->matrices != NULL)
|
||||
rte_thash_complete_matrix(ctx->matrices, ctx->hash_key,
|
||||
ctx->key_len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -642,6 +664,12 @@ rte_thash_get_key(struct rte_thash_ctx *ctx)
|
||||
return ctx->hash_key;
|
||||
}
|
||||
|
||||
const uint64_t *
|
||||
rte_thash_get_gfni_matrices(struct rte_thash_ctx *ctx)
|
||||
{
|
||||
return ctx->matrices;
|
||||
}
|
||||
|
||||
static inline uint8_t
|
||||
read_unaligned_byte(uint8_t *ptr, unsigned int len, unsigned int offset)
|
||||
{
|
||||
@ -753,11 +781,17 @@ rte_thash_adjust_tuple(struct rte_thash_ctx *ctx,
|
||||
attempts = RTE_MIN(attempts, 1U << (h->tuple_len - ctx->reta_sz_log));
|
||||
|
||||
for (i = 0; i < attempts; i++) {
|
||||
for (j = 0; j < (tuple_len / 4); j++)
|
||||
tmp_tuple[j] =
|
||||
rte_be_to_cpu_32(*(uint32_t *)&tuple[j * 4]);
|
||||
if (ctx->matrices != NULL)
|
||||
hash = rte_thash_gfni(ctx->matrices, tuple, tuple_len);
|
||||
else {
|
||||
for (j = 0; j < (tuple_len / 4); j++)
|
||||
tmp_tuple[j] =
|
||||
rte_be_to_cpu_32(
|
||||
*(uint32_t *)&tuple[j * 4]);
|
||||
|
||||
hash = rte_softrss(tmp_tuple, tuple_len / 4, hash_key);
|
||||
}
|
||||
|
||||
hash = rte_softrss(tmp_tuple, tuple_len / 4, hash_key);
|
||||
adj_bits = rte_thash_get_complement(h, hash, desired_value);
|
||||
|
||||
/*
|
||||
|
@ -418,6 +418,25 @@ __rte_experimental
|
||||
const uint8_t *
|
||||
rte_thash_get_key(struct rte_thash_ctx *ctx);
|
||||
|
||||
/**
|
||||
* Get a pointer to the toeplitz hash matrices contained in the context.
|
||||
* These matrices could be used with fast toeplitz hash implementation if
|
||||
* CPU supports GFNI.
|
||||
* Matrices changes after each addition of a helper.
|
||||
*
|
||||
* @warning
|
||||
* @b EXPERIMENTAL: this API may change without prior notice.
|
||||
*
|
||||
* @param ctx
|
||||
* Thash context
|
||||
* @return
|
||||
* A pointer to the toeplitz hash key matrices on success
|
||||
* NULL if GFNI is not supported.
|
||||
*/
|
||||
__rte_experimental
|
||||
const uint64_t *
|
||||
rte_thash_get_gfni_matrices(struct rte_thash_ctx *ctx);
|
||||
|
||||
/**
|
||||
* Function prototype for the rte_thash_adjust_tuple
|
||||
* to check if adjusted tuple could be used.
|
||||
|
@ -49,5 +49,6 @@ EXPERIMENTAL {
|
||||
|
||||
# added in 21.11
|
||||
rte_thash_complete_matrix;
|
||||
rte_thash_get_gfni_matrices;
|
||||
rte_thash_gfni_supported;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user