All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
To: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>,
	dev@dpdk.org, john.mcnamara@intel.com
Cc: ruifeng.wang@arm.com, juraj.linkes@pantheon.tech,
	david.marchand@redhat.com, nd@arm.com, stable@dpdk.org,
	"\"'Lukasz Wojciechowski'\"," <l.wojciechow@partner.samsung.com>
Subject: Re: [dpdk-dev] [PATCH 1/2] test/rcu: fix array subscript is above array bounds
Date: Tue, 20 Oct 2020 02:06:59 +0200	[thread overview]
Message-ID: <791ffc96-8d87-5783-c596-92e21cdda913@partner.samsung.com> (raw)
In-Reply-To: <20201016060349.19940-1-honnappa.nagarahalli@arm.com>

Hi Honnappa,

I verified building and testing and all the warnings/errors disappear 
for RTE_MAX_LCORE >= 2 and tests pass.

I wonder, if it is possible to set RTE_MAX_LCORE = 1 ?
In such case there are still few places with array bounds exceedings:
Compiling C object 'app/test/3062f5d@@dpdk-test@exe/test_rcu_qsbr.c.o'.
../app/test/test_rcu_qsbr.c: In function ‘test_rcu_qsbr_check_reader’:
../app/test/test_rcu_qsbr.c:319:24: warning: array subscript is above 
array bounds [-Warray-bounds]
         enabled_core_ids[i]);
         ~~~~~~~~~~~~~~~~^~~
../app/test/test_rcu_qsbr.c: In function ‘test_rcu_qsbr_main’:
../app/test/test_rcu_qsbr.c:946:2: warning: array subscript is above 
array bounds [-Warray-bounds]
   rte_rcu_qsbr_init(t[1], RTE_MAX_LCORE);
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../app/test/test_rcu_qsbr.c:954:3: warning: array subscript is above 
array bounds [-Warray-bounds]
    rte_rcu_qsbr_thread_register(t[1], enabled_core_ids[i]);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../app/test/test_rcu_qsbr.c:957:2: warning: array subscript is above 
array bounds [-Warray-bounds]
   rte_rcu_qsbr_dump(stdout, t[1]);
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../app/test/test_rcu_qsbr.c:486:53: warning: array subscript is above 
array bounds [-Warray-bounds]
   rte_rcu_qsbr_thread_register(t[0], enabled_core_ids[1]);
                                      ~~~~~~~~~~~~~~~~^~~
...and few more in other files.


Best regards

Lukasz

