From e7ee719f795fdbd8b5185769bdc893d8840b6855 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 11 Jul 2017 08:25:09 +0200 Subject: Create one interrupt server per processor This allows load balancing of interrupt processing in SMP configurations. Update #3071. --- 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 @@ -217,6 +217,11 @@ typedef struct rtems_interrupt_server_action { void *arg; } 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. * @@ -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 ); } /** @} */ -- cgit v1.2.3