[PATCH 3/7] Create one interrupt server per processor
Gedare Bloom
gedare at rtems.org
Tue Jul 11 15:06:53 UTC 2017
There should probably be a ticket for this change.
Is there a reason someone might have to not want one server per core
when using SMP? That is, should this be configurable?
On Tue, Jul 11, 2017 at 9:41 AM, Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
> This allows load balancing of interrupt processing in SMP
> configurations.
> ---
> c/src/lib/libbsp/shared/src/irq-server.c | 263 +++++++++++++++++++++----------
> cpukit/include/rtems/irq-extension.h | 129 ++++++++-------
> 2 files changed, 254 insertions(+), 138 deletions(-)
>
> diff --git a/c/src/lib/libbsp/shared/src/irq-server.c b/c/src/lib/libbsp/shared/src/irq-server.c
> index 1f9b75ffd9..a37c9caafc 100644
> --- a/c/src/lib/libbsp/shared/src/irq-server.c
> +++ b/c/src/lib/libbsp/shared/src/irq-server.c
> @@ -30,47 +30,70 @@
>
> #define BSP_INTERRUPT_SERVER_MANAGEMENT_VECTOR (BSP_INTERRUPT_VECTOR_MAX + 1)
>
> -RTEMS_INTERRUPT_LOCK_DEFINE(
> - static,
> - bsp_interrupt_server_lock,
> - "Interrupt Server"
> +typedef struct {
> + RTEMS_INTERRUPT_LOCK_MEMBER(lock);
> + rtems_chain_control entries;
> + rtems_id server;
> + unsigned errors;
> +} bsp_interrupt_server_context;
> +
> +#if defined(RTEMS_SMP)
> +static bsp_interrupt_server_context *bsp_interrupt_server_instances;
> +#else
> +static bsp_interrupt_server_context bsp_interrupt_server_instance;
> +#endif
> +
> +static bsp_interrupt_server_context *bsp_interrupt_server_get_context(
> + uint32_t server_index,
> + rtems_status_code *sc
> )
> -
> -static rtems_id bsp_interrupt_server_id = RTEMS_ID_NONE;
> -
> -static RTEMS_CHAIN_DEFINE_EMPTY(bsp_interrupt_server_chain);
> -
> -static rtems_status_code bsp_interrupt_server_is_initialized(void)
> {
> - if (bsp_interrupt_server_id != RTEMS_ID_NONE) {
> - return RTEMS_SUCCESSFUL;
> - } else {
> - return RTEMS_INCORRECT_STATE;
> +#if defined(RTEMS_SMP)
> + if (bsp_interrupt_server_instances == NULL) {
> + *sc = RTEMS_INCORRECT_STATE;
> + return NULL;
> }
> -}
> +#else
> + if (bsp_interrupt_server_instance.server == RTEMS_ID_NONE) {
> + *sc = RTEMS_INCORRECT_STATE;
> + return NULL;
> + }
> +#endif
>
> -static unsigned bsp_interrupt_server_errors;
> + if (server_index >= rtems_get_processor_count()) {
> + *sc = RTEMS_INVALID_ID;
> + return NULL;
> + }
> +
> + *sc = RTEMS_SUCCESSFUL;
> +#if defined(RTEMS_SMP)
> + return &bsp_interrupt_server_instances[server_index];
> +#else
> + return &bsp_interrupt_server_instance;
> +#endif
> +}
>
> static void bsp_interrupt_server_trigger(void *arg)
> {
> rtems_interrupt_lock_context lock_context;
> rtems_interrupt_server_entry *e = arg;
> + bsp_interrupt_server_context *s = e->server;
>
> if (bsp_interrupt_is_valid_vector(e->vector)) {
> bsp_interrupt_vector_disable(e->vector);
> }
>
> - rtems_interrupt_lock_acquire(&bsp_interrupt_server_lock, &lock_context);
> + rtems_interrupt_lock_acquire(&s->lock, &lock_context);
>
> if (rtems_chain_is_node_off_chain(&e->node)) {
> - rtems_chain_append_unprotected(&bsp_interrupt_server_chain, &e->node);
> + rtems_chain_append_unprotected(&s->entries, &e->node);
> } else {
> - ++bsp_interrupt_server_errors;
> + ++s->errors;
> }
>
> - rtems_interrupt_lock_release(&bsp_interrupt_server_lock, &lock_context);
> + rtems_interrupt_lock_release(&s->lock, &lock_context);
>
> - rtems_event_system_send(bsp_interrupt_server_id, RTEMS_EVENT_SYSTEM_SERVER);
> + rtems_event_system_send(s->server, RTEMS_EVENT_SYSTEM_SERVER);
> }
>
> typedef struct {
> @@ -114,6 +137,7 @@ static rtems_interrupt_server_entry *bsp_interrupt_server_query_entry(
> }
>
> typedef struct {
> + bsp_interrupt_server_context *server;
> rtems_vector_number vector;
> rtems_option options;
> rtems_interrupt_handler handler;
> @@ -146,6 +170,7 @@ static void bsp_interrupt_server_install_helper(void *arg)
> if (e == NULL) {
> e = calloc(1, sizeof(*e));
> if (e != NULL) {
> + e->server = hd->server;
> e->vector = hd->vector;
> e->actions = a;
>
> @@ -162,6 +187,10 @@ static void bsp_interrupt_server_install_helper(void *arg)
> } else {
> sc = RTEMS_NO_MEMORY;
> }
> +#if defined(RTEMS_SMP)
> + } else if (e->server != hd->server) {
> + sc = RTEMS_RESOURCE_IN_USE;
> +#endif
> } else if (
> RTEMS_INTERRUPT_IS_UNIQUE(hd->options)
> || RTEMS_INTERRUPT_IS_UNIQUE(trigger_options)
> @@ -252,6 +281,7 @@ static void bsp_interrupt_server_remove_helper(void *arg)
> }
>
> static rtems_status_code bsp_interrupt_server_call_helper(
> + bsp_interrupt_server_context *s,
> rtems_vector_number vector,
> rtems_option options,
> rtems_interrupt_handler handler,
> @@ -260,6 +290,7 @@ static rtems_status_code bsp_interrupt_server_call_helper(
> )
> {
> bsp_interrupt_server_helper_data hd = {
> + .server = s,
> .vector = vector,
> .options = options,
> .handler = handler,
> @@ -271,6 +302,7 @@ static rtems_status_code bsp_interrupt_server_call_helper(
> .arg = &hd
> };
> rtems_interrupt_server_entry e = {
> + .server = s,
> .vector = BSP_INTERRUPT_SERVER_MANAGEMENT_VECTOR,
> .actions = &a
> };
> @@ -281,30 +313,32 @@ static rtems_status_code bsp_interrupt_server_call_helper(
> return hd.sc;
> }
>
> -static rtems_interrupt_server_entry *bsp_interrupt_server_get_entry(void)
> +static rtems_interrupt_server_entry *bsp_interrupt_server_get_entry(
> + bsp_interrupt_server_context *s
> +)
> {
> rtems_interrupt_lock_context lock_context;
> rtems_interrupt_server_entry *e;
> - rtems_chain_control *chain;
>
> - rtems_interrupt_lock_acquire(&bsp_interrupt_server_lock, &lock_context);
> - chain = &bsp_interrupt_server_chain;
> + rtems_interrupt_lock_acquire(&s->lock, &lock_context);
>
> - if (!rtems_chain_is_empty(chain)) {
> + if (!rtems_chain_is_empty(&s->entries)) {
> e = (rtems_interrupt_server_entry *)
> - rtems_chain_get_first_unprotected(chain);
> + rtems_chain_get_first_unprotected(&s->entries);
> rtems_chain_set_off_chain(&e->node);
> } else {
> e = NULL;
> }
>
> - rtems_interrupt_lock_release(&bsp_interrupt_server_lock, &lock_context);
> + rtems_interrupt_lock_release(&s->lock, &lock_context);
>
> return e;
> }
>
> static void bsp_interrupt_server_task(rtems_task_argument arg)
> {
> + bsp_interrupt_server_context *s = (bsp_interrupt_server_context *) arg;
> +
> while (true) {
> rtems_event_set events;
> rtems_interrupt_server_entry *e;
> @@ -316,7 +350,7 @@ static void bsp_interrupt_server_task(rtems_task_argument arg)
> &events
> );
>
> - while ((e = bsp_interrupt_server_get_entry()) != NULL) {
> + while ((e = bsp_interrupt_server_get_entry(s)) != NULL) {
> rtems_interrupt_server_action *action = e->actions;
> rtems_vector_number vector = e->vector;
>
> @@ -334,7 +368,7 @@ static void bsp_interrupt_server_task(rtems_task_argument arg)
> }
>
> rtems_status_code rtems_interrupt_server_handler_install(
> - rtems_id server,
> + uint32_t server_index,
> rtems_vector_number vector,
> const char *info,
> rtems_option options,
> @@ -343,17 +377,15 @@ rtems_status_code rtems_interrupt_server_handler_install(
> )
> {
> rtems_status_code sc;
> + bsp_interrupt_server_context *s;
>
> - sc = bsp_interrupt_server_is_initialized();
> - if (sc != RTEMS_SUCCESSFUL) {
> + s = bsp_interrupt_server_get_context(server_index, &sc);
> + if (s == NULL) {
> return sc;
> }
>
> - if (server != RTEMS_ID_NONE) {
> - return RTEMS_NOT_IMPLEMENTED;
> - }
> -
> return bsp_interrupt_server_call_helper(
> + s,
> vector,
> options,
> handler,
> @@ -363,24 +395,22 @@ rtems_status_code rtems_interrupt_server_handler_install(
> }
>
> rtems_status_code rtems_interrupt_server_handler_remove(
> - rtems_id server,
> + uint32_t server_index,
> rtems_vector_number vector,
> rtems_interrupt_handler handler,
> void *arg
> )
> {
> rtems_status_code sc;
> + bsp_interrupt_server_context *s;
>
> - sc = bsp_interrupt_server_is_initialized();
> - if (sc != RTEMS_SUCCESSFUL) {
> + s = bsp_interrupt_server_get_context(server_index, &sc);
> + if (s == NULL) {
> return sc;
> }
>
> - if (server != RTEMS_ID_NONE) {
> - return RTEMS_NOT_IMPLEMENTED;
> - }
> -
> return bsp_interrupt_server_call_helper(
> + s,
> vector,
> 0,
> handler,
> @@ -426,7 +456,7 @@ static void bsp_interrupt_server_handler_iterate_helper(void *arg)
> }
>
> rtems_status_code rtems_interrupt_server_handler_iterate(
> - rtems_id server,
> + uint32_t server_index,
> rtems_vector_number vector,
> rtems_interrupt_per_handler_routine routine,
> void *arg
> @@ -434,16 +464,13 @@ rtems_status_code rtems_interrupt_server_handler_iterate(
> {
> rtems_status_code sc;
> bsp_interrupt_server_handler_iterate_helper_data hihd;
> + bsp_interrupt_server_context *s;
>
> - sc = bsp_interrupt_server_is_initialized();
> - if (sc != RTEMS_SUCCESSFUL) {
> + s = bsp_interrupt_server_get_context(server_index, &sc);
> + if (s == NULL) {
> return sc;
> }
>
> - if (server != RTEMS_ID_NONE) {
> - return RTEMS_NOT_IMPLEMENTED;
> - }
> -
> if (!bsp_interrupt_is_valid_vector(vector)) {
> return RTEMS_INVALID_ID;
> }
> @@ -451,6 +478,7 @@ rtems_status_code rtems_interrupt_server_handler_iterate(
> hihd.routine = routine;
> hihd.arg = arg;
> return bsp_interrupt_server_call_helper(
> + s,
> vector,
> 0,
> NULL,
> @@ -464,42 +492,98 @@ rtems_status_code rtems_interrupt_server_initialize(
> size_t stack_size,
> rtems_mode modes,
> rtems_attribute attributes,
> - rtems_id *server
> + uint32_t *server_count
> )
> {
> - rtems_status_code sc = RTEMS_SUCCESSFUL;
> + uint32_t cpu_index;
> + uint32_t cpu_count;
> + uint32_t dummy;
> + bsp_interrupt_server_context *instances;
>
> - if (server != NULL) {
> - return RTEMS_NOT_IMPLEMENTED;
> + if (server_count == NULL) {
> + server_count = &dummy;
> }
>
> - sc = rtems_task_create(
> - rtems_build_name('I', 'R', 'Q', 'S'),
> - priority,
> - stack_size,
> - modes,
> - attributes,
> - &bsp_interrupt_server_id
> - );
> - if (sc != RTEMS_SUCCESSFUL) {
> - return RTEMS_TOO_MANY;
> + cpu_count = rtems_get_processor_count();
> +
> +#if defined(RTEMS_SMP)
> + instances = calloc(cpu_count, sizeof(*instances));
> + if (instances == NULL) {
> + return RTEMS_NO_MEMORY;
> }
> +#else
> + instances = &bsp_interrupt_server_instance;
> +#endif
> +
> + for (cpu_index = 0; cpu_index < cpu_count; ++cpu_index) {
> + bsp_interrupt_server_context *s = &instances[cpu_index];
> + rtems_status_code sc;
> +#if defined(RTEMS_SMP)
> + rtems_id scheduler;
> + cpu_set_t cpu;
> +#endif
> +
> + rtems_interrupt_lock_initialize(&s->lock, "Interrupt Server");
> + rtems_chain_initialize_empty(&s->entries);
> +
> + sc = rtems_task_create(
> + rtems_build_name('I', 'R', 'Q', 'S'),
> + priority,
> + stack_size,
> + modes,
> + attributes,
> + &s->server
> + );
> + if (sc != RTEMS_SUCCESSFUL) {
> + *server_count = cpu_index;
>
> - sc = rtems_task_start(
> - bsp_interrupt_server_id,
> - bsp_interrupt_server_task,
> - 0
> - );
> - _Assert(sc == RTEMS_SUCCESSFUL);
> +#if defined(RTEMS_SMP)
> + if (cpu_index > 0) {
> + return RTEMS_SUCCESSFUL;
> + }
> +
> + free(instances);
> +#endif
> +
> + return RTEMS_TOO_MANY;
> + }
> +
> +#if defined(RTEMS_SMP)
> + sc = rtems_scheduler_ident_by_processor(cpu_index, &scheduler);
> + _Assert(sc == RTEMS_SUCCESSFUL);
> +
> + sc = rtems_task_set_scheduler(s->server, scheduler, priority);
> + _Assert(sc == RTEMS_SUCCESSFUL);
> +
> + CPU_ZERO(&cpu);
> + CPU_SET(cpu_index, &cpu);
> + sc = rtems_task_set_affinity(s->server, sizeof(cpu), &cpu);
> + _Assert(sc == RTEMS_SUCCESSFUL);
> +#endif
> +
> + sc = rtems_task_start(
> + s->server,
> + bsp_interrupt_server_task,
> + (rtems_task_argument) s
> + );
> + _Assert(sc == RTEMS_SUCCESSFUL);
> + }
> +
> +#if defined(RTEMS_SMP)
> + bsp_interrupt_server_instances = instances;
> +#endif
> + *server_count = cpu_index;
>
> return RTEMS_SUCCESSFUL;
> }
>
> static void bsp_interrupt_server_entry_initialize(
> - rtems_interrupt_server_entry *entry
> + rtems_interrupt_server_entry *entry,
> + bsp_interrupt_server_context *s
> )
> {
> rtems_chain_set_off_chain(&entry->node);
> + entry->server = s;
> entry->vector = BSP_INTERRUPT_SERVER_MANAGEMENT_VECTOR;
> entry->actions = NULL;
> }
> @@ -517,11 +601,21 @@ static void bsp_interrupt_server_action_prepend(
> entry->actions = action;
> }
>
> -void rtems_interrupt_server_entry_initialize(
> +rtems_status_code rtems_interrupt_server_entry_initialize(
> + uint32_t server_index,
> rtems_interrupt_server_entry *entry
> )
> {
> - bsp_interrupt_server_entry_initialize(entry);
> + rtems_status_code sc;
> + bsp_interrupt_server_context *s;
> +
> + s = bsp_interrupt_server_get_context(server_index, &sc);
> + if (s == NULL) {
> + return sc;
> + }
> +
> + bsp_interrupt_server_entry_initialize(entry, s);
> + return RTEMS_SUCCESSFUL;
> }
>
> void rtems_interrupt_server_action_prepend(
> @@ -535,7 +629,6 @@ void rtems_interrupt_server_action_prepend(
> }
>
> void rtems_interrupt_server_entry_submit(
> - rtems_id server,
> rtems_interrupt_server_entry *entry
> )
> {
> @@ -550,22 +643,24 @@ static void bsp_interrupt_server_entry_destroy_helper(void *arg)
> }
>
> void rtems_interrupt_server_entry_destroy(
> - rtems_id server,
> rtems_interrupt_server_entry *entry
> )
> {
> + bsp_interrupt_server_context *s;
> rtems_interrupt_lock_context lock_context;
>
> - rtems_interrupt_lock_acquire(&bsp_interrupt_server_lock, &lock_context);
> + s = entry->server;
> + rtems_interrupt_lock_acquire(&s->lock, &lock_context);
>
> if (!rtems_chain_is_node_off_chain(&entry->node)) {
> rtems_chain_extract_unprotected(&entry->node);
> rtems_chain_set_off_chain(&entry->node);
> }
>
> - rtems_interrupt_lock_release(&bsp_interrupt_server_lock, &lock_context);
> + rtems_interrupt_lock_release(&s->lock, &lock_context);
>
> bsp_interrupt_server_call_helper(
> + s,
> BSP_INTERRUPT_SERVER_MANAGEMENT_VECTOR,
> 0,
> NULL,
> @@ -574,17 +669,27 @@ void rtems_interrupt_server_entry_destroy(
> );
> }
>
> -void rtems_interrupt_server_request_initialize(
> +rtems_status_code rtems_interrupt_server_request_initialize(
> + uint32_t server_index,
> rtems_interrupt_server_request *request,
> rtems_interrupt_handler handler,
> void *arg
> )
> {
> - bsp_interrupt_server_entry_initialize(&request->entry);
> + rtems_status_code sc;
> + bsp_interrupt_server_context *s;
> +
> + s = bsp_interrupt_server_get_context(server_index, &sc);
> + if (s == NULL) {
> + return sc;
> + }
> +
> + bsp_interrupt_server_entry_initialize(&request->entry, s);
> bsp_interrupt_server_action_prepend(
> &request->entry,
> &request->action,
> handler,
> arg
> );
> + return RTEMS_SUCCESSFUL;
> }
> diff --git a/cpukit/include/rtems/irq-extension.h b/cpukit/include/rtems/irq-extension.h
> index fec07675b8..0c72b6e086 100644
> --- a/cpukit/include/rtems/irq-extension.h
> +++ b/cpukit/include/rtems/irq-extension.h
> @@ -116,7 +116,7 @@ typedef void (*rtems_interrupt_handler)(void *);
> *
> * This function may block.
> *
> - * @retval RTEMS_SUCCESSFUL Shall be returned in case of success.
> + * @retval RTEMS_SUCCESSFUL Successful operation.
> * @retval RTEMS_CALLED_FROM_ISR If this function is called from interrupt
> * context this shall be returned.
> * @retval RTEMS_INVALID_ADDRESS If the handler address is NULL this shall be
> @@ -149,7 +149,7 @@ rtems_status_code rtems_interrupt_handler_install(
> *
> * This function may block.
> *
> - * @retval RTEMS_SUCCESSFUL Shall be returned in case of success.
> + * @retval RTEMS_SUCCESSFUL Successful operation.
> * @retval RTEMS_CALLED_FROM_ISR If this function is called from interrupt
> * context this shall be returned.
> * @retval RTEMS_INVALID_ADDRESS If the handler address is NULL this shall be
> @@ -189,7 +189,7 @@ typedef void (*rtems_interrupt_per_handler_routine)(
> * This function may block. Never install or remove an interrupt handler
> * within the iteration routine. This may result in a deadlock.
> *
> - * @retval RTEMS_SUCCESSFUL Shall be returned in case of success.
> + * @retval RTEMS_SUCCESSFUL Successful operation.
> * @retval RTEMS_CALLED_FROM_ISR If this function is called from interrupt
> * context this shall be returned.
> * @retval RTEMS_INVALID_ID If the vector number is out of range this shall be
> @@ -218,6 +218,11 @@ typedef struct rtems_interrupt_server_action {
> } rtems_interrupt_server_action;
>
> /**
> + * @brief The interrupt server index of the default interrupt server.
> + */
> +#define RTEMS_INTERRUPT_SERVER_DEFAULT 0
> +
> +/**
> * @brief An interrupt server entry.
> *
> * This structure must be treated as an opaque data type. Members must not be
> @@ -230,6 +235,7 @@ typedef struct rtems_interrupt_server_action {
> */
> typedef struct {
> rtems_chain_node node;
> + void *server;
> rtems_vector_number vector;
> rtems_interrupt_server_action *actions;
> } rtems_interrupt_server_entry;
> @@ -250,28 +256,29 @@ typedef struct {
> } rtems_interrupt_server_request;
>
> /**
> - * @brief Initializes an interrupt server task.
> + * @brief Initializes the interrupt server tasks.
> *
> - * The task will have the priority @a priority, the stack size @a stack_size,
> - * the modes @a modes and the attributes @a attributes. The identifier of the
> - * server task will be returned in @a server. Interrupt handlers can be
> - * installed on the server with rtems_interrupt_server_handler_install() and
> - * removed with rtems_interrupt_server_handler_remove() using this identifier.
> - * In case of an interrupt the request will be forwarded to the server. The
> - * handlers are executed within the server context. If one handler blocks on
> - * something this may delay the processing of other handlers.
> + * This function tries to create an interrupt server task for each processor in
> + * the system. The tasks will have the priority @a priority, the stack size @a
> + * stack_size, the modes @a modes and the attributes @a attributes. The count
> + * of server tasks will be returned in @a server_count. Interrupt handlers can
> + * be installed on an interrupt server with
> + * rtems_interrupt_server_handler_install() and removed with
> + * rtems_interrupt_server_handler_remove() using a server index. In case of an
> + * interrupt, the request will be forwarded to the interrupt server. The
> + * handlers are executed within the interrupt server context. If one handler
> + * blocks on something this may delay the processing of other handlers.
> *
> - * The server identifier pointer @a server may be @a NULL to initialize the
> - * default server.
> + * The server count pointer @a server_count may be @a NULL.
> *
> * This function may block.
> *
> * @see rtems_task_create().
> *
> - * @retval RTEMS_SUCCESSFUL Shall be returned in case of success.
> - * @retval RTEMS_INCORRECT_STATE If the default server is already initialized
> - * this shall be returned.
> - * @retval RTEMS_TOO_MANY No free task available to create the server task.
> + * @retval RTEMS_SUCCESSFUL Successful operation.
> + * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
> + * @retval RTEMS_NO_MEMORY Not enough memory.
> + * @retval RTEMS_TOO_MANY No free task available to create at least one server task.
> * @retval RTEMS_UNSATISFIED Task stack size too large.
> * @retval RTEMS_INVALID_PRIORITY Invalid task priority.
> */
> @@ -280,7 +287,7 @@ rtems_status_code rtems_interrupt_server_initialize(
> size_t stack_size,
> rtems_mode modes,
> rtems_attribute attributes,
> - rtems_id *server
> + uint32_t *server_count
> );
>
> /**
> @@ -288,20 +295,20 @@ rtems_status_code rtems_interrupt_server_initialize(
> * vector with number @a vector on the server @a server.
> *
> * The handler routine will be executed on the corresponding interrupt server
> - * task. A server identifier @a server of @c RTEMS_ID_NONE may be used to
> - * install the handler on the default server.
> + * task. A server index @a server_index of @c RTEMS_INTERRUPT_SERVER_DEFAULT
> + * may be used to install the handler on the default server.
> *
> * This function may block.
> *
> * @see rtems_interrupt_handler_install().
> *
> - * @retval RTEMS_SUCCESSFUL Shall be returned in case of success.
> - * @retval RTEMS_INCORRECT_STATE If the interrupt handler server is not
> - * initialized this shall be returned.
> + * @retval RTEMS_SUCCESSFUL Successful operation.
> + * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
> + * @retval RTEMS_INVALID_ID If the interrupt server index is invalid.
> * @retval * For other errors see rtems_interrupt_handler_install().
> */
> rtems_status_code rtems_interrupt_server_handler_install(
> - rtems_id server,
> + uint32_t server_index,
> rtems_vector_number vector,
> const char *info,
> rtems_option options,
> @@ -313,20 +320,20 @@ rtems_status_code rtems_interrupt_server_handler_install(
> * @brief Removes the interrupt handler routine @a handler with argument @a arg
> * for the interrupt vector with number @a vector from the server @a server.
> *
> - * A server identifier @a server of @c RTEMS_ID_NONE may be used to remove the
> - * handler from the default server.
> + * A server index @a server_index of @c RTEMS_INTERRUPT_SERVER_DEFAULT may be
> + * used to remove the handler from the default server.
> *
> * This function may block.
> *
> * @see rtems_interrupt_handler_remove().
> *
> - * @retval RTEMS_SUCCESSFUL Shall be returned in case of success.
> - * @retval RTEMS_INCORRECT_STATE If the interrupt handler server is not
> - * initialized this shall be returned.
> + * @retval RTEMS_SUCCESSFUL Successful operation.
> + * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
> + * @retval RTEMS_INVALID_ID If the interrupt server index is invalid.
> * @retval * For other errors see rtems_interrupt_handler_remove().
> */
> rtems_status_code rtems_interrupt_server_handler_remove(
> - rtems_id server,
> + uint32_t server_index,
> rtems_vector_number vector,
> rtems_interrupt_handler handler,
> void *arg
> @@ -337,18 +344,18 @@ rtems_status_code rtems_interrupt_server_handler_remove(
> * number @a vector which are installed on the interrupt server specified by
> * @a server.
> *
> - * A server identifier @a server of @c RTEMS_ID_NONE may be used to specify the
> - * default server.
> + * A server index @a server_index of @c RTEMS_INTERRUPT_SERVER_DEFAULT may be
> + * used to specify the default server.
> *
> * @see rtems_interrupt_handler_iterate()
> *
> - * @retval RTEMS_SUCCESSFUL Shall be returned in case of success.
> - * @retval RTEMS_INCORRECT_STATE If the interrupt handler server is not
> - * initialized this shall be returned.
> + * @retval RTEMS_SUCCESSFUL Successful operation.
> + * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
> + * @retval RTEMS_INVALID_ID If the interrupt server index is invalid.
> * @retval * For other errors see rtems_interrupt_handler_iterate().
> */
> rtems_status_code rtems_interrupt_server_handler_iterate(
> - rtems_id server,
> + uint32_t server_index,
> rtems_vector_number vector,
> rtems_interrupt_per_handler_routine routine,
> void *arg
> @@ -357,11 +364,18 @@ rtems_status_code rtems_interrupt_server_handler_iterate(
> /**
> * @brief Initializes the specified interrupt server entry.
> *
> + * @param[in] server_index The interrupt server index. Use
> + * @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server.
> * @param[in] entry The interrupt server entry to initialize.
> *
> * @see rtems_interrupt_server_action_prepend().
> + *
> + * @retval RTEMS_SUCCESSFUL Successful operation.
> + * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
> + * @retval RTEMS_INVALID_ID If the interrupt server index is invalid.
> */
> -void rtems_interrupt_server_entry_initialize(
> +rtems_status_code rtems_interrupt_server_entry_initialize(
> + uint32_t server_index,
> rtems_interrupt_server_entry *entry
> );
>
> @@ -397,8 +411,6 @@ void rtems_interrupt_server_action_prepend(
> * This function may be called from thread or interrupt context. It does not
> * block. No error checking is performed.
> *
> - * @param[in] server The server identifier. Use @c RTEMS_ID_NONE to specify
> - * the default server.
> * @param[in] entry The interrupt server entry must be initialized before the
> * first call to this function via rtems_interrupt_server_entry_initialize()
> * and rtems_interrupt_server_action_prepend(). The entry and its actions
> @@ -406,36 +418,40 @@ void rtems_interrupt_server_action_prepend(
> * rtems_interrupt_server_entry_destroy() to destroy an entry in use.
> */
> void rtems_interrupt_server_entry_submit(
> - rtems_id server,
> rtems_interrupt_server_entry *entry
> );
>
> /**
> * @brief Destroys the specified interrupt server entry.
> *
> - * This function must be called from thread context. It may block. No error
> - * checking is performed.
> + * This function must be called from thread context. It may block. Calling
> + * this function within the context of an interrupt server is undefined
> + * behaviour. No error checking is performed.
> *
> - * @param[in] server The server identifier. Use @c RTEMS_ID_NONE to specify
> - * the default server.
> + * @param[in] server_index The interrupt server index. Use
> + * @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server.
> * @param[in] entry The interrupt server entry to destroy. It must have been
> * initialized via rtems_interrupt_server_entry_initialize().
> */
> void rtems_interrupt_server_entry_destroy(
> - rtems_id server,
> rtems_interrupt_server_entry *entry
> );
>
> /**
> * @brief Initializes the specified interrupt server request.
> *
> - * No error checking is performed.
> - *
> + * @param[in] server_index The interrupt server index. Use
> + * @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server.
> * @param[in] request The interrupt server request to initialize.
> * @param[in] handler The interrupt handler for the request action.
> * @param[in] arg The interrupt handler argument for the request action.
> + *
> + * @retval RTEMS_SUCCESSFUL Successful operation.
> + * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
> + * @retval RTEMS_INVALID_ID If the interrupt server index is invalid.
> */
> -void rtems_interrupt_server_request_initialize(
> +rtems_status_code rtems_interrupt_server_request_initialize(
> + uint32_t server_index,
> rtems_interrupt_server_request *request,
> rtems_interrupt_handler handler,
> void *arg
> @@ -452,8 +468,6 @@ void rtems_interrupt_server_request_initialize(
> * This function may be called from thread or interrupt context. It does not
> * block. No error checking is performed.
> *
> - * @param[in] server The server identifier. Use @c RTEMS_ID_NONE to specify
> - * the default server.
> * @param[in] request The interrupt server request must be initialized before the
> * first call to this function via
> * rtems_interrupt_server_request_initialize(). The request must not be
> @@ -461,30 +475,27 @@ void rtems_interrupt_server_request_initialize(
> * rtems_interrupt_server_request_destroy() to destroy a request in use.
> */
> RTEMS_INLINE_ROUTINE void rtems_interrupt_server_request_submit(
> - rtems_id server,
> rtems_interrupt_server_request *request
> )
> {
> - rtems_interrupt_server_entry_submit( server, &request->entry );
> + rtems_interrupt_server_entry_submit( &request->entry );
> }
>
> /**
> * @brief Destroys the specified interrupt server request.
> *
> - * This function must be called from thread context. It may block. No error
> - * checking is performed.
> + * This function must be called from thread context. It may block. Calling
> + * this function within the context of an interrupt server is undefined
> + * behaviour. No error checking is performed.
> *
> - * @param[in] server The server identifier. Use @c RTEMS_ID_NONE to specify
> - * the default server.
> * @param[in] request The interrupt server request to destroy. It must have
> * been initialized via rtems_interrupt_server_request_initialize().
> */
> RTEMS_INLINE_ROUTINE void rtems_interrupt_server_request_destroy(
> - rtems_id server,
> rtems_interrupt_server_request *request
> )
> {
> - rtems_interrupt_server_entry_destroy( server, &request->entry );
> + rtems_interrupt_server_entry_destroy( &request->entry );
> }
>
> /** @} */
> --
> 2.12.3
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list