source: rtems/testsuites/smptests/smpaffinity01/init.c @ ad48ebb

4.115
Last change on this file since ad48ebb was ad48ebb, checked in by Sebastian Huber <sebastian.huber@…>, on 03/17/14 at 07:10:19

tests/smptests: Use <rtems/test.h>

  • Property mode set to 100644
File size: 7.6 KB
Line 
1/*
2 *  COPYRIGHT (c) 1989-2011.
3 *  On-Line Applications Research Corporation (OAR).
4 *
5 *  The license and distribution terms for this file may be
6 *  found in the file LICENSE in this distribution or at
7 *  http://www.rtems.com/license/LICENSE.
8 */
9
10#ifdef HAVE_CONFIG_H
11#include "config.h"
12#endif
13
14#define NUM_CPUS   4
15
16#include "tmacros.h"
17
18const char rtems_test_name[] = "SMPAFFINITY 1";
19
20#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
21
22rtems_id           Init_id;
23rtems_id           Med_id[NUM_CPUS-1];
24rtems_id           Low_id[NUM_CPUS];
25
26/* forward declarations to avoid warnings */
27void Task_1(rtems_task_argument arg);
28void Validate_setaffinity_errors(void);
29void Validate_getaffinity_errors(void);
30void Validate_affinity(void);
31
32void Task_1(rtems_task_argument arg)
33{
34  while(1);
35}
36
37void Validate_setaffinity_errors(void)
38{
39  int                 sc;
40  cpu_set_t           cpuset;
41
42  /* Verify rtems_task_set_affinity checks that all cpu's exist. */
43  /* Note this check assumes you are running with less than 32 CPUs */
44  CPU_FILL(&cpuset);
45  puts( "Init - rtems_task_set_affinity - Invalid cpu - RTEMS_INVALID_NUMBER" );
46  sc = rtems_task_set_affinity( Init_id, sizeof(cpu_set_t), &cpuset );
47  rtems_test_assert( sc == RTEMS_INVALID_NUMBER );
48
49  /* Verify rtems_task_set_affinity checks that at least one cpu is set */
50  CPU_ZERO(&cpuset);
51  puts( "Init - rtems_task_set_affinity - no cpu - RTEMS_INVALID_NUMBER" );
52  sc = rtems_task_set_affinity( Init_id, sizeof(cpu_set_t), &cpuset );
53  rtems_test_assert( sc == RTEMS_INVALID_NUMBER );
54
55  /* Verify rtems_task_set_affinity checks that at thread id is valid */
56  CPU_SET(0, &cpuset);
57  puts( "Init - rtems_task_set_affinity - Invalid thread - RTEMS_INVALID_ID" );
58  sc = rtems_task_set_affinity( 999, sizeof(cpu_set_t), &cpuset );
59  rtems_test_assert( sc == RTEMS_INVALID_ID );
60
61  /* Verify rtems_task_set_affinity validates cpusetsize */
62  puts( "Init - rtems_task_set_affinity - Invalid cpusetsize - RTEMS_INVALID_NUMBER" );
63  sc = rtems_task_set_affinity( Init_id,  sizeof(cpu_set_t) * 2, &cpuset );
64  rtems_test_assert( sc == RTEMS_INVALID_NUMBER );
65
66  /* Verifyrtems_task_set_affinity validates cpuset */
67  puts( "Init - rtems_task_set_affinity - Invalid cpuset - RTEMS_INVALID_ADDRESS" );
68  sc = rtems_task_set_affinity( Init_id, sizeof(cpu_set_t), NULL );
69  rtems_test_assert( sc == RTEMS_INVALID_ADDRESS );
70}
71
72void Validate_getaffinity_errors(void)
73{
74  int                 sc;
75  cpu_set_t           cpuset;
76
77  /* Verify rtems_task_get_affinity checks that at thread id is valid */
78  CPU_SET(0, &cpuset);
79  puts( "Init - rtems_task_get_affinity - Invalid thread - RTEMS_INVALID_ID" );
80  sc = rtems_task_get_affinity( 999, sizeof(cpu_set_t), &cpuset );
81  rtems_test_assert( sc == RTEMS_INVALID_ID );
82
83  /* Verify rtems_task_get_affinity validates cpusetsize */
84  puts(
85    "Init - rtems_task_get_affinity - Invalid cpusetsize - RTEMS_INVALID_NUMBER"
86  );
87  sc = rtems_task_get_affinity( Init_id,  sizeof(cpu_set_t) * 2, &cpuset );
88  rtems_test_assert( sc == RTEMS_INVALID_NUMBER );
89
90  /* Verify rtems_task_get_affinity validates cpuset */
91  puts("Init - rtems_task_get_affinity - Invalid cpuset - RTEMS_INVALID_ADDRESS");
92  sc = rtems_task_get_affinity( Init_id, sizeof(cpu_set_t), NULL );
93  rtems_test_assert( sc == RTEMS_INVALID_ADDRESS );
94}
95
96void Validate_affinity(void )
97{
98  cpu_set_t            cpuset0;
99  cpu_set_t            cpuset1;
100  cpu_set_t            cpuset2;
101  uint32_t             i;
102  int                  sc;
103  int                  cpu_count;
104  rtems_task_priority  priority;
105  char                 ch[2];
106
107
108  puts( "Init - Set Init priority to high");
109  sc = rtems_task_set_priority( Init_id, 1, &priority );
110  directive_failed( sc, "Set Init Priority" );
111
112  sc = rtems_task_get_affinity( Init_id, sizeof(cpu_set_t), &cpuset0 );
113  directive_failed( sc, "Get Affinity of Init Task" );
114
115  /* Get the number of processors that we are using. */
116  cpu_count = rtems_smp_get_processor_count();
117
118  /* Fill the remaining cpus with med priority tasks */
119  puts( "Init - Create Medium priority tasks");
120  for (i=0; i<(cpu_count-1); i++){
121    sprintf(ch, "%01" PRId32, i+1 );
122    sc = rtems_task_create(
123      rtems_build_name( 'C', 'P', 'U', ch[0] ),
124      2,
125      RTEMS_MINIMUM_STACK_SIZE,
126      RTEMS_DEFAULT_MODES,
127      RTEMS_DEFAULT_ATTRIBUTES,
128      &Med_id[i]
129    );
130    directive_failed( sc, "task create" );
131
132    sc = rtems_task_start( Med_id[i], Task_1, i+1 );
133    directive_failed( sc, "task start" );
134
135    sc = rtems_task_get_affinity( Med_id[i], sizeof(cpu_set_t), &cpuset2 );
136    directive_failed( sc, "Get Affinity of Medium Priority Task" );
137    rtems_test_assert( CPU_EQUAL(&cpuset0, &cpuset2) );
138  }
139
140  /*
141   * Create low priority thread for each remaining cpu with the affinity
142   * set to only run on one cpu.
143   */
144  puts( "Init - Create  Low priority tasks");
145  for (i=0; i<cpu_count; i++){
146    CPU_ZERO(&cpuset1);
147    CPU_SET(i, &cpuset1);
148
149    sprintf(ch, "%01" PRId32, (uint32_t) 0 );
150    sc = rtems_task_create(
151      rtems_build_name( 'X', 'T', 'R', ch[0] ),
152      10,
153      RTEMS_MINIMUM_STACK_SIZE,
154      RTEMS_DEFAULT_MODES,
155      RTEMS_DEFAULT_ATTRIBUTES,
156      &Low_id[i]
157    );
158    directive_failed( sc, "task create" );
159
160    sc = rtems_task_set_affinity( Low_id[i], sizeof(cpu_set_t), &cpuset1 );
161    directive_failed( sc, "Low priority task set affinity" );
162
163    sc = rtems_task_start( Low_id[i], Task_1, i+1 );
164    directive_failed( sc, "task start" );
165  }
166
167
168  /* Verify affinity on low priority tasks */
169  puts("Init - Verify affinity on Low priority tasks");
170  for (i=0; i<cpu_count; i++){
171    CPU_ZERO(&cpuset1);
172    CPU_SET(i, &cpuset1);
173
174    sc = rtems_task_get_affinity( Low_id[i], sizeof(cpu_set_t), &cpuset2 );
175    directive_failed( sc, "Low priority task get affinity" );
176    rtems_test_assert( CPU_EQUAL(&cpuset1, &cpuset2) );
177  }
178
179  /* Change the affinity for each low priority task */
180  puts("Init - Change affinity on Low priority tasks");
181  CPU_COPY(&cpuset1, &cpuset0);
182  for (i=0; i<cpu_count; i++){
183
184    CPU_CLR(i, &cpuset1);
185    sc = rtems_task_set_affinity( Low_id[i], sizeof(cpu_set_t), &cpuset1 );
186
187    /* Verify no cpu's are now set in the cpuset */
188    if (i== (cpu_count-1)) {
189      rtems_test_assert( sc == RTEMS_INVALID_NUMBER );
190      sc = rtems_task_set_affinity( Low_id[i], sizeof(cpu_set_t), &cpuset0 );
191    }
192
193    directive_failed( sc, "Low priority task set affinity" );
194  }
195
196  puts("Init - Validate affinity on Low priority tasks");
197  CPU_COPY(&cpuset1, &cpuset0);
198  for (i=0; i<cpu_count; i++){
199    CPU_CLR(i, &cpuset1);
200
201    sc = rtems_task_get_affinity( Low_id[i], sizeof(cpu_set_t), &cpuset2 );
202    directive_failed( sc, "Low priority task get affinity" );
203    if (i== (cpu_count-1))
204      rtems_test_assert( CPU_EQUAL(&cpuset0, &cpuset2) );
205    else
206      rtems_test_assert( CPU_EQUAL(&cpuset1, &cpuset2) );
207  }
208}
209
210static void Init(rtems_task_argument arg)
211{
212  int                  sc;
213
214  TEST_BEGIN();
215
216  /* Initialize thread id */
217  sc = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &Init_id );
218  directive_failed( sc, "Identify Init Task" );
219
220  Validate_setaffinity_errors();
221  Validate_getaffinity_errors();
222  Validate_affinity();
223
224  TEST_END();
225  rtems_test_exit(0);
226}
227
228#else
229static void Init(rtems_task_argument arg)
230{
231  TEST_BEGIN();
232  puts( " Affinity NOT Supported");
233  TEST_END();
234  rtems_test_exit(0);
235}
236
237#endif
238#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
239#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
240
241#define CONFIGURE_SMP_APPLICATION
242
243#define CONFIGURE_SMP_MAXIMUM_PROCESSORS NUM_CPUS
244
245#define CONFIGURE_MAXIMUM_TASKS         (NUM_CPUS*2)
246
247#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
248
249#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
250
251#define CONFIGURE_INIT
252
253#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.