From 2ef0328958488ab47c31c7af4a2e87f9729f700c Mon Sep 17 00:00:00 2001 From: Jennifer Averett Date: Wed, 26 Feb 2014 09:57:16 -0600 Subject: smptests: Add smppsxaffinity02. This method exercises the ability to dynamically get and set the affinity of POSIX threads. NOTE: There is no scheduler support for affinity. This is simply a data integrity test. --- testsuites/smptests/Makefile.am | 1 + testsuites/smptests/configure.ac | 1 + testsuites/smptests/smppsxaffinity02/Makefile.am | 19 ++ testsuites/smptests/smppsxaffinity02/init.c | 240 +++++++++++++++++++++ .../smptests/smppsxaffinity02/smppsxaffinity02.doc | 26 +++ .../smptests/smppsxaffinity02/smppsxaffinity02.scn | 17 ++ 6 files changed, 304 insertions(+) create mode 100644 testsuites/smptests/smppsxaffinity02/Makefile.am create mode 100644 testsuites/smptests/smppsxaffinity02/init.c create mode 100644 testsuites/smptests/smppsxaffinity02/smppsxaffinity02.doc create mode 100644 testsuites/smptests/smppsxaffinity02/smppsxaffinity02.scn diff --git a/testsuites/smptests/Makefile.am b/testsuites/smptests/Makefile.am index 9b4c02d88c..ca99c1e83e 100644 --- a/testsuites/smptests/Makefile.am +++ b/testsuites/smptests/Makefile.am @@ -23,6 +23,7 @@ SUBDIRS += smpswitchextension01 SUBDIRS += smpunsupported01 if HAS_POSIX SUBDIRS += smppsxaffinity01 +SUBDIRS += smppsxaffinity02 SUBDIRS += smppsxsignal01 endif endif diff --git a/testsuites/smptests/configure.ac b/testsuites/smptests/configure.ac index a447f38bbe..a2e99ebd8b 100644 --- a/testsuites/smptests/configure.ac +++ b/testsuites/smptests/configure.ac @@ -72,6 +72,7 @@ smpfatal03/Makefile smplock01/Makefile smpmigration01/Makefile smppsxaffinity01/Makefile +smppsxaffinity02/Makefile smppsxsignal01/Makefile smpschedule01/Makefile smpsignal01/Makefile diff --git a/testsuites/smptests/smppsxaffinity02/Makefile.am b/testsuites/smptests/smppsxaffinity02/Makefile.am new file mode 100644 index 0000000000..c7c160e73f --- /dev/null +++ b/testsuites/smptests/smppsxaffinity02/Makefile.am @@ -0,0 +1,19 @@ +rtems_tests_PROGRAMS = smppsxaffinity02 +smppsxaffinity02_SOURCES = init.c + +dist_rtems_tests_DATA = smppsxaffinity02.scn smppsxaffinity02.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 = $(smppsxaffinity02_OBJECTS) +LINK_LIBS = $(smppsxaffinity02_LDLIBS) + +smppsxaffinity02$(EXEEXT): $(smppsxaffinity02_OBJECTS) $(smppsxaffinity02_DEPENDENCIES) + @rm -f smppsxaffinity02$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/smptests/smppsxaffinity02/init.c b/testsuites/smptests/smppsxaffinity02/init.c new file mode 100644 index 0000000000..03723e14eb --- /dev/null +++ b/testsuites/smptests/smppsxaffinity02/init.c @@ -0,0 +1,240 @@ +/* + * COPYRIGHT (c) 1989-2011. + * 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.com/license/LICENSE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define NUM_CPUS 4 + +#define _GNU_SOURCE + +#include +#include +#include +#include + +#if HAVE_DECL_PTHREAD_GETAFFINITY_NP + +pthread_t Init_id; +pthread_t Med_id[NUM_CPUS-1]; +pthread_t Low_id[NUM_CPUS]; + +/* forward declarations to avoid warnings */ +void *POSIX_Init(void *argument); +void Validate_setaffinity_errors(void); +void Validate_getaffinity_errors(void); +void Validate_affinity(void); +void *Thread_1(void *unused); + +void *Thread_1(void *unused) +{ + while(1); +} + +void Validate_setaffinity_errors(void) +{ + int sc; + cpu_set_t cpuset; + + /* Verify pthread_setaffinity_np checks that all cpu's exist. */ + CPU_FILL(&cpuset); + puts( "Init - pthread_setaffinity_np - Invalid cpu - EINVAL" ); + sc = pthread_setaffinity_np( Init_id, sizeof(cpu_set_t), &cpuset ); + rtems_test_assert( sc == EINVAL ); + + /* Verify pthread_setaffinity_np checks that at least one cpu is set */ + CPU_ZERO(&cpuset); + puts( "Init - pthread_setaffinity_np - no cpu - EINVAL" ); + sc = pthread_setaffinity_np( Init_id, sizeof(cpu_set_t), &cpuset ); + rtems_test_assert( sc == EINVAL ); + + /* Verify pthread_setaffinity_np checks that at thread id is valid */ + CPU_SET(0, &cpuset); + puts( "Init - pthread_setaffinity_np - Invalid thread - ESRCH" ); + sc = pthread_setaffinity_np( 999, sizeof(cpu_set_t), &cpuset ); + rtems_test_assert( sc == ESRCH ); + + /* Verify pthread_setaffinity_np validates cpusetsize */ + puts( "Init - pthread_setaffinity_np - Invalid cpusetsize - EINVAL" ); + sc = pthread_setaffinity_np( Init_id, sizeof(cpu_set_t) * 2, &cpuset ); + rtems_test_assert( sc == EINVAL ); + + /* Verify pthread_setaffinity_np validates cpuset */ + puts( "Init - pthread_setaffinity_np - Invalid cpuset - EFAULT" ); + sc = pthread_setaffinity_np( Init_id, sizeof(cpu_set_t), NULL ); + rtems_test_assert( sc == EFAULT ); +} + +void Validate_getaffinity_errors(void) +{ + int sc; + cpu_set_t cpuset; + + /* Verify pthread_getaffinity_np checks that at thread id is valid */ + CPU_SET(0, &cpuset); + puts( "Init - pthread_getaffinity_np - Invalid thread - ESRCH" ); + sc = pthread_getaffinity_np( 999, sizeof(cpu_set_t), &cpuset ); + rtems_test_assert( sc == ESRCH ); + + /* Verify pthread_getaffinity_np validates cpusetsize */ + puts( "Init - pthread_getaffinity_np - Invalid cpusetsize - EINVAL" ); + sc = pthread_getaffinity_np( Init_id, sizeof(cpu_set_t) * 2, &cpuset ); + rtems_test_assert( sc == EINVAL ); + + /* Verify pthread_getaffinity_np validates cpuset */ + puts("Init - pthread_getaffinity_np - Invalid cpuset - EFAULT"); + sc = pthread_getaffinity_np( Init_id, sizeof(cpu_set_t), NULL ); + rtems_test_assert( sc == EFAULT ); +} + +void Validate_affinity(void ) +{ + pthread_attr_t attr; + cpu_set_t cpuset0; + cpu_set_t cpuset1; + cpu_set_t cpuset2; + uint32_t i; + int sc; + int cpu_count; + struct sched_param param; + + + puts( "Init - Set Init priority to high"); + sc = pthread_getattr_np( Init_id, &attr ); + rtems_test_assert( sc == 0 ); + sc = pthread_attr_getschedparam( &attr, ¶m ); + rtems_test_assert( sc == 0 ); + param.sched_priority = sched_get_priority_max( SCHED_FIFO ); + sc = pthread_setschedparam( Init_id, SCHED_FIFO, ¶m ); + rtems_test_assert( !sc ); + + sc = pthread_getaffinity_np( Init_id, sizeof(cpu_set_t), &cpuset0 ); + rtems_test_assert( !sc ); + + /* Get the number of processors that we are using. */ + cpu_count = rtems_smp_get_processor_count(); + + /* Fill the remaining cpus with med priority tasks */ + puts( "Init - Create Medium priority tasks"); + for (i=0; i<(cpu_count-1); i++){ + sc = pthread_create( &Med_id[i], &attr, Thread_1, NULL ); + rtems_test_assert( !sc ); + } + + puts( "Init - Verify Medium priority tasks"); + for (i=0; i<(cpu_count-1); i++){ + sc = pthread_getaffinity_np( Med_id[i], sizeof(cpu_set_t), &cpuset2 ); + rtems_test_assert( !sc ); + rtems_test_assert( CPU_EQUAL(&cpuset0, &cpuset2) ); + } + + /* + * Create low priority thread for each remaining cpu with the affinity + * set to only run on one cpu. + */ + puts( "Init - Create Low priority tasks"); + for (i=0; i + +/* global variables */ diff --git a/testsuites/smptests/smppsxaffinity02/smppsxaffinity02.doc b/testsuites/smptests/smppsxaffinity02/smppsxaffinity02.doc new file mode 100644 index 0000000000..ca735fca5d --- /dev/null +++ b/testsuites/smptests/smppsxaffinity02/smppsxaffinity02.doc @@ -0,0 +1,26 @@ +# COPYRIGHT (c) 1989-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.com/license/LICENSE. +# + +directives: + +This file describes the directives and concepts tested by this test set. + +test set name: psxpsxaffinity02 + +directives: + + pthread_getaffinity_np + pthread_setaffinity_np + +concepts: + ++ Verify error conditions and functionality of pthread_getaffinity_np + ++ Verify error conditions and functionality of pthread_setaffinity_np + +Note: This does not test scheduling. diff --git a/testsuites/smptests/smppsxaffinity02/smppsxaffinity02.scn b/testsuites/smptests/smppsxaffinity02/smppsxaffinity02.scn new file mode 100644 index 0000000000..7f3d3f9597 --- /dev/null +++ b/testsuites/smptests/smppsxaffinity02/smppsxaffinity02.scn @@ -0,0 +1,17 @@ +*** SMP POSIX AFFINITY ATTRIBUTE TEST 2 *** +Init - pthread_setaffinity_np - Invalid cpu - EINVAL +Init - pthread_setaffinity_np - no cpu - EINVAL +Init - pthread_setaffinity_np - Invalid thread - ESRCH +Init - pthread_setaffinity_np - Invalid cpusetsize - EINVAL +Init - pthread_setaffinity_np - Invalid cpuset - EFAULT +Init - pthread_getaffinity_np - Invalid thread - ESRCH +Init - pthread_getaffinity_np - Invalid cpusetsize - EINVAL +Init - pthread_getaffinity_np - Invalid cpuset - EFAULT +Init - Set Init priority to high +Init - Create Medium priority tasks +Init - Verify Medium priority tasks +Init - Create Low priority tasks +Init - Verify Medium priority tasks +Init - Change affinity on Low priority tasks +Init - Validate affinity on Low priority tasks +*** SMP POSIX AFFINITY ATTRIBUTE TEST 2 *** -- cgit v1.2.3