[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