[v12,06/21] hash/thash: remove use of VLAs for Windows built

Message ID 1732225298-10322-7-git-send-email-andremue@linux.microsoft.com (mailing list archive)
State Superseded
Delegated to: David Marchand
Headers
Series remove use of VLAs for Windows |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Andre Muezerie Nov. 21, 2024, 9:41 p.m. UTC
From: Konstantin Ananyev <konstantin.ananyev@huawei.com>

1) ./lib/hash/rte_thash.c:774:9
    : warning: ISO C90 forbids variable length array ‘tmp_tuple’

The tuple can exceed sizeof(union rte_thash_tuple), for example if any
tunneling header is used in the RSS hash calculation.

The longest RSS hash key currently supported is 52 bytes. Technically, the
longest tuple with such a key should be (52 - sizeof(uint32_t)), so this
can be used as a size of the tmp_tuple array.

Signed-off-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
---
 lib/hash/rte_thash.c | 2 +-
 lib/hash/rte_thash.h | 7 +++++++
 2 files changed, 8 insertions(+), 1 deletion(-)
  

Comments

fengchengwen Nov. 22, 2024, 1:42 a.m. UTC | #1
On 2024/11/22 5:41, Andre Muezerie wrote:
> From: Konstantin Ananyev <konstantin.ananyev@huawei.com>
> 
> 1) ./lib/hash/rte_thash.c:774:9
>     : warning: ISO C90 forbids variable length array ‘tmp_tuple’
> 
> The tuple can exceed sizeof(union rte_thash_tuple), for example if any
> tunneling header is used in the RSS hash calculation.
> 
> The longest RSS hash key currently supported is 52 bytes. Technically, the
> longest tuple with such a key should be (52 - sizeof(uint32_t)), so this
> can be used as a size of the tmp_tuple array.
> 
> Signed-off-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
> ---
>  lib/hash/rte_thash.c | 2 +-
>  lib/hash/rte_thash.h | 7 +++++++
>  2 files changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/lib/hash/rte_thash.c b/lib/hash/rte_thash.c
> index 336c228e64..fa78787143 100644
> --- a/lib/hash/rte_thash.c
> +++ b/lib/hash/rte_thash.c
> @@ -761,7 +761,7 @@ rte_thash_adjust_tuple(struct rte_thash_ctx *ctx,
>  	uint32_t desired_value,	unsigned int attempts,
>  	rte_thash_check_tuple_t fn, void *userdata)
>  {

This API support parameter check, how about add tuple_len > RTE_THASH_TUPLE_LEN_MAX ?

> -	uint32_t tmp_tuple[tuple_len / sizeof(uint32_t)];
> +	uint32_t tmp_tuple[RTE_THASH_TUPLE_LEN_MAX];
>  	unsigned int i, j, ret = 0;
>  	uint32_t hash, adj_bits;
>  	const uint8_t *hash_key;
> diff --git a/lib/hash/rte_thash.h b/lib/hash/rte_thash.h
> index c0af5968df..04f9f1875c 100644
> --- a/lib/hash/rte_thash.h
> +++ b/lib/hash/rte_thash.h
> @@ -121,6 +121,13 @@ __rte_internal
>  uint32_t
>  thash_get_rand_poly(uint32_t poly_degree);
>  
> +/**
> + * Longest RSS hash key currently supported
> + */
> +#define RTE_THASH_KEY_LEN_MAX	52
> +
> +#define RTE_THASH_TUPLE_LEN_MAX (RTE_THASH_KEY_LEN_MAX - sizeof(uint32_t))
> +
>  /**
>   * Prepare special converted key to use with rte_softrss_be()
>   * @param orig
  

Patch

diff --git a/lib/hash/rte_thash.c b/lib/hash/rte_thash.c
index 336c228e64..fa78787143 100644
--- a/lib/hash/rte_thash.c
+++ b/lib/hash/rte_thash.c
@@ -761,7 +761,7 @@  rte_thash_adjust_tuple(struct rte_thash_ctx *ctx,
 	uint32_t desired_value,	unsigned int attempts,
 	rte_thash_check_tuple_t fn, void *userdata)
 {
-	uint32_t tmp_tuple[tuple_len / sizeof(uint32_t)];
+	uint32_t tmp_tuple[RTE_THASH_TUPLE_LEN_MAX];
 	unsigned int i, j, ret = 0;
 	uint32_t hash, adj_bits;
 	const uint8_t *hash_key;
diff --git a/lib/hash/rte_thash.h b/lib/hash/rte_thash.h
index c0af5968df..04f9f1875c 100644
--- a/lib/hash/rte_thash.h
+++ b/lib/hash/rte_thash.h
@@ -121,6 +121,13 @@  __rte_internal
 uint32_t
 thash_get_rand_poly(uint32_t poly_degree);
 
+/**
+ * Longest RSS hash key currently supported
+ */
+#define RTE_THASH_KEY_LEN_MAX	52
+
+#define RTE_THASH_TUPLE_LEN_MAX (RTE_THASH_KEY_LEN_MAX - sizeof(uint32_t))
+
 /**
  * Prepare special converted key to use with rte_softrss_be()
  * @param orig