shortlog should say something like:
test: correct worker count calculation

On 2016-02-22 16:46, Gary S. Robertson wrote:
> During the process of addressing Linaro BUG 2027 which relates to

Add a link to the bug in this changelog.

> inaccurate reporting of available CPUs by ODP linux-generic when
> running atop a kernel compiled with NO_HZ_FULL support,

You should add a test that uses CGROUP (should be enough to expose the
bug) that fails with the current code base and passes with this fix.

> a number of instances were encountered in the validation and
> performance test software where incorrect methods were used to
> determine the proper (or maximum) number of worker threads to create.
> 
> The use of odp_cpu_count() for this purpose is incorrect and
> deprecated...

The documentation doesn't say that you should not use this for this
purpose. However, its not actually deprecated right?

> odp_cpumask_default_worker() should always be used
> to determine the set and number of CPUs available for creating
> worker threads.
> 
> The use of odp_cpu_count() for this purpose in conjunction with the
> correct means of determining available CPUs resulted in some tests
> hanging in calls to odp_barrier_wait() as the barriers were initialized
> to expect threads on ALL CPUs rather than on worker CPUs alone...
> and there were too few worker threads created to satisfy the barriers.
> 
> The changes below correct all instances I could find of this depecated
> technique and allowed all tests to complete successfully with the
> BUG 2027 patch applied. (BTW they also run correctly without that patch
> after the application of the modifications included here.)
> 
> Signed-off-by: Gary S. Robertson <gary.robert...@linaro.org>
> ---
>  test/performance/odp_atomic.c     |  9 ++++++---
>  test/validation/cpumask/cpumask.c |  2 +-
>  test/validation/shmem/shmem.c     |  5 ++++-
>  test/validation/timer/timer.c     | 16 +++++++++-------
>  4 files changed, 20 insertions(+), 12 deletions(-)
> 
> diff --git a/test/performance/odp_atomic.c b/test/performance/odp_atomic.c
> index 067329b..7e2e22f 100644
> --- a/test/performance/odp_atomic.c
> +++ b/test/performance/odp_atomic.c
> @@ -303,6 +303,8 @@ int odp_test_thread_exit(pthrd_arg *arg)
>  /** test init globals and call odp_init_global() */
>  int odp_test_global_init(void)
>  {
> +     odp_cpumask_t unused;
> +
>       memset(thread_tbl, 0, sizeof(thread_tbl));
>  
>       if (odp_init_global(NULL, NULL)) {
> @@ -310,7 +312,8 @@ int odp_test_global_init(void)
>               return -1;
>       }
>  
> -     num_workers = odp_cpu_count();
> +     num_workers = odp_cpumask_default_worker(&unused, 0);
> +
>       /* force to max CPU count */
>       if (num_workers > MAX_WORKERS)
>               num_workers = MAX_WORKERS;
> @@ -378,7 +381,7 @@ int main(int argc, char *argv[])
>                       goto err_exit;
>               }
>               if (test_type < TEST_MIX || test_type > TEST_MAX ||
> -                 pthrdnum > odp_cpu_count() || pthrdnum < 0) {
> +                 pthrdnum > num_workers || pthrdnum < 0) {
>                       usage();
>                       goto err_exit;
>               }
> @@ -386,7 +389,7 @@ int main(int argc, char *argv[])
>       }
>  
>       if (pthrdnum == 0)
> -             pthrdnum = odp_cpu_count();
> +             pthrdnum = num_workers;
>  
>       test_atomic_init();
>       test_atomic_store();
> diff --git a/test/validation/cpumask/cpumask.c 
> b/test/validation/cpumask/cpumask.c
> index 2419f47..1bb8f8d 100644
> --- a/test/validation/cpumask/cpumask.c
> +++ b/test/validation/cpumask/cpumask.c
> @@ -67,7 +67,7 @@ void cpumask_test_odp_cpumask_def(void)
>       mask_count = odp_cpumask_count(&mask);
>       CU_ASSERT(mask_count == num_control);
>  
> -     CU_ASSERT(num_control == 1);
> +     CU_ASSERT(num_control >= 1);

Good catch, belongs in its own patch.

>       CU_ASSERT(num_worker <= available_cpus);
>       CU_ASSERT(num_worker > 0);
>  }
> diff --git a/test/validation/shmem/shmem.c b/test/validation/shmem/shmem.c
> index 08425e6..be8bd6f 100644
> --- a/test/validation/shmem/shmem.c
> +++ b/test/validation/shmem/shmem.c
> @@ -6,6 +6,8 @@
>  
>  #include <odp.h>
>  #include <odp_cunit_common.h>
> +#include <odp/cpumask.h>
> +

Not needed.

>  #include "shmem.h"
>  
>  #define ALIGE_SIZE  (128)
> @@ -52,6 +54,7 @@ void shmem_test_odp_shm_sunnyday(void)
>       pthrd_arg thrdarg;
>       odp_shm_t shm;
>       test_shared_data_t *test_shared_data;
> +     odp_cpumask_t unused;
>  
>       shm = odp_shm_reserve(TESTNAME,
>                             sizeof(test_shared_data_t), ALIGE_SIZE, 0);
> @@ -70,7 +73,7 @@ void shmem_test_odp_shm_sunnyday(void)
>       test_shared_data->foo = TEST_SHARE_FOO;
>       test_shared_data->bar = TEST_SHARE_BAR;
>  
> -     thrdarg.numthrds = odp_cpu_count();
> +     thrdarg.numthrds = odp_cpumask_default_worker(&unused, 0);
>  
>       if (thrdarg.numthrds > MAX_WORKERS)
>               thrdarg.numthrds = MAX_WORKERS;
> diff --git a/test/validation/timer/timer.c b/test/validation/timer/timer.c
> index 004670a..bee3e8d 100644
> --- a/test/validation/timer/timer.c
> +++ b/test/validation/timer/timer.c
> @@ -15,6 +15,7 @@
>  
>  #include <time.h>
>  #include <odp.h>
> +#include <odp/helper/linux.h>
>  #include "odp_cunit_common.h"
>  #include "test_debug.h"
>  #include "timer.h"
> @@ -41,12 +42,6 @@ static odp_atomic_u32_t ndelivtoolate;
>   * caches may make this number lower than the capacity of the pool  */
>  static odp_atomic_u32_t timers_allocated;
>  
> -/** @private min() function */
> -static int min(int a, int b)
> -{
> -     return a < b ? a : b;
> -}
> -
>  /* @private Timer helper structure */
>  struct test_timer {
>       odp_timer_t tim; /* Timer handle */
> @@ -457,10 +452,17 @@ void timer_test_odp_timer_all(void)
>       int rc;
>       odp_pool_param_t params;
>       odp_timer_pool_param_t tparam;
> +     odp_cpumask_t unused;
> +
>       /* Reserve at least one core for running other processes so the timer
>        * test hopefully can run undisturbed and thus get better timing
>        * results. */
> -     int num_workers = min(odp_cpu_count() - 1, MAX_WORKERS);
> +     int num_workers = odp_cpumask_default_worker(&unused, 0);
> +
> +     /* force to max CPU count */
> +     if (num_workers > MAX_WORKERS)
> +             num_workers = MAX_WORKERS;
> +

Why do we need MAX_WORKERS when we asks for odp_cpumask_default_worker?

Cheers,
Anders
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to