mirror of
https://github.com/hermitcore/libhermit.git
synced 2025-03-30 00:00:15 +01:00
fix bug in counting of the ready tasks
This commit is contained in:
parent
838fd7748f
commit
638923afbf
1 changed files with 17 additions and 14 deletions
|
@ -163,7 +163,7 @@ static void timer_queue_push(uint32_t core_id, task_t* task)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void readyqueues_push_back(uint32_t core_id, task_t* task)
|
static inline void readyqueues_push_back(uint32_t core_id, task_t* task)
|
||||||
{
|
{
|
||||||
// idle task (prio=0) doesn't have a queue
|
// idle task (prio=0) doesn't have a queue
|
||||||
task_list_t* readyqueue = &readyqueues[core_id].queue[task->prio - 1];
|
task_list_t* readyqueue = &readyqueues[core_id].queue[task->prio - 1];
|
||||||
|
@ -172,17 +172,10 @@ static void readyqueues_push_back(uint32_t core_id, task_t* task)
|
||||||
|
|
||||||
// update priority bitmap
|
// update priority bitmap
|
||||||
readyqueues[core_id].prio_bitmap |= (1 << task->prio);
|
readyqueues[core_id].prio_bitmap |= (1 << task->prio);
|
||||||
|
|
||||||
// increase the number of ready tasks
|
|
||||||
readyqueues[core_id].nr_tasks++;
|
|
||||||
|
|
||||||
// should we wakeup the core?
|
|
||||||
if (readyqueues[core_id].nr_tasks == 1)
|
|
||||||
wakeup_core(core_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void readyqueues_remove(uint32_t core_id, task_t* task)
|
static inline void readyqueues_remove(uint32_t core_id, task_t* task)
|
||||||
{
|
{
|
||||||
// idle task (prio=0) doesn't have a queue
|
// idle task (prio=0) doesn't have a queue
|
||||||
task_list_t* readyqueue = &readyqueues[core_id].queue[task->prio - 1];
|
task_list_t* readyqueue = &readyqueues[core_id].queue[task->prio - 1];
|
||||||
|
@ -192,9 +185,6 @@ static void readyqueues_remove(uint32_t core_id, task_t* task)
|
||||||
// no valid task in queue => update priority bitmap
|
// no valid task in queue => update priority bitmap
|
||||||
if (readyqueue->first == NULL)
|
if (readyqueue->first == NULL)
|
||||||
readyqueues[core_id].prio_bitmap &= ~(1 << task->prio);
|
readyqueues[core_id].prio_bitmap &= ~(1 << task->prio);
|
||||||
|
|
||||||
// reduce the number of ready tasks
|
|
||||||
readyqueues[core_id].nr_tasks--;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -668,7 +658,7 @@ int wakeup_task(tid_t id)
|
||||||
core_id = task->last_core;
|
core_id = task->last_core;
|
||||||
|
|
||||||
if (task->status == TASK_BLOCKED) {
|
if (task->status == TASK_BLOCKED) {
|
||||||
LOG_DEBUG("wakeup task %d\n", id);
|
LOG_DEBUG("wakeup task %d on core %d\n", id, core_id);
|
||||||
|
|
||||||
task->status = TASK_READY;
|
task->status = TASK_READY;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
@ -685,6 +675,15 @@ int wakeup_task(tid_t id)
|
||||||
// add task to the ready queue
|
// add task to the ready queue
|
||||||
readyqueues_push_back(core_id, task);
|
readyqueues_push_back(core_id, task);
|
||||||
|
|
||||||
|
// increase the number of ready tasks
|
||||||
|
readyqueues[core_id].nr_tasks++;
|
||||||
|
|
||||||
|
// should we wakeup the core?
|
||||||
|
if (readyqueues[core_id].nr_tasks == 1)
|
||||||
|
wakeup_core(core_id);
|
||||||
|
|
||||||
|
LOG_DEBUG("update nr_tasks on core %d to %d\n", core_id, readyqueues[core_id].nr_tasks);
|
||||||
|
|
||||||
spinlock_irqsave_unlock(&readyqueues[core_id].lock);
|
spinlock_irqsave_unlock(&readyqueues[core_id].lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -707,7 +706,7 @@ int block_task(tid_t id)
|
||||||
core_id = task->last_core;
|
core_id = task->last_core;
|
||||||
|
|
||||||
if (task->status == TASK_RUNNING) {
|
if (task->status == TASK_RUNNING) {
|
||||||
LOG_DEBUG("block task %d\n", id);
|
LOG_DEBUG("block task %d on core %d\n", id, core_id);
|
||||||
|
|
||||||
task->status = TASK_BLOCKED;
|
task->status = TASK_BLOCKED;
|
||||||
|
|
||||||
|
@ -716,6 +715,10 @@ int block_task(tid_t id)
|
||||||
// remove task from ready queue
|
// remove task from ready queue
|
||||||
readyqueues_remove(core_id, task);
|
readyqueues_remove(core_id, task);
|
||||||
|
|
||||||
|
// reduce the number of ready tasks
|
||||||
|
readyqueues[core_id].nr_tasks--;
|
||||||
|
LOG_DEBUG("update nr_tasks on core %d to %d\n", core_id, readyqueues[core_id].nr_tasks);
|
||||||
|
|
||||||
spinlock_irqsave_unlock(&readyqueues[core_id].lock);
|
spinlock_irqsave_unlock(&readyqueues[core_id].lock);
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
Loading…
Add table
Reference in a new issue