W dniu 16.10.2020 o 08:03, Honnappa Nagarahalli pisze:
> When RTE_MAX_LCORE value is small, following compiler errors
> are observed.
>
> ../app/test/test_rcu_qsbr.c:296:54: error: iteration 2 invokes
> undefined behavior [-Werror=aggressive-loop-optimizations]
>
> ../app/test/test_rcu_qsbr.c:315:55: error: array subscript is above
> array bounds [-Werror=array-bounds]
>
> Fixes: b87089b0bb19 ("test/rcu: add API and functional tests")
> Cc: stable@dpdk.org
>
> Signed-off-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
> Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
> ---
>   app/test/test_rcu_qsbr.c | 56 +++++++++++++++++++++++-----------------
>   1 file changed, 33 insertions(+), 23 deletions(-)
>
> diff --git a/app/test/test_rcu_qsbr.c b/app/test/test_rcu_qsbr.c
> index 0a9e5ecd1..848a68092 100644
> --- a/app/test/test_rcu_qsbr.c
> +++ b/app/test/test_rcu_qsbr.c
> @@ -286,13 +286,13 @@ static int
>   test_rcu_qsbr_start(void)
>   {
>   	uint64_t token;
> -	int i;
> +	unsigned int i;
>   
>   	printf("\nTest rte_rcu_qsbr_start()\n");
>   
>   	rte_rcu_qsbr_init(t[0], RTE_MAX_LCORE);
>   
> -	for (i = 0; i < 3; i++)
> +	for (i = 0; i < num_cores; i++)
>   		rte_rcu_qsbr_thread_register(t[0], enabled_core_ids[i]);
>   
>   	token = rte_rcu_qsbr_start(t[0]);
> @@ -306,14 +306,18 @@ test_rcu_qsbr_check_reader(void *arg)
>   {
>   	struct rte_rcu_qsbr *temp;
>   	uint8_t read_type = (uint8_t)((uintptr_t)arg);
> +	unsigned int i;
>   
>   	temp = t[read_type];
>   
>   	/* Update quiescent state counter */
> -	rte_rcu_qsbr_quiescent(temp, enabled_core_ids[0]);
> -	rte_rcu_qsbr_quiescent(temp, enabled_core_ids[1]);
> -	rte_rcu_qsbr_thread_unregister(temp, enabled_core_ids[2]);
> -	rte_rcu_qsbr_quiescent(temp, enabled_core_ids[3]);
> +	for (i = 0; i < num_cores; i++) {
> +		if (i % 2 == 0)
> +			rte_rcu_qsbr_quiescent(temp, enabled_core_ids[i]);
> +		else
> +			rte_rcu_qsbr_thread_unregister(temp,
> +							enabled_core_ids[i]);
> +	}
>   	return 0;
>   }
>   
> @@ -324,7 +328,8 @@ test_rcu_qsbr_check_reader(void *arg)
>   static int
>   test_rcu_qsbr_check(void)
>   {
> -	int i, ret;
> +	int ret;
> +	unsigned int i;
>   	uint64_t token;
>   
>   	printf("\nTest rte_rcu_qsbr_check()\n");
> @@ -342,7 +347,7 @@ test_rcu_qsbr_check(void)
>   	ret = rte_rcu_qsbr_check(t[0], token, true);
>   	TEST_RCU_QSBR_RETURN_IF_ERROR((ret == 0), "Blocking QSBR check");
>   
> -	for (i = 0; i < 3; i++)
> +	for (i = 0; i < num_cores; i++)
>   		rte_rcu_qsbr_thread_register(t[0], enabled_core_ids[i]);
>   
>   	ret = rte_rcu_qsbr_check(t[0], token, false);
> @@ -357,7 +362,7 @@ test_rcu_qsbr_check(void)
>   	/* Threads are offline, hence this should pass */
>   	TEST_RCU_QSBR_RETURN_IF_ERROR((ret == 0), "Non-blocking QSBR check");
>   
> -	for (i = 0; i < 3; i++)
> +	for (i = 0; i < num_cores; i++)
>   		rte_rcu_qsbr_thread_unregister(t[0], enabled_core_ids[i]);
>   
>   	ret = rte_rcu_qsbr_check(t[0], token, true);
> @@ -365,7 +370,7 @@ test_rcu_qsbr_check(void)
>   
>   	rte_rcu_qsbr_init(t[0], RTE_MAX_LCORE);
>   
> -	for (i = 0; i < 4; i++)
> +	for (i = 0; i < num_cores; i++)
>   		rte_rcu_qsbr_thread_register(t[0], enabled_core_ids[i]);
>   
>   	token = rte_rcu_qsbr_start(t[0]);
> @@ -928,7 +933,7 @@ test_rcu_qsbr_dq_functional(int32_t size, int32_t esize, uint32_t flags)
>   static int
>   test_rcu_qsbr_dump(void)
>   {
> -	int i;
> +	unsigned int i;
>   
>   	printf("\nTest rte_rcu_qsbr_dump()\n");
>   
> @@ -945,7 +950,7 @@ test_rcu_qsbr_dump(void)
>   
>   	rte_rcu_qsbr_thread_register(t[0], enabled_core_ids[0]);
>   
> -	for (i = 1; i < 3; i++)
> +	for (i = 1; i < num_cores; i++)
>   		rte_rcu_qsbr_thread_register(t[1], enabled_core_ids[i]);
>   
>   	rte_rcu_qsbr_dump(stdout, t[0]);
> @@ -1095,7 +1100,7 @@ test_rcu_qsbr_sw_sv_3qs(void)
>   {
>   	uint64_t token[3];
>   	uint32_t c;
> -	int i;
> +	int i, num_readers;
>   	int32_t pos[3];
>   
>   	writer_done = 0;
> @@ -1118,7 +1123,11 @@ test_rcu_qsbr_sw_sv_3qs(void)
>   	thread_info[0].ih = 0;
>   
>   	/* Reader threads are launched */
> -	for (i = 0; i < 4; i++)
> +	/* Keep the number of reader threads low to reduce
> +	 * the execution time.
> +	 */
> +	num_readers = num_cores < 4 ? num_cores : 4;
> +	for (i = 0; i < num_readers; i++)
>   		rte_eal_remote_launch(test_rcu_qsbr_reader, &thread_info[0],
>   					enabled_core_ids[i]);
>   
> @@ -1151,7 +1160,7 @@ test_rcu_qsbr_sw_sv_3qs(void)
>   
>   	/* Check the quiescent state status */
>   	rte_rcu_qsbr_check(t[0], token[0], true);
> -	for (i = 0; i < 4; i++) {
> +	for (i = 0; i < num_readers; i++) {
>   		c = hash_data[0][0][enabled_core_ids[i]];
>   		if (c != COUNTER_VALUE && c != 0) {
>   			printf("Reader lcore %d did not complete #0 = %d\n",
> @@ -1169,7 +1178,7 @@ test_rcu_qsbr_sw_sv_3qs(void)
>   
>   	/* Check the quiescent state status */
>   	rte_rcu_qsbr_check(t[0], token[1], true);
> -	for (i = 0; i < 4; i++) {
> +	for (i = 0; i < num_readers; i++) {
>   		c = hash_data[0][3][enabled_core_ids[i]];
>   		if (c != COUNTER_VALUE && c != 0) {
>   			printf("Reader lcore %d did not complete #3 = %d\n",
> @@ -1187,7 +1196,7 @@ test_rcu_qsbr_sw_sv_3qs(void)
>   
>   	/* Check the quiescent state status */
>   	rte_rcu_qsbr_check(t[0], token[2], true);
> -	for (i = 0; i < 4; i++) {
> +	for (i = 0; i < num_readers; i++) {
>   		c = hash_data[0][6][enabled_core_ids[i]];
>   		if (c != COUNTER_VALUE && c != 0) {
>   			printf("Reader lcore %d did not complete #6 = %d\n",
> @@ -1206,7 +1215,7 @@ test_rcu_qsbr_sw_sv_3qs(void)
>   	writer_done = 1;
>   
>   	/* Wait and check return value from reader threads */
> -	for (i = 0; i < 4; i++)
> +	for (i = 0; i < num_readers; i++)
>   		if (rte_eal_wait_lcore(enabled_core_ids[i]) < 0)
>   			goto error;
>   	rte_hash_free(h[0]);
> @@ -1236,6 +1245,12 @@ test_rcu_qsbr_mw_mv_mqs(void)
>   	unsigned int i, j;
>   	unsigned int test_cores;
>   
> +	if (RTE_MAX_LCORE < 5 || num_cores < 4) {
> +		printf("Not enough cores for %s, expecting at least 5\n",
> +			__func__);
> +		return TEST_SKIPPED;
> +	}
> +
>   	writer_done = 0;
>   	test_cores = num_cores / 4;
>   	test_cores = test_cores * 4;
> @@ -1321,11 +1336,6 @@ test_rcu_qsbr_main(void)
>   {
>   	uint16_t core_id;
>   
> -	if (rte_lcore_count() < 5) {
> -		printf("Not enough cores for rcu_qsbr_autotest, expecting at least 5\n");
> -		return TEST_SKIPPED;
> -	}
> -
>   	num_cores = 0;
>   	RTE_LCORE_FOREACH_SLAVE(core_id) {
>   		enabled_core_ids[num_cores] = core_id;

-- 
Lukasz Wojciechowski
Principal Software Engineer

Samsung R&D Institute Poland
Samsung Electronics
Office +48 22 377 88 25
l.wojciechow@partner.samsung.com


  parent reply	other threads:[~2020-10-20  0:07 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20201016060420eucas1p12f301a94eb4b4d19a9ced5c5cbd59c77@eucas1p1.samsung.com>
2020-10-16  6:03 ` [dpdk-dev] [PATCH 1/2] test/rcu: fix array subscript is above array bounds Honnappa Nagarahalli
2020-10-16  6:03   ` [dpdk-dev] [PATCH 2/2] examples/performance-thread: fix undef behavior Honnappa Nagarahalli
2020-10-20 22:46     ` Lukasz Wojciechowski
2020-10-30 14:26     ` David Marchand
2020-10-20  0:06   ` Lukasz Wojciechowski [this message]
2020-10-20 16:26     ` [dpdk-dev] [PATCH 1/2] test/rcu: fix array subscript is above array bounds Honnappa Nagarahalli
2020-10-20 20:59       ` Lukasz Wojciechowski
2020-10-30 14:44   ` David Marchand

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=791ffc96-8d87-5783-c596-92e21cdda913@partner.samsung.com \
    --to=l.wojciechow@partner.samsung.com \
    --cc=david.marchand@redhat.com \
    --cc=dev@dpdk.org \
    --cc=honnappa.nagarahalli@arm.com \
    --cc=john.mcnamara@intel.com \
    --cc=juraj.linkes@pantheon.tech \
    --cc=nd@arm.com \
    --cc=ruifeng.wang@arm.com \
    --cc=stable@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.