[PATCH] Add Strong APA test
Richi Dubey
richidubey at gmail.com
Wed Aug 19 15:51:52 UTC 2020
Hi,
I would request someone to please verify if this patch looks correct since
I am testing my code on this test. The logic is taken from the paper
<https://people.mpi-sws.org/~bbb/papers/pdf/rtss14f.pdf> and I was
wondering if the reset function is handled correctly in this test because I
still have a little hard time understanding how (and why) we are reordering
the idle threads. Please let me know if there's anything that looks astray.
Also, the same test can be accessed from this link:
https://github.com/richidubey/rtems/blob/Strong-APA-v1.3/testsuites/smptests/smpstrongapa01/init.c
Thanks,
Richi.
On Wed, Aug 19, 2020 at 9:18 PM Richi Dubey <richidubey at gmail.com> wrote:
> ---
> testsuites/smptests/smpstrongapa01/init.c | 85 +++++++++++++----------
> 1 file changed, 49 insertions(+), 36 deletions(-)
>
> diff --git a/testsuites/smptests/smpstrongapa01/init.c
> b/testsuites/smptests/smpstrongapa01/init.c
> index bf8bc05231..89cc6404b9 100644
> --- a/testsuites/smptests/smpstrongapa01/init.c
> +++ b/testsuites/smptests/smpstrongapa01/init.c
> @@ -1,38 +1,40 @@
> /*
> - * Copyright (c) 2016, 2017 embedded brains GmbH. All rights reserved.
> + * Copyright (c) 2020 Richi Dubey
> + * All rights reserved.
> *
> - * embedded brains GmbH
> - * Dornierstr. 4
> - * 82178 Puchheim
> - * Germany
> - * <rtems at embedded-brains.de>
> + * richidubey at gmail.com
> *
> * The license and distribution terms for this file may be
> * found in the file LICENSE in this distribution or at
> * http://www.rtems.org/license/LICENSE.
> */
> -
> #ifdef HAVE_CONFIG_H
> #include "config.h"
> #endif
>
> -#include "tmacros.h"
> +#include <tmacros.h>
>
> #include <rtems.h>
>
> const char rtems_test_name[] = "SMPSTRONGAPA 1";
>
> -#define CPU_COUNT 4
> +#define CPU_COUNT 3
>
> -#define TASK_COUNT (3 * CPU_COUNT)
> +#define TASK_COUNT 4
>
> #define P(i) (UINT32_C(2) + i)
>
> #define ALL ((UINT32_C(1) << CPU_COUNT) - 1)
>
> -#define IDLE UINT8_C(255)
> +#define A(cpu0, cpu1, cpu2) ((cpu2 << 2) | (cpu1 << 1) | cpu0)
>
> -#define NAME rtems_build_name('S', 'A', 'P', 'A')
> +typedef enum {
> + T0,
> + T1,
> + T2,
> + T3,
> + IDLE
> +} task_index;
>
> typedef struct {
> enum {
> @@ -43,7 +45,7 @@ typedef struct {
> KIND_UNBLOCK
> } kind;
>
> - size_t index;
> + task_index index;
>
> struct {
> rtems_task_priority priority;
> @@ -65,54 +67,62 @@ typedef struct {
> KIND_RESET, \
> 0, \
> { 0 }, \
> - { IDLE, IDLE, IDLE, IDLE } \
> + { IDLE, IDLE, IDLE} \
> }
>
> -#define SET_PRIORITY(index, prio, cpu0, cpu1, cpu2, cpu3) \
> +#define SET_PRIORITY(index, prio, cpu0, cpu1, cpu2) \
> { \
> KIND_SET_PRIORITY, \
> index, \
> { .priority = prio }, \
> - { cpu0, cpu1, cpu2, cpu3 } \
> + { cpu0, cpu1, cpu2 } \
> }
>
> -#define SET_AFFINITY(index, aff, cpu0, cpu1, cpu2, cpu3) \
> +#define SET_AFFINITY(index, aff, cpu0, cpu1, cpu2) \
> { \
> KIND_SET_AFFINITY, \
> index, \
> { .cpu_set = aff }, \
> - { cpu0, cpu1, cpu2, cpu3 } \
> + { cpu0, cpu1, cpu2 } \
> }
>
> -#define BLOCK(index, cpu0, cpu1, cpu2, cpu3) \
> +#define BLOCK(index, cpu0, cpu1, cpu2) \
> { \
> KIND_BLOCK, \
> index, \
> { 0 }, \
> - { cpu0, cpu1, cpu2, cpu3 } \
> + { cpu0, cpu1, cpu2 } \
> }
>
> -#define UNBLOCK(index, cpu0, cpu1, cpu2, cpu3) \
> +#define UNBLOCK(index, cpu0, cpu1, cpu2) \
> { \
> KIND_UNBLOCK, \
> index, \
> { 0 }, \
> - { cpu0, cpu1, cpu2, cpu3 } \
> + { cpu0, cpu1, cpu2 } \
> }
>
> static const test_action test_actions[] = {
> RESET,
> - UNBLOCK( 0, 0, IDLE, IDLE, IDLE),
> - UNBLOCK( 1, 0, 1, IDLE, IDLE),
> - UNBLOCK( 2, 0, 1, 2, IDLE),
> - UNBLOCK( 3, 0, 1, 2, 3),
> - UNBLOCK( 5, 0, 1, 2, 3),
> - SET_PRIORITY( 3, P(4), 0, 1, 2, 3),
> - SET_PRIORITY( 5, P(3), 0, 1, 2, 5),
> - BLOCK( 5, 0, 1, 2, 3),
> - SET_AFFINITY( 5, ALL, 0, 1, 2, 3),
> - RESET,
> - UNBLOCK( 0, 0, IDLE, IDLE, IDLE),
> + UNBLOCK( T0, T0, IDLE, IDLE),
> + UNBLOCK( T1, T0, T1, IDLE),
> + UNBLOCK( T2, T0, T1, T2),
> + UNBLOCK( T3, T0, T1, T2),
> + SET_PRIORITY( T0, P(0), T0, T1, T2),
> + SET_PRIORITY( T1, P(1), T0, T1, T2),
> + SET_PRIORITY( T3, P(3), T0, T1, T2),
> + /*
> + * Introduce Task 2 intially with lowest priority to imitate late
> arrival
> + */
> + SET_PRIORITY( T2, P(4), T0, T1, T3),
> + SET_AFFINITY( T0, ALL, T0, T1, T3),
> + SET_AFFINITY( T1, A(0, 1, 1), T0, T1, T3),
> + SET_AFFINITY( T2, A(1, 0, 0), T0, T1, T3),
> + SET_AFFINITY( T3, A(0, 1, 1), T0, T1, T3),
> + /*
> + * Show that higher priority task gets dislodged from its processor
> + */
> + SET_PRIORITY( T2, P(2), T2, T1, T0),
> RESET
> };
>
> @@ -182,7 +192,7 @@ static void check_cpu_allocations(test_context *ctx,
> const test_action *action)
> size_t i;
>
> for (i = 0; i < CPU_COUNT; ++i) {
> - size_t e;
> + task_index e;
> const Per_CPU_Control *c;
> const Thread_Control *h;
>
> @@ -279,7 +289,7 @@ static void test(void)
>
> for (i = 0; i < TASK_COUNT; ++i) {
> sc = rtems_task_create(
> - NAME,
> + rtems_build_name(' ', ' ', 'T', '0' + i),
> P(i),
> RTEMS_MINIMUM_STACK_SIZE,
> RTEMS_DEFAULT_MODES,
> @@ -292,7 +302,10 @@ static void test(void)
> rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> }
>
> - sc = rtems_timer_create(NAME, &ctx->timer_id);
> + sc = rtems_timer_create(
> + rtems_build_name('A', 'C', 'T', 'N'),
> + &ctx->timer_id
> + );
> rtems_test_assert(sc == RTEMS_SUCCESSFUL);
>
> sc = rtems_timer_fire_after(ctx->timer_id, 1, timer, ctx);
> --
> 2.17.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20200819/40269689/attachment.html>
More information about the devel
mailing list