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

4.115
Last change on this file since d20b029 was c5831a3f, checked in by Sebastian Huber <sebastian.huber@…>, on 04/09/14 at 13:07:54

score: Add clustered/partitioned scheduling

Clustered/partitioned scheduling helps to control the worst-case
latencies in the system. The goal is to reduce the amount of shared
state in the system and thus prevention of lock contention. Modern
multi-processor systems tend to have several layers of data and
instruction caches. With clustered/partitioned scheduling it is
possible to honour the cache topology of a system and thus avoid
expensive cache synchronization traffic.

We have clustered scheduling in case the set of processors of a system
is partitioned into non-empty pairwise-disjoint subsets. These subsets
are called clusters. Clusters with a cardinality of one are partitions.
Each cluster is owned by exactly one scheduler instance.

  • Property mode set to 100644
File size: 5.5 KB
Line 
1/*
2 * Copyright (c) 2014 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 <rtems.h>
20#include <rtems/libcsupport.h>
21
22#include "tmacros.h"
23
24const char rtems_test_name[] = "SMPSCHEDULER 2";
25
26#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
27
28#define CPU_COUNT 2
29
30#define SCHED_A rtems_build_name(' ', ' ', ' ', 'A')
31
32#define SCHED_B rtems_build_name(' ', ' ', ' ', 'B')
33
34static rtems_id main_task_id;
35
36static void task(rtems_task_argument arg)
37{
38  rtems_status_code sc;
39
40  (void) arg;
41
42  rtems_test_assert(rtems_get_current_processor() == 1);
43
44  sc = rtems_event_transient_send(main_task_id);
45  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
46
47  while (1) {
48    /* Do nothing */
49  }
50}
51
52static void test(void)
53{
54  rtems_status_code sc;
55  rtems_id task_id;
56  rtems_id scheduler_id;
57  rtems_id scheduler_a_id;
58  rtems_id scheduler_b_id;
59  cpu_set_t cpuset;
60  cpu_set_t first_cpu;
61  cpu_set_t second_cpu;
62  cpu_set_t all_cpus;
63
64  main_task_id = rtems_task_self();
65
66  CPU_ZERO(&first_cpu);
67  CPU_SET(0, &first_cpu);
68
69  CPU_ZERO(&second_cpu);
70  CPU_SET(1, &second_cpu);
71
72  CPU_ZERO(&all_cpus);
73  CPU_SET(0, &all_cpus);
74  CPU_SET(1, &all_cpus);
75
76  rtems_test_assert(rtems_get_current_processor() == 0);
77
78  sc = rtems_scheduler_ident(SCHED_A, &scheduler_a_id);
79  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
80
81  sc = rtems_scheduler_ident(SCHED_B, &scheduler_b_id);
82  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
83  rtems_test_assert(scheduler_a_id != scheduler_b_id);
84
85  CPU_ZERO(&cpuset);
86  sc = rtems_scheduler_get_processor_set(
87    scheduler_a_id,
88    sizeof(cpuset),
89    &cpuset
90  );
91  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
92  rtems_test_assert(CPU_EQUAL(&cpuset, &first_cpu));
93
94  CPU_ZERO(&cpuset);
95  sc = rtems_scheduler_get_processor_set(
96    scheduler_b_id,
97    sizeof(cpuset),
98    &cpuset
99  );
100  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
101  rtems_test_assert(CPU_EQUAL(&cpuset, &second_cpu));
102
103  sc = rtems_task_create(
104    rtems_build_name('T', 'A', 'S', 'K'),
105    1,
106    RTEMS_MINIMUM_STACK_SIZE,
107    RTEMS_DEFAULT_MODES,
108    RTEMS_DEFAULT_ATTRIBUTES,
109    &task_id
110  );
111  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
112
113  sc = rtems_task_get_scheduler(task_id, &scheduler_id);
114  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
115  rtems_test_assert(scheduler_id == scheduler_a_id);
116
117  CPU_ZERO(&cpuset);
118  sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset);
119  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
120  rtems_test_assert(CPU_EQUAL(&cpuset, &first_cpu));
121
122  sc = rtems_task_set_scheduler(task_id, scheduler_b_id);
123  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
124
125  sc = rtems_task_get_scheduler(task_id, &scheduler_id);
126  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
127  rtems_test_assert(scheduler_id == scheduler_b_id);
128
129  CPU_ZERO(&cpuset);
130  sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset);
131  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
132  rtems_test_assert(CPU_EQUAL(&cpuset, &second_cpu));
133
134  sc = rtems_task_set_affinity(task_id, sizeof(all_cpus), &all_cpus);
135  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
136
137  sc = rtems_task_set_affinity(task_id, sizeof(first_cpu), &first_cpu);
138  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
139
140  sc = rtems_task_get_scheduler(task_id, &scheduler_id);
141  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
142  rtems_test_assert(scheduler_id == scheduler_a_id);
143
144  sc = rtems_task_set_affinity(task_id, sizeof(second_cpu), &second_cpu);
145  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
146
147  sc = rtems_task_get_scheduler(task_id, &scheduler_id);
148  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
149  rtems_test_assert(scheduler_id == scheduler_b_id);
150
151  sc = rtems_task_start(task_id, task, 0);
152  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
153
154  sc = rtems_task_set_scheduler(task_id, scheduler_a_id);
155  rtems_test_assert(sc == RTEMS_INCORRECT_STATE);
156
157  sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
158  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
159
160  sc = rtems_task_delete(task_id);
161  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
162}
163
164#else /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
165
166static void test(void)
167{
168  /* Nothing to do */
169}
170
171#endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
172
173static void Init(rtems_task_argument arg)
174{
175  rtems_resource_snapshot snapshot;
176
177  TEST_BEGIN();
178
179  rtems_resource_snapshot_take(&snapshot);
180
181  test();
182
183  rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
184
185  TEST_END();
186  rtems_test_exit(0);
187}
188
189#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
190#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
191
192#define CONFIGURE_SMP_APPLICATION
193
194#define CONFIGURE_SMP_MAXIMUM_PROCESSORS CPU_COUNT
195
196#define CONFIGURE_MAXIMUM_PRIORITY 255
197
198#define CONFIGURE_SCHEDULER_PRIORITY_SMP
199
200#include <rtems/scheduler.h>
201
202RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(a, CONFIGURE_MAXIMUM_PRIORITY + 1);
203
204RTEMS_SCHEDULER_CONTEXT_PRIORITY_SMP(b, CONFIGURE_MAXIMUM_PRIORITY + 1);
205
206#define CONFIGURE_SCHEDULER_CONTROLS \
207  RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(a, SCHED_A), \
208  RTEMS_SCHEDULER_CONTROL_PRIORITY_SMP(b, SCHED_B)
209
210#define CONFIGURE_SMP_SCHEDULER_ASSIGNMENTS \
211  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \
212  RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY)
213
214#define CONFIGURE_MAXIMUM_TASKS CPU_COUNT
215
216#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
217
218#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
219
220#define CONFIGURE_INIT
221
222#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.