File indexing completed on 2025-05-11 08:24:44
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifdef HAVE_CONFIG_H
0029 #include "config.h"
0030 #endif
0031
0032 #include <inttypes.h>
0033 #include <string.h>
0034 #include <stdio.h>
0035
0036 #include <rtems.h>
0037 #include <rtems/libcsupport.h>
0038
0039 #include "tmacros.h"
0040
0041 const char rtems_test_name[] = "SMPSCHEDULER 4";
0042
0043 #define CPU_COUNT 32
0044
0045 #define PRIO_MIGRATION 2
0046
0047 #define PRIO_SCHEDULER 3
0048
0049 typedef struct {
0050 rtems_id migration_task;
0051 rtems_id scheduler_task;
0052 rtems_id scheduler_ids[CPU_COUNT];
0053 uint32_t migration_counter RTEMS_ALIGNED(CPU_CACHE_LINE_BYTES);
0054 uint32_t scheduler_counter RTEMS_ALIGNED(CPU_CACHE_LINE_BYTES);
0055 } test_context;
0056
0057 static test_context test_instance;
0058
0059 static void migration_task(rtems_task_argument arg)
0060 {
0061 test_context *ctx = (test_context *) arg;
0062 uint32_t cpu_count = rtems_scheduler_get_processor_maximum();
0063 uint32_t cpu_index = rtems_scheduler_get_processor();
0064
0065 while (true) {
0066 rtems_status_code sc;
0067
0068 cpu_index = (cpu_index + 1) % cpu_count;
0069
0070 sc = rtems_task_set_scheduler(
0071 RTEMS_SELF,
0072 ctx->scheduler_ids[cpu_index],
0073 PRIO_MIGRATION
0074 );
0075
0076 if (sc == RTEMS_UNSATISFIED) {
0077 continue;
0078 }
0079
0080 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0081 rtems_test_assert(cpu_index == rtems_scheduler_get_processor());
0082 ++ctx->migration_counter;
0083 }
0084 }
0085
0086 static void scheduler_task(rtems_task_argument arg)
0087 {
0088 test_context *ctx = (test_context *) arg;
0089 uint32_t cpu_count = rtems_scheduler_get_processor_maximum();
0090 uint32_t cpu_index = rtems_scheduler_get_processor();
0091
0092 while (true) {
0093 rtems_status_code sc;
0094
0095 cpu_index = (cpu_index - 1) % cpu_count;
0096
0097 if (cpu_index == 0) {
0098 cpu_index = 1;
0099 }
0100
0101 do {
0102 sc = rtems_scheduler_remove_processor(
0103 ctx->scheduler_ids[cpu_index],
0104 cpu_index
0105 );
0106 } while (sc == RTEMS_RESOURCE_IN_USE);
0107
0108 sc = rtems_scheduler_add_processor(
0109 ctx->scheduler_ids[cpu_index],
0110 cpu_index
0111 );
0112 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0113
0114 ++ctx->scheduler_counter;
0115 }
0116 }
0117
0118 static void test(test_context *ctx)
0119 {
0120 rtems_status_code sc;
0121 uint32_t i;
0122
0123 for (i = 0; i < rtems_scheduler_get_processor_maximum(); ++i) {
0124 sc = rtems_scheduler_ident(i, &ctx->scheduler_ids[i]);
0125 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0126 }
0127
0128 sc = rtems_task_create(
0129 rtems_build_name('M', 'I', 'G', 'R'),
0130 PRIO_MIGRATION,
0131 RTEMS_MINIMUM_STACK_SIZE,
0132 RTEMS_DEFAULT_MODES,
0133 RTEMS_DEFAULT_ATTRIBUTES,
0134 &ctx->migration_task
0135 );
0136 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0137
0138 sc = rtems_task_start(
0139 ctx->migration_task,
0140 migration_task,
0141 (rtems_task_argument) ctx
0142 );
0143 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0144
0145 sc = rtems_task_create(
0146 rtems_build_name('S', 'C', 'H', 'D'),
0147 PRIO_SCHEDULER,
0148 RTEMS_MINIMUM_STACK_SIZE,
0149 RTEMS_DEFAULT_MODES,
0150 RTEMS_DEFAULT_ATTRIBUTES,
0151 &ctx->scheduler_task
0152 );
0153 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0154
0155 sc = rtems_task_start(
0156 ctx->scheduler_task,
0157 scheduler_task,
0158 (rtems_task_argument) ctx
0159 );
0160 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0161
0162 sc = rtems_task_wake_after(10 * rtems_clock_get_ticks_per_second());
0163 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0164
0165 sc = rtems_task_delete(ctx->migration_task);
0166 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0167
0168 sc = rtems_task_delete(ctx->scheduler_task);
0169 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0170
0171 printf(
0172 "migration counter = %" PRIu32 "\n"
0173 "scheduler counter = %" PRIu32 "\n",
0174 ctx->migration_counter,
0175 ctx->scheduler_counter
0176 );
0177 }
0178
0179 static void Init(rtems_task_argument arg)
0180 {
0181 rtems_resource_snapshot snapshot;
0182
0183 TEST_BEGIN();
0184 rtems_resource_snapshot_take(&snapshot);
0185 test(&test_instance);
0186 rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
0187 TEST_END();
0188 rtems_test_exit(0);
0189 }
0190
0191 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0192 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0193
0194 #define CONFIGURE_MAXIMUM_TASKS 3
0195
0196 #define CONFIGURE_MAXIMUM_PROCESSORS CPU_COUNT
0197
0198 #define CONFIGURE_SCHEDULER_SIMPLE_SMP
0199
0200 #include <rtems/scheduler.h>
0201
0202 RTEMS_SCHEDULER_SIMPLE_SMP(0);
0203 RTEMS_SCHEDULER_SIMPLE_SMP(1);
0204 RTEMS_SCHEDULER_SIMPLE_SMP(2);
0205 RTEMS_SCHEDULER_SIMPLE_SMP(3);
0206 RTEMS_SCHEDULER_SIMPLE_SMP(4);
0207 RTEMS_SCHEDULER_SIMPLE_SMP(5);
0208 RTEMS_SCHEDULER_SIMPLE_SMP(6);
0209 RTEMS_SCHEDULER_SIMPLE_SMP(7);
0210 RTEMS_SCHEDULER_SIMPLE_SMP(8);
0211 RTEMS_SCHEDULER_SIMPLE_SMP(9);
0212 RTEMS_SCHEDULER_SIMPLE_SMP(10);
0213 RTEMS_SCHEDULER_SIMPLE_SMP(11);
0214 RTEMS_SCHEDULER_SIMPLE_SMP(12);
0215 RTEMS_SCHEDULER_SIMPLE_SMP(13);
0216 RTEMS_SCHEDULER_SIMPLE_SMP(14);
0217 RTEMS_SCHEDULER_SIMPLE_SMP(15);
0218 RTEMS_SCHEDULER_SIMPLE_SMP(16);
0219 RTEMS_SCHEDULER_SIMPLE_SMP(17);
0220 RTEMS_SCHEDULER_SIMPLE_SMP(18);
0221 RTEMS_SCHEDULER_SIMPLE_SMP(19);
0222 RTEMS_SCHEDULER_SIMPLE_SMP(20);
0223 RTEMS_SCHEDULER_SIMPLE_SMP(21);
0224 RTEMS_SCHEDULER_SIMPLE_SMP(22);
0225 RTEMS_SCHEDULER_SIMPLE_SMP(23);
0226 RTEMS_SCHEDULER_SIMPLE_SMP(24);
0227 RTEMS_SCHEDULER_SIMPLE_SMP(25);
0228 RTEMS_SCHEDULER_SIMPLE_SMP(26);
0229 RTEMS_SCHEDULER_SIMPLE_SMP(27);
0230 RTEMS_SCHEDULER_SIMPLE_SMP(28);
0231 RTEMS_SCHEDULER_SIMPLE_SMP(29);
0232 RTEMS_SCHEDULER_SIMPLE_SMP(30);
0233 RTEMS_SCHEDULER_SIMPLE_SMP(31);
0234
0235 #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
0236 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(0, 0), \
0237 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(1, 1), \
0238 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(2, 2), \
0239 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(3, 3), \
0240 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(4, 4), \
0241 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(5, 5), \
0242 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(6, 6), \
0243 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(7, 7), \
0244 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(8, 8), \
0245 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(9, 9), \
0246 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(10, 10), \
0247 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(11, 11), \
0248 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(12, 12), \
0249 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(13, 13), \
0250 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(14, 14), \
0251 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(15, 15), \
0252 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(16, 16), \
0253 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(17, 17), \
0254 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(18, 18), \
0255 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(19, 19), \
0256 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(20, 20), \
0257 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(21, 21), \
0258 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(22, 22), \
0259 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(23, 23), \
0260 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(24, 24), \
0261 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(25, 25), \
0262 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(26, 26), \
0263 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(27, 27), \
0264 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(28, 28), \
0265 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(29, 29), \
0266 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(30, 30), \
0267 RTEMS_SCHEDULER_TABLE_SIMPLE_SMP(31, 31)
0268
0269 #define CONFIGURE_SCHEDULER_ASSIGNMENTS \
0270 RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \
0271 RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0272 RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0273 RTEMS_SCHEDULER_ASSIGN(3, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0274 RTEMS_SCHEDULER_ASSIGN(4, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0275 RTEMS_SCHEDULER_ASSIGN(5, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0276 RTEMS_SCHEDULER_ASSIGN(6, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0277 RTEMS_SCHEDULER_ASSIGN(7, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0278 RTEMS_SCHEDULER_ASSIGN(8, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0279 RTEMS_SCHEDULER_ASSIGN(9, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0280 RTEMS_SCHEDULER_ASSIGN(10, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0281 RTEMS_SCHEDULER_ASSIGN(11, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0282 RTEMS_SCHEDULER_ASSIGN(12, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0283 RTEMS_SCHEDULER_ASSIGN(13, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0284 RTEMS_SCHEDULER_ASSIGN(14, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0285 RTEMS_SCHEDULER_ASSIGN(15, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0286 RTEMS_SCHEDULER_ASSIGN(16, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0287 RTEMS_SCHEDULER_ASSIGN(17, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0288 RTEMS_SCHEDULER_ASSIGN(18, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0289 RTEMS_SCHEDULER_ASSIGN(19, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0290 RTEMS_SCHEDULER_ASSIGN(20, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0291 RTEMS_SCHEDULER_ASSIGN(21, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0292 RTEMS_SCHEDULER_ASSIGN(22, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0293 RTEMS_SCHEDULER_ASSIGN(23, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0294 RTEMS_SCHEDULER_ASSIGN(24, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0295 RTEMS_SCHEDULER_ASSIGN(25, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0296 RTEMS_SCHEDULER_ASSIGN(26, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0297 RTEMS_SCHEDULER_ASSIGN(27, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0298 RTEMS_SCHEDULER_ASSIGN(28, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0299 RTEMS_SCHEDULER_ASSIGN(29, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0300 RTEMS_SCHEDULER_ASSIGN(30, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0301 RTEMS_SCHEDULER_ASSIGN(31, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL)
0302
0303 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0304
0305 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0306
0307 #define CONFIGURE_INIT
0308
0309 #include <rtems/confdefs.h>