add new functions to start tasks on a specific core

This commit is contained in:
Stefan Lankes 2012-07-16 21:53:41 +02:00
parent ff676995f2
commit 7082d0650f
2 changed files with 73 additions and 14 deletions

View file

@ -61,12 +61,48 @@ int multitasking_init(void);
* @param ep Pointer to the entry function for the new task
* @param arg Arguments the task shall start with
* @param prio Desired priority of the new kernel task
* @param core_id Start the new task on the core with this id
*
* @return
* - 0 on success
* - -EINVAL (-22) on failure
*/
int create_kernel_task(tid_t* id, entry_point_t ep, void* arg, uint8_t prio);
int create_kernel_task_on_core(tid_t* id, entry_point_t ep, void* arg, uint8_t prio, uint32_t core_id);
/** @brief create a kernel task.
*
* @param id The value behind this pointer will be set to the new task's id
* @param ep Pointer to the entry function for the new task
* @param arg Arguments the task shall start with
* @param prio Desired priority of the new kernel task
*
* @return
* - 0 on success
* - -EINVAL (-22) on failure
*/
static inline int create_kernel_task(tid_t* id, entry_point_t ep, void* arg, uint8_t prio)
{
uint32_t core_id, flags;
flags = irq_nested_disable();
core_id = CORE_ID;
irq_nested_enable(flags);
return create_kernel_task_on_core(id, ep, arg, prio, core_id);
}
/** @brief Create a user level task.
*
* @param id The value behind this pointer will be set to the new task's id
* @param fname Filename of the executable to start the task with
* @param argv Pointer to arguments array
* @param core_id Start the new task on the core with this id
*
* @return
* - 0 on success
* - -EINVAL (-22) or -ENOMEM (-12)on failure
*/
int create_user_task_on_core(tid_t* id, const char* fame, char** argv, uint32_t core_id);
/** @brief Create a user level task.
*
@ -78,7 +114,16 @@ int create_kernel_task(tid_t* id, entry_point_t ep, void* arg, uint8_t prio);
* - 0 on success
* - -EINVAL (-22) or -ENOMEM (-12)on failure
*/
int create_user_task(tid_t* id, const char* fame, char** argv);
static inline int create_user_task(tid_t* id, const char* fame, char** argv)
{
uint32_t core_id, flags;
flags = irq_nested_disable();
core_id = CORE_ID;
irq_nested_enable(flags);
return create_user_task_on_core(id, fame, argv, core_id);
}
/** @brief Block current task until the child task is terminated
* @param result The terminated child's return value

View file

@ -70,6 +70,10 @@ static runqueue_t runqueues[1] = { \
#endif
#endif
#if MAX_CORES > 1
extern atomic_int32_t cpu_online;
#endif
DEFINE_PER_CORE(task_t*, current_task, task_table+0);
/** @brief helper function for the assembly code to determine the current task
@ -206,10 +210,12 @@ static void NORETURN do_exit(int arg) {
spinlock_unlock(&curr_task->vma_lock);
drop_pgd(); // delete page directory and its page tables
#if 0
if (atomic_int32_read(&curr_task->user_usage))
kprintf("Memory leak! Task %d did not release %d pages\n",
curr_task->id, atomic_int32_read(&curr_task->user_usage));
#endif
curr_task->status = TASK_FINISHED;
// decrease the number of active tasks
@ -252,15 +258,17 @@ void NORETURN abort(void) {
* @param ep Pointer to the function the task shall start with
* @param arg Arguments list
* @param prio Desired priority of the new task
* @param core_id Start the new task on the core with this id
*
* @return
* - 0 on success
* - -ENOMEM (-12) or -EINVAL (-22) on failure
*/
static int create_task(tid_t* id, entry_point_t ep, void* arg, uint8_t prio)
static int create_task(tid_t* id, entry_point_t ep, void* arg, uint8_t prio, uint32_t core_id)
{
task_t* curr_task;
int ret = -ENOMEM;
unsigned int i, core_id;
uint32_t i;
if (BUILTIN_EXPECT(!ep, 0))
return -EINVAL;
@ -271,7 +279,15 @@ static int create_task(tid_t* id, entry_point_t ep, void* arg, uint8_t prio)
spinlock_irqsave_lock(&table_lock);
core_id = CORE_ID;
#if MAX_CORES > 1
if (core_id >= atomic_int32_read(&cpu_online))
#else
if (core_id > 0)
#endif
{
core_id = CORE_ID;
kprintf("Inavlid core id! Set id to %u!\n", core_id);
}
curr_task = per_core(current_task);
for(i=0; i<MAX_TASKS; i++) {
@ -466,7 +482,7 @@ static int kernel_entry(void* args)
return ret;
}
int create_kernel_task(tid_t* id, entry_point_t ep, void* args, uint8_t prio)
int create_kernel_task_on_core(tid_t* id, entry_point_t ep, void* args, uint8_t prio, uint32_t core_id)
{
kernel_args_t* kernel_args;
@ -480,7 +496,7 @@ int create_kernel_task(tid_t* id, entry_point_t ep, void* args, uint8_t prio)
if (prio > MAX_PRIO)
prio = NORMAL_PRIO;
return create_task(id, kernel_entry, kernel_args, prio);
return create_task(id, kernel_entry, kernel_args, prio, core_id);
}
#define MAX_ARGS (PAGE_SIZE - 2*sizeof(int) - sizeof(vfs_node_t*))
@ -755,11 +771,13 @@ static int user_entry(void* arg)
* @param id Pointer to the tid_t structure which shall be filles
* @param fname Executable's path and filename
* @param argv Arguments list
* @param core_id Start the new task on the core with this id
*
* @return
* - 0 on success
* - -ENOMEM (-12) or -EINVAL (-22) on failure
*/
int create_user_task(tid_t* id, const char* fname, char** argv)
int create_user_task_on_core(tid_t* id, const char* fname, char** argv, uint32_t core_id)
{
vfs_node_t* node;
int argc = 0;
@ -797,7 +815,7 @@ int create_user_task(tid_t* id, const char* fname, char** argv)
}
/* create new task */
return create_task(id, user_entry, load_args, NORMAL_PRIO);
return create_task(id, user_entry, load_args, NORMAL_PRIO, core_id);
}
/** @brief Used by the execve-Systemcall */
@ -1129,10 +1147,6 @@ void update_load(void)
}
}
#if MAX_CORES > 1
extern atomic_int32_t cpu_online;
#endif
void dump_load(void)
{
uint32_t i;