[dpdk-stable] [PATCH v5 11/15] test/distributor: replace delays with spin locks
David Hunt
david.hunt at intel.com
Fri Oct 9 14:23:30 CEST 2020
On 8/10/2020 6:23 AM, Lukasz Wojciechowski wrote:
> Instead of making delays in test code and waiting
> for worker hopefully to reach proper states,
> synchronize worker shutdown test cases with spin lock
> on atomic variable.
>
> Fixes: c0de0eb82e40 ("distributor: switch over to new API")
> Cc: david.hunt at intel.com
> Cc: stable at dpdk.org
>
> Signed-off-by: Lukasz Wojciechowski <l.wojciechow at partner.samsung.com>
> ---
> app/test/test_distributor.c | 19 +++++++++++++++++--
> 1 file changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/app/test/test_distributor.c b/app/test/test_distributor.c
> index 838a67515..1e0a079ff 100644
> --- a/app/test/test_distributor.c
> +++ b/app/test/test_distributor.c
> @@ -27,6 +27,7 @@ struct worker_params worker_params;
> /* statics - all zero-initialized by default */
> static volatile int quit; /**< general quit variable for all threads */
> static volatile int zero_quit; /**< var for when we just want thr0 to quit*/
> +static volatile int zero_sleep; /**< thr0 has quit basic loop and is sleeping*/
> static volatile unsigned worker_idx;
> static volatile unsigned zero_idx;
>
> @@ -376,8 +377,10 @@ handle_work_for_shutdown_test(void *arg)
> /* for worker zero, allow it to restart to pick up last packet
> * when all workers are shutting down.
> */
> + __atomic_store_n(&zero_sleep, 1, __ATOMIC_RELEASE);
> while (zero_quit)
> usleep(100);
> + __atomic_store_n(&zero_sleep, 0, __ATOMIC_RELEASE);
>
> num = rte_distributor_get_pkt(d, id, buf, NULL, 0);
>
> @@ -445,7 +448,12 @@ sanity_test_with_worker_shutdown(struct worker_params *wp,
>
> /* flush the distributor */
> rte_distributor_flush(d);
> - rte_delay_us(10000);
> + while (!__atomic_load_n(&zero_sleep, __ATOMIC_ACQUIRE))
> + rte_distributor_flush(d);
> +
> + zero_quit = 0;
> + while (__atomic_load_n(&zero_sleep, __ATOMIC_ACQUIRE))
> + rte_delay_us(100);
>
> for (i = 0; i < rte_lcore_count() - 1; i++)
> printf("Worker %u handled %u packets\n", i,
> @@ -505,9 +513,14 @@ test_flush_with_worker_shutdown(struct worker_params *wp,
> /* flush the distributor */
> rte_distributor_flush(d);
>
> - rte_delay_us(10000);
> + while (!__atomic_load_n(&zero_sleep, __ATOMIC_ACQUIRE))
> + rte_distributor_flush(d);
>
> zero_quit = 0;
> +
> + while (__atomic_load_n(&zero_sleep, __ATOMIC_ACQUIRE))
> + rte_delay_us(100);
> +
> for (i = 0; i < rte_lcore_count() - 1; i++)
> printf("Worker %u handled %u packets\n", i,
> __atomic_load_n(&worker_stats[i].handled_packets,
> @@ -615,6 +628,8 @@ quit_workers(struct worker_params *wp, struct rte_mempool *p)
> quit = 0;
> worker_idx = 0;
> zero_idx = RTE_MAX_LCORE;
> + zero_quit = 0;
> + zero_sleep = 0;
> }
>
> static int
Acked-by: David Hunt <david.hunt at intel.com>
More information about the stable
mailing list