[PATCH] Add Strong APA test

Richi Dubey richidubey at gmail.com
Wed Aug 19 18:48:34 UTC 2020


Hi,
Sorry, I left the meeting early.

It was earlier :

>   SET_PRIORITY( T2,P(2), T2, T0, T1),


but now after checking thoroughly, I can confirm that it ought to be
(because of the way affinities are set and checked while running the
get_lowest_scheduled logic) :
  SET_PRIORITY( T2,P(2), T2, T1, T0),

Thanks for pointing that out, this could have been a mistake.

. It looks to be suspending every task, resuming 1
> task on every CPU, and then suspending that task (assuming there is
> only 1 runnable non-idle task on each CPU, and therefore executing == heir

I am getting the data_exception the second time (last action) reset is
called. It does not set the affinity of task that does not have index
>CPU_COUNT and tries to resume the higher priority task. Maybe the reset
function is making some assumptions. Nevertheless, I'll step through in
each function and find out what's wrong.

Thank you


On Wed, Aug 19, 2020 at 10:08 PM Gedare Bloom <gedare at rtems.org> wrote:

> Hi Richi,
>
> On Wed, Aug 19, 2020 at 9:52 AM Richi Dubey <richidubey at gmail.com> wrote:
> >
> > 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
> 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.
> >
>
> The test logic makes sense to me. The only question I have is whether
>   SET_PRIORITY( T2,P(2), T2, T1, T0),
> could also be
>   SET_PRIORITY( T2,P(2), T2, T0, T1),
>
> I don't know these tests well enough to say for sure about what
> reset() is doing. It looks to be suspending every task, resuming 1
> task on every CPU, and then suspending that task (assuming there is
> only 1 runnable non-idle task on each CPU, and therefore executing ==
> heir).
>
> > 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
> >>
> > _______________________________________________
> > devel mailing list
> > devel at rtems.org
> > http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20200820/6287de39/attachment-0001.html>


More information about the devel mailing list