From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 5D88C45D48; Wed, 20 Nov 2024 01:26:34 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2BAB542E57; Wed, 20 Nov 2024 01:26:34 +0100 (CET) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mails.dpdk.org (Postfix) with ESMTP id 40F0240288 for ; Wed, 20 Nov 2024 01:26:32 +0100 (CET) Received: by linux.microsoft.com (Postfix, from userid 1213) id 5AE6123717FF; Tue, 19 Nov 2024 16:26:31 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 5AE6123717FF DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1732062391; bh=O8MMJ+4zAeJHxWiR9Iaf3huP8UozxXJHwSYNwp2oynU=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=pUZiiGlrrOGXYvFnS7oAT6H7ukwStIjuSZP3o4HEJHPLPAhCMXg1emi2vCbX7tM6b 6WA+s8phBUEvjFn/5hQuDENYJ7J1SjQGVuA/pzjea3jjBFtc+7Ov/dWVBKsNvc7Tzr XFGywJJmY294GEHfr3rOu6Sx72hrjfmPsOrGX5EU= Date: Tue, 19 Nov 2024 16:26:31 -0800 From: Andre Muezerie To: Mattias =?iso-8859-1?Q?R=F6nnblom?= Cc: dev@dpdk.org Subject: Re: [PATCH v7 19/21] test: remove use of VLAs for Windows built code in bitset tests Message-ID: <20241120002631.GA9917@linuxonhyperv3.guj3yctzbm1etfxqx2vob5hsef.xx.internal.cloudapp.net> References: <1713397319-26135-1-git-send-email-roretzla@linux.microsoft.com> <1731376933-19275-1-git-send-email-andremue@linux.microsoft.com> <1731376933-19275-20-git-send-email-andremue@linux.microsoft.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org On Tue, Nov 19, 2024 at 11:16:04AM +0100, Mattias Rönnblom wrote: > On 2024-11-12 03:02, Andre Muezerie wrote: > >1) MSVC does not support VLAs. Use standard fixed C arrays of > >maximum size required instead. > > > >2) ../usr/lib/gcc/x86_64-redhat-linux/13/include/emmintrin.h:742:8: > > error: array subscript 9 is outside array bounds of 'uint64_t[16]' > > {aka 'long unsigned int[16]'} [-Werror=array-bounds=] > > 3695 742 | *__P = __B; > > > >Compile with -Wno-array-bounds to avoid false positives when > >using gcc version 11 or newer (gcc compiler bug/limitation). > > > >Signed-off-by: Andre Muezerie > >--- > > app/test/meson.build | 5 +++ > > app/test/test_bitset.c | 55 +++++++++++++++++++-------------- > > app/test/test_lcore_var_perf.c | 2 +- > > app/test/test_reassembly_perf.c | 4 +-- > > 4 files changed, 39 insertions(+), 27 deletions(-) > > > >diff --git a/app/test/meson.build b/app/test/meson.build > >index 40f22a54d5..e7419a611b 100644 > >--- a/app/test/meson.build > >+++ b/app/test/meson.build > >@@ -249,6 +249,11 @@ foreach d:optional_deps > > endif > > endforeach > >+# Bugzilla ID: 678 > > Mention which bugzilla. I'll remove this bug ID and add an explanation instead. As suggested in other email, I'll also reduce the scope when disabling these errors. For reference, this issue we are facing is similar to the bug 678 mentioned: https://bugs.dpdk.org/show_bug.cgi?id=678 > > >+if (toolchain == 'gcc' and cc.version().version_compare('>=11.0.0')) > >+ cflags += '-Wno-array-bounds' > >+endif > >+ > > if cc.has_argument('-Wno-format-truncation') > > cflags += '-Wno-format-truncation' > > endif > >diff --git a/app/test/test_bitset.c b/app/test/test_bitset.c > >index 50b8bf0da4..f58c491d8f 100644 > >--- a/app/test/test_bitset.c > >+++ b/app/test/test_bitset.c > >@@ -99,11 +99,13 @@ typedef void clear_fun(uint64_t *bitset, size_t bit_num); > > typedef void assign_fun(uint64_t *bitset, size_t bit_num, bool value); > > typedef void flip_fun(uint64_t *bitset, size_t bit_num); > >+#define RAND_SET_MAX_SIZE (1000) > >+ > > Remove redundant parenthesis on all in #define in this file, please. > (A bad habit on mine.) > Sure, I'll update this in the new series. > > static int > > test_set_clear_size(test_fun test_fun, set_fun set_fun, clear_fun clear_fun, size_t size) > > { > > size_t i; > >- bool reference[size]; > >+ bool reference[RAND_SET_MAX_SIZE]; > > uint64_t *bitset; > > rand_bool_ary(reference, size); > >@@ -132,7 +134,6 @@ test_set_clear_size(test_fun test_fun, set_fun set_fun, clear_fun clear_fun, siz > > } > > #define RAND_ITERATIONS (10000) > >-#define RAND_SET_MAX_SIZE (1000) > > static int > > test_set_clear_fun(test_fun test_fun, set_fun set_fun, clear_fun clear_fun) > >@@ -168,7 +169,7 @@ test_flip_size(test_fun test_fun, assign_fun assign_fun, flip_fun flip_fun, size > > rand_bitset(bitset, size); > > for (i = 0; i < size; i++) { > >- RTE_BITSET_DECLARE(reference, size); > >+ RTE_BITSET_DECLARE(reference, RAND_SET_MAX_SIZE); > > rte_bitset_copy(reference, bitset, size); > >@@ -288,7 +289,7 @@ static int > > test_find_size(size_t size, bool set) > > { > > uint64_t *bitset; > >- bool reference[size]; > >+ bool reference[RAND_SET_MAX_SIZE]; > > size_t i; > > bitset = alloc_bitset(size); > >@@ -388,8 +389,8 @@ record_match(ssize_t match_idx, size_t size, int *calls) > > static int > > test_foreach_size(ssize_t size, bool may_wrap, bool set) > > { > >- bool reference[size]; > >- int calls[size]; > >+ bool reference[RAND_SET_MAX_SIZE]; > >+ int calls[RAND_SET_MAX_SIZE]; > > uint64_t *bitset; > > ssize_t i; > > ssize_t start_bit; > >@@ -633,17 +634,19 @@ test_define(void) > > typedef void bitset_op(uint64_t *dst, const uint64_t *a, const uint64_t *b, size_t bit_num); > > typedef bool bool_op(bool a, bool b); > >+#define LOGIC_MAX_SET_SIZE 200 > >+ > > static int > > test_logic_op(bitset_op bitset_op, bool_op bool_op) > > { > >- const size_t size = 1 + rte_rand_max(200); > >- RTE_BITSET_DECLARE(bitset_a, size); > >- RTE_BITSET_DECLARE(bitset_b, size); > >- RTE_BITSET_DECLARE(bitset_d, size); > >+ const size_t size = 1 + rte_rand_max(LOGIC_MAX_SET_SIZE); > >+ RTE_BITSET_DECLARE(bitset_a, LOGIC_MAX_SET_SIZE); > >+ RTE_BITSET_DECLARE(bitset_b, LOGIC_MAX_SET_SIZE); > >+ RTE_BITSET_DECLARE(bitset_d, LOGIC_MAX_SET_SIZE); > >- bool ary_a[size]; > >- bool ary_b[size]; > >- bool ary_d[size]; > >+ bool ary_a[LOGIC_MAX_SET_SIZE]; > >+ bool ary_b[LOGIC_MAX_SET_SIZE]; > >+ bool ary_d[LOGIC_MAX_SET_SIZE]; > > rand_bool_ary(ary_a, size); > > rand_bool_ary(ary_b, size); > >@@ -708,14 +711,14 @@ test_complement(void) > > for (i = 0; i < RAND_ITERATIONS; i++) { > > const size_t size = 1 + rte_rand_max(RAND_SET_MAX_SIZE - 1); > >- RTE_BITSET_DECLARE(src, size); > >+ RTE_BITSET_DECLARE(src, RAND_SET_MAX_SIZE); > > rand_bitset(src, size); > > bool bit_idx = rte_rand_max(size); > > bool bit_value = rte_bitset_test(src, bit_idx); > >- RTE_BITSET_DECLARE(dst, size); > >+ RTE_BITSET_DECLARE(dst, RAND_SET_MAX_SIZE); > > rte_bitset_complement(dst, src, size); > >@@ -726,6 +729,8 @@ test_complement(void) > > return TEST_SUCCESS; > > } > >+#define SHIFT_SET_MAX_SIZE 500 > >+ > > static int > > test_shift(bool right) > > { > >@@ -734,12 +739,12 @@ test_shift(bool right) > > const char *direction = right ? "right" : "left"; > > for (i = 0; i < 10000; i++) { > >- const int size = 1 + (int)rte_rand_max(500); > >+ const int size = 1 + (int)rte_rand_max(SHIFT_SET_MAX_SIZE); > > const int shift_count = (int)rte_rand_max(1.5 * size); > > int src_idx; > >- RTE_BITSET_DECLARE(src, size); > >- RTE_BITSET_DECLARE(reference, size); > >+ RTE_BITSET_DECLARE(src, SHIFT_SET_MAX_SIZE); > >+ RTE_BITSET_DECLARE(reference, SHIFT_SET_MAX_SIZE); > > rte_bitset_init(src, size); > > rte_bitset_init(reference, size); > >@@ -788,12 +793,14 @@ test_shift_left(void) > > return test_shift(false); > > } > >+#define EQUAL_SET_MAX_SIZE 100 > >+ > > static int > > test_equal(void) > > { > >- const size_t size = 100; > >- RTE_BITSET_DECLARE(bitset_a, size); > >- RTE_BITSET_DECLARE(bitset_b, size); > >+ const size_t size = EQUAL_SET_MAX_SIZE; > >+ RTE_BITSET_DECLARE(bitset_a, EQUAL_SET_MAX_SIZE); > >+ RTE_BITSET_DECLARE(bitset_b, EQUAL_SET_MAX_SIZE); > > rand_buf(bitset_a, RTE_BITSET_SIZE(size)); > > rand_buf(bitset_b, RTE_BITSET_SIZE(size)); > >@@ -821,9 +828,9 @@ test_equal(void) > > static int > > test_copy(void) > > { > >- const size_t size = 100; > >- RTE_BITSET_DECLARE(bitset_a, size); > >- RTE_BITSET_DECLARE(bitset_b, size); > >+ const size_t size = EQUAL_SET_MAX_SIZE; > >+ RTE_BITSET_DECLARE(bitset_a, EQUAL_SET_MAX_SIZE); > >+ RTE_BITSET_DECLARE(bitset_b, EQUAL_SET_MAX_SIZE); > > This is not still a VLA? > > If I recall correctly, in C, a const variable declared inside a > function is not considered a compile-time constant expression. In > C++ it is. > You're right about the const variable not being considered a compile-time expression. That's why we are still using the macro when calling RTE_BITSET_DECLARE. > > rand_buf(bitset_a, RTE_BITSET_SIZE(size)); > > rand_buf(bitset_b, RTE_BITSET_SIZE(size)); > >diff --git a/app/test/test_lcore_var_perf.c b/app/test/test_lcore_var_perf.c > >index 41e29bbd49..5a74ce4808 100644 > >--- a/app/test/test_lcore_var_perf.c > >+++ b/app/test/test_lcore_var_perf.c > >@@ -185,7 +185,7 @@ test_lcore_var_access_n(unsigned int num_mods) > > double tls_latency; > > double lazy_tls_latency; > > double lvar_latency; > >- unsigned int mods[num_mods]; > >+ unsigned int mods[MAX_MODS]; > > unsigned int i; > > for (i = 0; i < num_mods; i++) > >diff --git a/app/test/test_reassembly_perf.c b/app/test/test_reassembly_perf.c > >index 69cf029468..ac225e2b53 100644 > >--- a/app/test/test_reassembly_perf.c > >+++ b/app/test/test_reassembly_perf.c > >@@ -577,7 +577,7 @@ ipv4_reassembly_interleaved_flows_perf(uint8_t nb_frags) > > for (j = 0; j < 4; j++) > > nb_frags += frag_per_flow[i + j]; > >- struct rte_mbuf *buf_arr[nb_frags]; > >+ struct rte_mbuf *buf_arr[MAX_FRAGMENTS]; > > for (j = 0; j < 4; j++) { > > join_array(buf_arr, mbufs[i + j], prev, > > frag_per_flow[i + j]); > >@@ -788,7 +788,7 @@ ipv6_reassembly_interleaved_flows_perf(int8_t nb_frags) > > for (j = 0; j < 4; j++) > > nb_frags += frag_per_flow[i + j]; > >- struct rte_mbuf *buf_arr[nb_frags]; > >+ struct rte_mbuf *buf_arr[MAX_FRAGMENTS]; > > for (j = 0; j < 4; j++) { > > join_array(buf_arr, mbufs[i + j], prev, > > frag_per_flow[i + j]);