From 61d26f939d88a481f15dd017c68da524e92b50fa Mon Sep 17 00:00:00 2001 From: Jennifer Averett Date: Thu, 10 Jul 2014 11:36:40 -0500 Subject: smpschedaffinity04: New test. This test walks a secondary high prority task across all the cores. --- testsuites/smptests/Makefile.am | 1 + testsuites/smptests/configure.ac | 1 + testsuites/smptests/smpschedaffinity04/Makefile.am | 19 +++ testsuites/smptests/smpschedaffinity04/init.c | 184 +++++++++++++++++++++ .../smpschedaffinity04/smpschedaffinity04.doc | 11 ++ .../smpschedaffinity04/smpschedaffinity04.scn | 13 ++ 6 files changed, 229 insertions(+) create mode 100644 testsuites/smptests/smpschedaffinity04/Makefile.am create mode 100644 testsuites/smptests/smpschedaffinity04/init.c create mode 100644 testsuites/smptests/smpschedaffinity04/smpschedaffinity04.doc create mode 100644 testsuites/smptests/smpschedaffinity04/smpschedaffinity04.scn diff --git a/testsuites/smptests/Makefile.am b/testsuites/smptests/Makefile.am index 961ef553da..e025dab892 100644 --- a/testsuites/smptests/Makefile.am +++ b/testsuites/smptests/Makefile.am @@ -26,6 +26,7 @@ SUBDIRS += smpmrsp01 SUBDIRS += smpschedaffinity01 SUBDIRS += smpschedaffinity02 SUBDIRS += smpschedaffinity03 +SUBDIRS += smpschedaffinity04 SUBDIRS += smpscheduler01 SUBDIRS += smpscheduler02 SUBDIRS += smpscheduler03 diff --git a/testsuites/smptests/configure.ac b/testsuites/smptests/configure.ac index 4c216463ed..cb8ac655a9 100644 --- a/testsuites/smptests/configure.ac +++ b/testsuites/smptests/configure.ac @@ -84,6 +84,7 @@ smppsxsignal01/Makefile smpschedaffinity01/Makefile smpschedaffinity02/Makefile smpschedaffinity03/Makefile +smpschedaffinity04/Makefile smpscheduler01/Makefile smpscheduler02/Makefile smpscheduler03/Makefile diff --git a/testsuites/smptests/smpschedaffinity04/Makefile.am b/testsuites/smptests/smpschedaffinity04/Makefile.am new file mode 100644 index 0000000000..d75216c8dd --- /dev/null +++ b/testsuites/smptests/smpschedaffinity04/Makefile.am @@ -0,0 +1,19 @@ +rtems_tests_PROGRAMS = smpschedaffinity04 +smpschedaffinity04_SOURCES = init.c + +dist_rtems_tests_DATA = smpschedaffinity04.scn smpschedaffinity04.doc + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../automake/compile.am +include $(top_srcdir)/../automake/leaf.am + +AM_CPPFLAGS += -I$(top_srcdir)/../support/include + +LINK_OBJS = $(smpschedaffinity04_OBJECTS) +LINK_LIBS = $(smpschedaffinity04_LDLIBS) + +smpschedaffinity04$(EXEEXT): $(smpschedaffinity04_OBJECTS) $(smpschedaffinity04_DEPENDENCIES) + @rm -f smpschedaffinity04$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/smptests/smpschedaffinity04/init.c b/testsuites/smptests/smpschedaffinity04/init.c new file mode 100644 index 0000000000..bdfc56c1a9 --- /dev/null +++ b/testsuites/smptests/smpschedaffinity04/init.c @@ -0,0 +1,184 @@ +/* + * COPYRIGHT (c) 2014. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +/* + * Use the Init task to walk the higher priority TA1 across all the cores. + */ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include + +#include "tmacros.h" + +const char rtems_test_name[] = "SMPSCHEDAFFINITY 4"; + +#define NUM_CPUS 4 +#define TASK_COUNT 2 + +struct task_data_t { + rtems_id id; + int expected_cpu; + bool ran; + int actual_cpu; +}; + +struct task_data_t task_data = { + 0x0, 2, false, 0xff +}; + +rtems_id task_sem; + +static void task(rtems_task_argument arg); + +static void test_delay(int ticks) +{ + rtems_interval start, stop; + start = rtems_clock_get_ticks_since_boot(); + do { + stop = rtems_clock_get_ticks_since_boot(); + } while ( (stop - start) < ticks ); +} + +/* + * Task that continually sets the cpu and + * run indicators without blocking. + */ +static void task(rtems_task_argument arg) +{ + rtems_status_code sc; + + while (true) { + sc = rtems_semaphore_obtain (task_sem, RTEMS_NO_WAIT, 0); + if (sc == RTEMS_SUCCESSFUL) { + task_data.ran = true; + task_data.actual_cpu = rtems_get_current_processor(); + rtems_semaphore_release(task_sem); + } + } +} + +static void test(void) +{ + rtems_status_code sc; + uint32_t cpu_count; + int cpu; + int i; + cpu_set_t cpuset; + + /* Get the number of processors that we are using. */ + cpu_count = rtems_get_processor_count(); + if (cpu_count < 2) { + printf("Error: Test requires at least 2 cpus\n"); + return; + } + + printf("Create Semaphore\n"); + sc = rtems_semaphore_create( + rtems_build_name('S', 'E', 'M', '0'), + 1, /* initial count = 1 */ + RTEMS_LOCAL | + RTEMS_SIMPLE_BINARY_SEMAPHORE | + RTEMS_NO_INHERIT_PRIORITY | + RTEMS_NO_PRIORITY_CEILING | + RTEMS_FIFO, + 0, + &task_sem + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + /* + * Create and start TA1 at a higher priority + * than the init task. + */ + sc = rtems_task_create( + rtems_build_name('T', 'A', '0', '1'), + 4, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &task_data.id + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + printf("Start TA1\n"); + sc = rtems_task_start( task_data.id, task, 0 ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + /* + * Verify the Init task is running on the max core. + */ + printf("Verify Init task is on cpu %ld\n",cpu_count-1); + cpu = rtems_get_current_processor(); + rtems_test_assert(cpu == (cpu_count-1)); + + /* Walk TA1 across all of the cores */ + for(i=0; i < cpu_count; i++) { + /* Set the Affinity to core i */ + CPU_ZERO(&cpuset); + CPU_SET(i, &cpuset); + printf("Set Affinity TA1 to cpu %d\n", i); + sc = rtems_task_set_affinity( task_data.id, sizeof(cpuset), &cpuset ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + /* Wait a bit to be sure it has switched cores then clear the task data */ + test_delay(50); + while( rtems_semaphore_obtain (task_sem, RTEMS_NO_WAIT, 0) != RTEMS_SUCCESSFUL ); + task_data.ran = false; + task_data.expected_cpu = i; + rtems_semaphore_release(task_sem); + test_delay(50); + + /* Verify the task ran on core i */ + while( rtems_semaphore_obtain (task_sem, RTEMS_NO_WAIT, 0) != RTEMS_SUCCESSFUL ); + if (task_data.ran != true) + printf("Error: TA01 never ran.\n"); + else + printf( + "TA1 expected cpu: %d actual cpu %d\n", + task_data.expected_cpu, + task_data.actual_cpu + ); + rtems_test_assert(task_data.ran == true); + rtems_test_assert(task_data.expected_cpu == task_data.actual_cpu); + rtems_semaphore_release(task_sem); + } +} + +static void Init(rtems_task_argument arg) +{ + TEST_BEGIN(); + + test(); + + TEST_END(); + rtems_test_exit(0); +} + +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER + +#define CONFIGURE_SMP_APPLICATION + +#define CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP + +#define CONFIGURE_SMP_MAXIMUM_PROCESSORS NUM_CPUS + +#define CONFIGURE_MAXIMUM_TASKS TASK_COUNT + +#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION + +#define CONFIGURE_INIT_TASK_PRIORITY 8 +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_INIT + +#include diff --git a/testsuites/smptests/smpschedaffinity04/smpschedaffinity04.doc b/testsuites/smptests/smpschedaffinity04/smpschedaffinity04.doc new file mode 100644 index 0000000000..27cf029f3a --- /dev/null +++ b/testsuites/smptests/smpschedaffinity04/smpschedaffinity04.doc @@ -0,0 +1,11 @@ +This file describes the directives and concepts tested by this test set. + +test set name: smpschedaffinity04 + +directives: + + - _Scheduler_priority_affinity_xxx + +concepts: + + - Use the Init task to walk the higher priority TA1 across all the cores. diff --git a/testsuites/smptests/smpschedaffinity04/smpschedaffinity04.scn b/testsuites/smptests/smpschedaffinity04/smpschedaffinity04.scn new file mode 100644 index 0000000000..8d4c7d3a89 --- /dev/null +++ b/testsuites/smptests/smpschedaffinity04/smpschedaffinity04.scn @@ -0,0 +1,13 @@ +*** BEGIN OF TEST SMPSCHEDAFFINITY 4 *** +Create Semaphore +Start TA1 +Verify Init task is on cpu 3 +Set Affinity TA1 to cpu 0 +TA1 expected cpu: 0 actual cpu 0 +Set Affinity TA1 to cpu 1 +TA1 expected cpu: 1 actual cpu 1 +Set Affinity TA1 to cpu 2 +TA1 expected cpu: 2 actual cpu 2 +Set Affinity TA1 to cpu 3 +TA1 expected cpu: 3 actual cpu 3 +*** END OF TEST SMPSCHEDAFFINITY 4 *** -- cgit v1.2.3