Add interrupt server set affinity

Update #3071.
This commit is contained in:
Sebastian Huber
2017-07-11 09:08:15 +02:00
parent a961e1980c
commit d1841406b3
2 changed files with 69 additions and 0 deletions

View File

@@ -750,3 +750,36 @@ rtems_status_code rtems_interrupt_server_resume(uint32_t server_index)
);
return RTEMS_SUCCESSFUL;
}
rtems_status_code rtems_interrupt_server_set_affinity(
uint32_t server_index,
size_t affinity_size,
const cpu_set_t *affinity,
rtems_task_priority priority
)
{
rtems_status_code sc;
bsp_interrupt_server_context *s;
rtems_id scheduler;
s = bsp_interrupt_server_get_context(server_index, &sc);
if (s == NULL) {
return sc;
}
sc = rtems_scheduler_ident_by_processor_set(
affinity_size,
affinity,
&scheduler
);
if (sc != RTEMS_SUCCESSFUL) {
return sc;
}
sc = rtems_task_set_scheduler(s->server, scheduler, priority);
if (sc != RTEMS_SUCCESSFUL) {
return sc;
}
return rtems_task_set_affinity(s->server, affinity_size, affinity);
}

View File

@@ -400,6 +400,42 @@ rtems_status_code rtems_interrupt_server_suspend( uint32_t server_index );
*/
rtems_status_code rtems_interrupt_server_resume( uint32_t server_index );
/**
* @brief Sets the processor affinity of the specified interrupt server.
*
* The scheduler is set determined by the highest numbered processor in the
* specified affinity set.
*
* This operation is only reliable in case the specified interrupt was
* suspended via rtems_interrupt_server_suspend().
*
* @param[in] server_index The interrupt server index. Use
* @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server.
* @param[in] affinity_size The storage size of the affinity set.
* @param[in] affinity The desired processor affinity set for the specified
* interrupt server.
* @param[in] priority The task priority with respect to the corresponding
* scheduler instance.
*
* @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 RTEMS_INVALID_SIZE Invalid affinity set size.
* @retval RTEMS_INVALID_NAME The affinity set contains no online processor.
* @retval RTEMS_INCORRECT_STATE The highest numbered online processor in the
* specified affinity set is not owned by a scheduler.
* @retval RTEMS_INVALID_PRIORITY Invalid priority.
* @retval RTEMS_RESOURCE_IN_USE The interrupt server owns resources which deny
* a scheduler change.
* @retval RTEMS_INVALID_NUMBER Invalid processor affinity set.
*/
rtems_status_code rtems_interrupt_server_set_affinity(
uint32_t server_index,
size_t affinity_size,
const cpu_set_t *affinity,
rtems_task_priority priority
);
/**
* @brief Initializes the specified interrupt server entry.
*