source: rtems/testsuites/sptests/spscheduler01/init.c @ c5831a3f

4.115
Last change on this file since c5831a3f 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: 8.2 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 <limits.h>
23
24#include "tmacros.h"
25
26const char rtems_test_name[] = "SPSCHEDULER 1";
27
28#define BLUE rtems_build_name('b', 'l', 'u', 'e')
29
30#define RED rtems_build_name('r', 'e', 'd', ' ')
31
32static const rtems_id invalid_id = 1;
33
34static void test_task_get_set_affinity(void)
35{
36#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
37  rtems_id self_id = rtems_task_self();
38  rtems_id task_id;
39  rtems_status_code sc;
40  cpu_set_t cpusetone;
41  cpu_set_t cpuset;
42  size_t big = 2 * CHAR_BIT * sizeof(cpu_set_t);
43  size_t cpusetbigsize = CPU_ALLOC_SIZE(big);
44  cpu_set_t *cpusetbigone;
45  cpu_set_t *cpusetbig;
46
47  CPU_ZERO(&cpusetone);
48  CPU_SET(0, &cpusetone);
49
50  sc = rtems_task_create(
51    rtems_build_name('T', 'A', 'S', 'K'),
52    2,
53    RTEMS_MINIMUM_STACK_SIZE,
54    RTEMS_DEFAULT_MODES,
55    RTEMS_DEFAULT_ATTRIBUTES,
56    &task_id
57  );
58  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
59
60  sc = rtems_task_get_affinity(RTEMS_SELF, sizeof(cpuset), NULL);
61  rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
62
63  sc = rtems_task_set_affinity(RTEMS_SELF, sizeof(cpuset), NULL);
64  rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
65
66  sc = rtems_task_get_affinity(RTEMS_SELF, 0, &cpuset);
67  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
68
69  sc = rtems_task_set_affinity(RTEMS_SELF, 0, &cpuset);
70  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
71
72  sc = rtems_task_get_affinity(invalid_id, sizeof(cpuset), &cpuset);
73  rtems_test_assert(sc == RTEMS_INVALID_ID);
74
75  sc = rtems_task_set_affinity(invalid_id, sizeof(cpuset), &cpuset);
76  rtems_test_assert(sc == RTEMS_INVALID_ID);
77
78  sc = rtems_task_get_affinity(RTEMS_SELF, sizeof(cpuset), &cpuset);
79  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
80
81  rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
82
83  sc = rtems_task_set_affinity(RTEMS_SELF, sizeof(cpuset), &cpuset);
84  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
85
86  sc = rtems_task_set_affinity(self_id, sizeof(cpuset), &cpuset);
87  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
88
89  sc = rtems_task_set_affinity(task_id, sizeof(cpuset), &cpuset);
90  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
91
92  sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset);
93  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
94
95  rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
96
97  cpusetbigone = CPU_ALLOC(big);
98  rtems_test_assert(cpusetbigone != NULL);
99
100  cpusetbig = CPU_ALLOC(big);
101  rtems_test_assert(cpusetbig != NULL);
102
103  CPU_ZERO_S(cpusetbigsize, cpusetbigone);
104  CPU_SET_S(0, cpusetbigsize, cpusetbigone);
105
106  sc = rtems_task_get_affinity(task_id, cpusetbigsize, cpusetbig);
107  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
108
109  rtems_test_assert(CPU_EQUAL_S(cpusetbigsize, cpusetbig, cpusetbigone));
110
111  sc = rtems_task_set_affinity(task_id, cpusetbigsize, cpusetbig);
112  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
113
114  sc = rtems_task_delete(task_id);
115  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
116
117  CPU_FREE(cpusetbig);
118  CPU_FREE(cpusetbigone);
119#endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
120}
121
122static void task(rtems_task_argument arg)
123{
124  (void) arg;
125
126  rtems_test_assert(0);
127}
128
129static void test_task_get_set_scheduler(void)
130{
131  rtems_status_code sc;
132  rtems_id self_id = rtems_task_self();
133  rtems_name name = BLUE;
134  rtems_id scheduler_id;
135  rtems_id scheduler_by_name;
136  rtems_id task_id;
137
138  sc = rtems_scheduler_ident(name, &scheduler_by_name);
139  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
140
141  sc = rtems_task_get_scheduler(RTEMS_SELF, NULL);
142  rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
143
144  sc = rtems_task_get_scheduler(invalid_id, &scheduler_id);
145  rtems_test_assert(sc == RTEMS_INVALID_ID);
146
147  scheduler_id = 0;
148  sc = rtems_task_get_scheduler(RTEMS_SELF, &scheduler_id);
149  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
150
151  rtems_test_assert(scheduler_id == scheduler_by_name);
152
153  scheduler_id = 0;
154  sc = rtems_task_get_scheduler(self_id, &scheduler_id);
155  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
156
157  rtems_test_assert(scheduler_id == scheduler_by_name);
158
159  sc = rtems_task_set_scheduler(invalid_id, scheduler_id);
160  rtems_test_assert(sc == RTEMS_INVALID_ID);
161
162  sc = rtems_task_set_scheduler(self_id, invalid_id);
163  rtems_test_assert(sc == RTEMS_INVALID_ID);
164
165  sc = rtems_task_set_scheduler(self_id, scheduler_id);
166  rtems_test_assert(sc == RTEMS_INCORRECT_STATE);
167
168  sc = rtems_task_create(
169    rtems_build_name('T', 'A', 'S', 'K'),
170    2,
171    RTEMS_MINIMUM_STACK_SIZE,
172    RTEMS_DEFAULT_MODES,
173    RTEMS_DEFAULT_ATTRIBUTES,
174    &task_id
175  );
176  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
177
178  scheduler_id = 0;
179  sc = rtems_task_get_scheduler(task_id, &scheduler_id);
180  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
181
182  rtems_test_assert(scheduler_id == scheduler_by_name);
183
184  sc = rtems_task_set_scheduler(task_id, scheduler_id);
185  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
186
187  sc = rtems_task_start(task_id, task, 0);
188  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
189
190  sc = rtems_task_set_scheduler(task_id, scheduler_id);
191  rtems_test_assert(sc == RTEMS_INCORRECT_STATE);
192
193  sc = rtems_task_delete(task_id);
194  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
195}
196
197static void test_scheduler_ident(void)
198{
199  rtems_status_code sc;
200  rtems_id expected_id = rtems_build_id(7, 1, 1, 1);
201  rtems_id scheduler_id;
202  rtems_name name = BLUE;
203  rtems_name invalid_name = RED;
204
205  sc = rtems_scheduler_ident(name, NULL);
206  rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
207
208  sc = rtems_scheduler_ident(invalid_name, &scheduler_id);
209  rtems_test_assert(sc == RTEMS_INVALID_NAME);
210
211  scheduler_id = 0;
212  sc = rtems_scheduler_ident(name, &scheduler_id);
213  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
214
215  rtems_test_assert(scheduler_id == expected_id);
216}
217
218static void test_scheduler_get_processors(void)
219{
220#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
221  rtems_status_code sc;
222  rtems_name name = BLUE;
223  rtems_id scheduler_id;
224  cpu_set_t cpusetone;
225  cpu_set_t cpuset;
226  size_t big = 2 * CHAR_BIT * sizeof(cpu_set_t);
227  size_t cpusetbigsize = CPU_ALLOC_SIZE(big);
228  cpu_set_t *cpusetbigone;
229  cpu_set_t *cpusetbig;
230
231  CPU_ZERO(&cpusetone);
232  CPU_SET(0, &cpusetone);
233
234  sc = rtems_scheduler_ident(name, &scheduler_id);
235  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
236
237  sc = rtems_scheduler_get_processor_set(scheduler_id, sizeof(cpuset), NULL);
238  rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
239
240  sc = rtems_scheduler_get_processor_set(invalid_id, sizeof(cpuset), &cpuset);
241  rtems_test_assert(sc == RTEMS_INVALID_ID);
242
243  sc = rtems_scheduler_get_processor_set(scheduler_id, 0, &cpuset);
244  rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
245
246  sc = rtems_scheduler_get_processor_set(scheduler_id, sizeof(cpuset), &cpuset);
247  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
248
249  rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
250
251  cpusetbigone = CPU_ALLOC(big);
252  rtems_test_assert(cpusetbigone != NULL);
253
254  cpusetbig = CPU_ALLOC(big);
255  rtems_test_assert(cpusetbig != NULL);
256
257  CPU_ZERO_S(cpusetbigsize, cpusetbigone);
258  CPU_SET_S(0, cpusetbigsize, cpusetbigone);
259
260  sc = rtems_scheduler_get_processor_set(scheduler_id, cpusetbigsize, cpusetbig);
261  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
262
263  rtems_test_assert(CPU_EQUAL_S(cpusetbigsize, cpusetbig, cpusetbigone));
264
265  CPU_FREE(cpusetbig);
266  CPU_FREE(cpusetbigone);
267#endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
268}
269
270static void Init(rtems_task_argument arg)
271{
272  rtems_resource_snapshot snapshot;
273
274  TEST_BEGIN();
275
276  rtems_resource_snapshot_take(&snapshot);
277
278  test_task_get_set_affinity();
279  test_task_get_set_scheduler();
280  test_scheduler_ident();
281  test_scheduler_get_processors();
282
283  rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
284
285  TEST_END();
286  rtems_test_exit(0);
287}
288
289#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
290#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
291
292#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
293
294#define CONFIGURE_MAXIMUM_TASKS 2
295
296#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
297
298#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
299
300#define CONFIGURE_SCHEDULER_NAME BLUE
301
302#define CONFIGURE_INIT
303
304#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.