source: rtems/testsuites/smptests/smpscheduler02/init.c @ db20706

5
Last change on this file since db20706 was db20706, checked in by Sebastian Huber <sebastian.huber@…>, on 11/23/16 at 06:17:00

smptests/smpscheduler02: Fix task initialization

Set scheduler before the task start.

  • Property mode set to 100644
File size: 14.1 KB
Line 
1/*
2 * Copyright (c) 2014, 2016 embedded brains GmbH.  All rights reserved.
3 *
4 *  embedded brains GmbH
5 *  Dornierstr. 4
6 *  82178 Puchheim
7 *  Germany
8 *  <rtems@embedded-brains.de>
9 *
10 * The license and distribution terms for this file may be
11 * found in the file LICENSE in this distribution or at
12 * http://www.rtems.org/license/LICENSE.
13 */
14
15#ifdef HAVE_CONFIG_H
16  #include "config.h"
17#endif
18
19#include <sched.h>
20
21#include <rtems.h>
22#include <rtems/libcsupport.h>
23
24#include "tmacros.h"
25
26const char rtems_test_name[] = "SMPSCHEDULER 2";
27
28#define SCHED_A rtems_build_name(' ', ' ', ' ', 'A')
29
30#define SCHED_B rtems_build_name(' ', ' ', ' ', 'B')
31
32#define SCHED_C rtems_build_name(' ', ' ', ' ', 'C')
33
34static rtems_id main_task_id;
35
36static rtems_id cmtx_id;
37
38static rtems_id imtx_id;
39
40static volatile bool ready;
41
42static void task(rtems_task_argument arg)
43{
44  rtems_status_code sc;
45
46  (void) arg;
47
48  rtems_test_assert(rtems_get_current_processor() == 1);
49  rtems_test_assert(sched_get_priority_min(SCHED_RR) == 1);
50  rtems_test_assert(sched_get_priority_max(SCHED_RR) == 126);
51
52  sc = rtems_semaphore_obtain(cmtx_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
53  rtems_test_assert(sc == RTEMS_NOT_DEFINED);
54
55  sc = rtems_event_transient_send(main_task_id);
56  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
57
58  sc = rtems_semaphore_obtain(imtx_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
59  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
60
61  sc = rtems_semaphore_release(imtx_id);
62  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
63
64  sc = rtems_event_transient_send(main_task_id);
65  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
66
67  while (1) {
68    /* Do nothing */
69  }
70}
71
72static void sticky_task(rtems_task_argument arg)
73{
74  rtems_status_code sc;
75  rtems_id mtx_id;
76
77  (void) arg;
78
79  rtems_test_assert(rtems_get_current_processor() == 0);
80
81  sc = rtems_semaphore_create(
82    rtems_build_name(' ', 'M', 'T', 'X'),
83    1,
84    RTEMS_BINARY_SEMAPHORE | RTEMS_MULTIPROCESSOR_RESOURCE_SHARING,
85    2,
86    &mtx_id
87  );
88  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
89
90  sc = rtems_semaphore_obtain(mtx_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
91  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
92
93  ready = true;
94
95  sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
96  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
97
98  sc = rtems_semaphore_release(mtx_id);
99  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
100
101  sc = rtems_semaphore_delete(mtx_id);
102  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
103
104  sc = rtems_event_transient_send(main_task_id);
105  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
106
107  while (1) {
108    /* Do nothing */
109  }
110}
111
112static void test_scheduler_add_remove_processors(void)
113{
114  rtems_status_code sc;
115  rtems_id scheduler_a_id;
116  rtems_id scheduler_c_id;
117
118  sc = rtems_scheduler_ident(SCHED_A, &scheduler_a_id);
119  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
120
121  sc = rtems_scheduler_ident(SCHED_C, &scheduler_c_id);
122  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
123
124  sc = rtems_scheduler_add_processor(scheduler_c_id, 62);
125  rtems_test_assert(sc == RTEMS_NOT_CONFIGURED);
126
127  sc = rtems_scheduler_add_processor(scheduler_c_id, 63);
128  rtems_test_assert(sc == RTEMS_INCORRECT_STATE);
129
130  sc = rtems_scheduler_remove_processor(scheduler_c_id, 62);
131  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
132
133  sc = rtems_scheduler_remove_processor(scheduler_a_id, 0);
134  rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE);
135
136  if (rtems_get_processor_count() > 1) {
137    rtems_id scheduler_b_id;
138    rtems_id task_id;
139
140    sc = rtems_scheduler_ident(SCHED_B, &scheduler_b_id);
141    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
142
143    sc = rtems_scheduler_remove_processor(scheduler_b_id, 1);
144    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
145
146    sc = rtems_scheduler_add_processor(scheduler_a_id, 1);
147    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
148
149    rtems_test_assert(rtems_get_current_processor() == 0);
150
151    sc = rtems_scheduler_remove_processor(scheduler_a_id, 0);
152    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
153
154    rtems_test_assert(rtems_get_current_processor() == 1);
155
156    sc = rtems_scheduler_add_processor(scheduler_a_id, 0);
157    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
158
159    rtems_test_assert(rtems_get_current_processor() == 1);
160
161    sc = rtems_task_create(
162      rtems_build_name('T', 'A', 'S', 'K'),
163      2,
164      RTEMS_MINIMUM_STACK_SIZE,
165      RTEMS_DEFAULT_MODES,
166      RTEMS_DEFAULT_ATTRIBUTES,
167      &task_id
168    );
169    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
170
171    sc = rtems_task_start(task_id, sticky_task, 0);
172    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
173
174    while (!ready) {
175      /* Wait */
176    }
177
178    sc = rtems_scheduler_remove_processor(scheduler_a_id, 1);
179    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
180
181    rtems_test_assert(rtems_get_current_processor() == 0);
182
183    sc = rtems_event_transient_send(task_id);
184    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
185
186    sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
187    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
188
189    sc = rtems_task_delete(task_id);
190    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
191
192    sc = rtems_scheduler_add_processor(scheduler_b_id, 1);
193    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
194  }
195}
196
197static void test(void)
198{
199  rtems_status_code sc;
200  rtems_id task_id;
201  rtems_id scheduler_id;
202  rtems_id scheduler_a_id;
203  rtems_id scheduler_b_id;
204  rtems_id scheduler_c_id;
205  rtems_task_priority prio;
206  cpu_set_t cpuset;
207  cpu_set_t first_cpu;
208  cpu_set_t second_cpu;
209  cpu_set_t all_cpus;
210  uint32_t cpu_count;
211
212  main_task_id = rtems_task_self();
213
214  CPU_ZERO(&first_cpu);
215  CPU_SET(0, &first_cpu);
216
217  CPU_ZERO(&second_cpu);
218  CPU_SET(1, &second_cpu);
219
220  CPU_ZERO(&all_cpus);
221  CPU_SET(0, &all_cpus);
222  CPU_SET(1, &all_cpus);
223
224  cpu_count = rtems_get_processor_count();
225
226  rtems_test_assert(rtems_get_current_processor() == 0);
227
228  sc = rtems_scheduler_ident(SCHED_A, &scheduler_a_id);
229  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
230
231  if (cpu_count > 1) {
232    sc = rtems_scheduler_ident(SCHED_B, &scheduler_b_id);
233    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
234    rtems_test_assert(scheduler_a_id != scheduler_b_id);
235  }
236
237  sc = rtems_scheduler_ident(SCHED_C, &scheduler_c_id);
238  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
239
240  sc = rtems_semaphore_create(
241    rtems_build_name('C', 'M', 'T', 'X'),
242    1,
243    RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_PRIORITY_CEILING,
244    1,
245    &cmtx_id
246  );
247  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
248
249  sc = rtems_semaphore_create(
250    rtems_build_name('I', 'M', 'T', 'X'),
251    1,
252    RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY,
253    1,
254    &imtx_id
255  );
256  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
257
258  prio = 2;
259  sc = rtems_semaphore_set_priority(cmtx_id, scheduler_a_id, prio, &prio);
260  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
261  rtems_test_assert(prio == 1);
262
263  if (cpu_count > 1) {
264    prio = 1;
265    sc = rtems_semaphore_set_priority(cmtx_id, scheduler_b_id, prio, &prio);
266    rtems_test_assert(sc == RTEMS_NOT_DEFINED);
267    rtems_test_assert(prio == 2);
268  }
269
270  CPU_ZERO(&cpuset);
271  sc = rtems_scheduler_get_processor_set(
272    scheduler_a_id,
273    sizeof(cpuset),
274    &cpuset
275  );
276  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
277  rtems_test_assert(CPU_EQUAL(&cpuset, &first_cpu));
278
279  if (cpu_count > 1) {
280    CPU_ZERO(&cpuset);
281    sc = rtems_scheduler_get_processor_set(
282      scheduler_b_id,
283      sizeof(cpuset),
284      &cpuset
285    );
286    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
287    rtems_test_assert(CPU_EQUAL(&cpuset, &second_cpu));
288  }
289
290  sc = rtems_task_create(
291    rtems_build_name('T', 'A', 'S', 'K'),
292    1,
293    RTEMS_MINIMUM_STACK_SIZE,
294    RTEMS_DEFAULT_MODES,
295    RTEMS_DEFAULT_ATTRIBUTES,
296    &task_id
297  );
298  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
299
300  sc = rtems_task_get_scheduler(task_id, &scheduler_id);
301  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
302  rtems_test_assert(scheduler_id == scheduler_a_id);
303
304  CPU_ZERO(&cpuset);
305  sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset);
306  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
307  rtems_test_assert(CPU_EQUAL(&cpuset, &first_cpu));
308
309  rtems_test_assert(sched_get_priority_min(SCHED_RR) == 1);
310  rtems_test_assert(sched_get_priority_max(SCHED_RR) == 254);
311
312  sc = rtems_task_set_scheduler(task_id, scheduler_c_id, 1);
313  rtems_test_assert(sc == RTEMS_UNSATISFIED);
314
315  sc = rtems_task_set_scheduler(task_id, scheduler_c_id + 1, 1);
316  rtems_test_assert(sc == RTEMS_INVALID_ID);
317
318  if (cpu_count > 1) {
319    sc = rtems_task_set_scheduler(task_id, scheduler_b_id, 1);
320    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
321
322    sc = rtems_task_get_scheduler(task_id, &scheduler_id);
323    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
324    rtems_test_assert(scheduler_id == scheduler_b_id);
325
326    CPU_ZERO(&cpuset);
327    sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset);
328    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
329    rtems_test_assert(CPU_EQUAL(&cpuset, &second_cpu));
330
331    sc = rtems_task_set_affinity(task_id, sizeof(all_cpus), &all_cpus);
332    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
333
334    sc = rtems_task_set_affinity(task_id, sizeof(first_cpu), &first_cpu);
335    rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
336
337    sc = rtems_task_get_scheduler(task_id, &scheduler_id);
338    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
339    rtems_test_assert(scheduler_id == scheduler_b_id);
340
341    sc = rtems_task_set_affinity(task_id, sizeof(second_cpu), &second_cpu);
342    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
343
344    sc = rtems_task_get_scheduler(task_id, &scheduler_id);
345    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
346    rtems_test_assert(scheduler_id == scheduler_b_id);
347
348    sc = rtems_semaphore_obtain(imtx_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
349    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
350
351    sc = rtems_task_set_scheduler(task_id, scheduler_b_id, 1);
352    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
353
354    sc = rtems_task_start(task_id, task, 0);
355    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
356
357    sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
358    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
359
360    sc = rtems_task_set_scheduler(RTEMS_SELF, scheduler_b_id, 1);
361    rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE);
362
363    sc = rtems_semaphore_release(imtx_id);
364    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
365
366    sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
367    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
368  }
369
370  sc = rtems_task_delete(task_id);
371  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
372
373  sc = rtems_semaphore_delete(cmtx_id);
374  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
375
376  sc = rtems_semaphore_delete(imtx_id);
377  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
378
379  test_scheduler_add_remove_processors();
380}
381
382static void Init(rtems_task_argument arg)
383{
384  rtems_resource_snapshot snapshot;
385
386  TEST_BEGIN();
387
388  rtems_resource_snapshot_take(&snapshot);
389
390  test();
391
392  rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
393
394  TEST_END();
395  rtems_test_exit(0);
396}
397
398#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
399#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
400
401#define CONFIGURE_MAXIMUM_TASKS 2
402#define CONFIGURE_MAXIMUM_SEMAPHORES 2
403#define CONFIGURE_MAXIMUM_MRSP_SEMAPHORES 1
404
405#define CONFIGURE_SMP_APPLICATION
406
407/* Lets see when the first RTEMS system hits this limit */
408#define CONFIGURE_SMP_MAXIMUM_PROCESSORS 64
409
410#define CONFIGURE_SCHEDULER_PRIORITY_SMP
411#define CONFIGURE_SCHEDULER_SIMPLE_SMP
412
413#include <rtems/scheduler.h>
414
415RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(a, 256);
416
417RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(b, 128);
418
419RTEMS_SCHEDULER_CONTEXT_SIMPLE_SMP(c);
420
421#define CONFIGURE_SCHEDULER_CONTROLS \
422  RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(a, SCHED_A), \
423  RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(b, SCHED_B), \
424  RTEMS_SCHEDULER_CONTROL_SIMPLE_SMP(c, SCHED_C)
425
426#define CONFIGURE_SMP_SCHEDULER_ASSIGNMENTS \
427  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \
428  RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
429  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
430  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
431  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
432  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
433  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
434  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
435  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
436  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
437  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
438  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
439  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
440  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
441  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
442  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
443  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
444  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
445  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
446  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
447  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
448  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
449  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
450  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
451  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
452  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
453  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
454  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
455  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
456  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
457  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
458  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
459  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER, \
460  RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL)
461
462#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
463
464#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
465
466#define CONFIGURE_INIT
467
468#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.