[PATCH 2/7] rtems: Add rtems_scheduler_ident_by_processor_set
Gedare Bloom
gedare at rtems.org
Tue Jul 11 14:59:34 UTC 2017
On Tue, Jul 11, 2017 at 9:41 AM, Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
> Update #3070.
> ---
> cpukit/rtems/Makefile.am | 1 +
> cpukit/rtems/include/rtems/rtems/tasks.h | 25 +++++++++++
> cpukit/rtems/src/scheduleridentbyprocessorset.c | 60 +++++++++++++++++++++++++
> testsuites/smptests/smpscheduler02/init.c | 11 +++++
> testsuites/sptests/spscheduler01/init.c | 19 ++++++++
> 5 files changed, 116 insertions(+)
> create mode 100644 cpukit/rtems/src/scheduleridentbyprocessorset.c
>
> diff --git a/cpukit/rtems/Makefile.am b/cpukit/rtems/Makefile.am
> index e9ad2deb5d..da6e302e2e 100644
> --- a/cpukit/rtems/Makefile.am
> +++ b/cpukit/rtems/Makefile.am
> @@ -109,6 +109,7 @@ librtems_a_SOURCES += src/scheduleraddprocessor.c
> librtems_a_SOURCES += src/schedulergetprocessorset.c
> librtems_a_SOURCES += src/schedulerident.c
> librtems_a_SOURCES += src/scheduleridentbyprocessor.c
> +librtems_a_SOURCES += src/scheduleridentbyprocessorset.c
> librtems_a_SOURCES += src/schedulerremoveprocessor.c
>
> ## RATEMON_C_FILES
> diff --git a/cpukit/rtems/include/rtems/rtems/tasks.h b/cpukit/rtems/include/rtems/rtems/tasks.h
> index e68c78989d..585f4c449c 100644
> --- a/cpukit/rtems/include/rtems/rtems/tasks.h
> +++ b/cpukit/rtems/include/rtems/rtems/tasks.h
> @@ -577,6 +577,31 @@ rtems_status_code rtems_scheduler_ident_by_processor(
> );
>
> /**
> + * @brief Identifies a scheduler by a processor set.
> + *
> + * The scheduler is selected according to the highest numbered online processor
> + * in the specified processor set.
> + *
> + * @param[in] cpusetsize Size of the specified processor set buffer in
> + * bytes. This value must be positive.
> + * @param[out] cpuset The processor set to identify the scheduler.
> + * @param[out] id The scheduler identifier associated with the processor set.
> + *
> + * @retval RTEMS_SUCCESSFUL Successful operation.
> + * @retval RTEMS_INVALID_ADDRESS The @a id parameter is @c NULL.
> + * @retval RTEMS_INVALID_SIZE Invalid processor set size.
> + * @retval RTEMS_INVALID_NAME The processor set contains no online processor.
> + * @retval RTEMS_INCORRECT_STATE The processor set is valid, however, the
> + * highest numbered online processor in the specified processor set is not
> + * owned by a scheduler.
> + */
> +rtems_status_code rtems_scheduler_ident_by_processor_set(
> + size_t cpusetsize,
> + const cpu_set_t *cpuset,
> + rtems_id *id
> +);
> +
Also needs doc. I wonder if "identify" or "id" may be better. "ident"
seems a bit unusual.
> +/**
> * @brief Gets the set of processors owned by the specified scheduler instance.
> *
> * @param[in] scheduler_id Identifier of the scheduler instance.
> diff --git a/cpukit/rtems/src/scheduleridentbyprocessorset.c b/cpukit/rtems/src/scheduleridentbyprocessorset.c
> new file mode 100644
> index 0000000000..4988ed0fb8
> --- /dev/null
> +++ b/cpukit/rtems/src/scheduleridentbyprocessorset.c
> @@ -0,0 +1,60 @@
> +/*
> + * Copyright (c) 2017 embedded brains GmbH. All rights reserved.
> + *
> + * embedded brains GmbH
> + * Dornierstr. 4
> + * 82178 Puchheim
> + * Germany
> + * <rtems at embedded-brains.de>
> + *
> + * 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.
> + */
> +
> +#if HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +
> +#include <rtems/rtems/tasks.h>
> +#include <rtems/score/assert.h>
> +#include <rtems/score/schedulerimpl.h>
> +
> +rtems_status_code rtems_scheduler_ident_by_processor_set(
> + size_t cpusetsize,
> + const cpu_set_t *cpuset,
> + rtems_id *id
> +)
> +{
> + Processor_mask set;
> + Processor_mask_Copy_status status;
> + uint32_t cpu_index;
> + const Scheduler_Control *scheduler;
> +
> + if ( id == NULL ) {
> + return RTEMS_INVALID_ADDRESS;
> + }
> +
> + status = _Processor_mask_From_cpu_set_t( &set, cpusetsize, cpuset );
> + if ( status == PROCESSOR_MASK_COPY_INVALID_SIZE ) {
> + return RTEMS_INVALID_SIZE;
> + }
> +
> + _Processor_mask_And( &set, &set, _SMP_Get_online_processors() );
> + cpu_index = _Processor_mask_Find_last_set( &set );
> + if ( cpu_index == 0 ) {
> + return RTEMS_INVALID_NAME;
> + }
> +
> + scheduler = _Scheduler_Get_by_CPU( _Per_CPU_Get_by_index( cpu_index - 1) );
> +#if defined(RTEMS_SMP)
> + if ( scheduler == NULL ) {
> + return RTEMS_INCORRECT_STATE;
> + }
> +#else
> + _Assert( scheduler != NULL );
> +#endif
> +
> + *id = _Scheduler_Build_id( _Scheduler_Get_index( scheduler ) );
> + return RTEMS_SUCCESSFUL;
> +}
> diff --git a/testsuites/smptests/smpscheduler02/init.c b/testsuites/smptests/smpscheduler02/init.c
> index 7dd60ec4c5..3975802d4a 100644
> --- a/testsuites/smptests/smpscheduler02/init.c
> +++ b/testsuites/smptests/smpscheduler02/init.c
> @@ -134,8 +134,10 @@ static void test_scheduler_add_remove_processors(void)
> rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE);
>
> if (rtems_get_processor_count() > 1) {
> + rtems_id scheduler_id;
> rtems_id scheduler_b_id;
> rtems_id task_id;
> + cpu_set_t first_cpu;
>
> sc = rtems_scheduler_ident(SCHED_B, &scheduler_b_id);
> rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> @@ -153,6 +155,15 @@ static void test_scheduler_add_remove_processors(void)
>
> rtems_test_assert(rtems_get_current_processor() == 1);
>
> + CPU_ZERO(&first_cpu);
> + CPU_SET(0, &first_cpu);
> + sc = rtems_scheduler_ident_by_processor_set(
> + sizeof(first_cpu),
> + &first_cpu,
> + &scheduler_id
> + );
> + rtems_test_assert(sc == RTEMS_INCORRECT_STATE);
> +
> sc = rtems_scheduler_add_processor(scheduler_a_id, 0);
> rtems_test_assert(sc == RTEMS_SUCCESSFUL);
>
> diff --git a/testsuites/sptests/spscheduler01/init.c b/testsuites/sptests/spscheduler01/init.c
> index 2415ace803..9840a3ebc4 100644
> --- a/testsuites/sptests/spscheduler01/init.c
> +++ b/testsuites/sptests/spscheduler01/init.c
> @@ -343,6 +343,7 @@ static void test_scheduler_ident(void)
> rtems_id scheduler_id;
> rtems_name name = BLUE;
> rtems_name invalid_name = RED;
> + cpu_set_t s;
>
> sc = rtems_scheduler_ident(name, NULL);
> rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
> @@ -367,6 +368,24 @@ static void test_scheduler_ident(void)
> rtems_test_assert(sc == RTEMS_SUCCESSFUL);
>
> rtems_test_assert(scheduler_id == expected_id);
> +
> + CPU_ZERO(&s);
> + CPU_SET(1, &s);
> + sc = rtems_scheduler_ident_by_processor_set(sizeof(s), &s, NULL);
> + rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
> +
> + sc = rtems_scheduler_ident_by_processor_set(1, &s, &scheduler_id);
> + rtems_test_assert(sc == RTEMS_INVALID_SIZE);
> +
> + sc = rtems_scheduler_ident_by_processor_set(sizeof(s), &s, &scheduler_id);
> + rtems_test_assert(sc == RTEMS_INVALID_NAME);
> +
> + CPU_SET(0, &s);
> + scheduler_id = 0;
> + sc = rtems_scheduler_ident_by_processor_set(sizeof(s), &s, &scheduler_id);
> + rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> +
> + rtems_test_assert(scheduler_id == expected_id);
> }
>
> static void test_scheduler_get_processors(void)
> --
> 2.12.3
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list