Skip to content

Commit f883691

Browse files
authored
Merge pull request #355 from xiulipan/taskpri
Enable scheduler task priority
2 parents 834d3cb + 9e6dea6 commit f883691

8 files changed

Lines changed: 47 additions & 14 deletions

File tree

src/arch/xtensa/task.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,13 @@ static inline uint32_t task_get_irq(struct task *task)
5353
uint32_t irq;
5454

5555
switch (task->priority) {
56-
case TASK_PRI_MED + 1 ... TASK_PRI_LOW:
56+
case TASK_PRI_MED + 6 ... TASK_PRI_LOW:
5757
irq = PLATFORM_IRQ_TASK_LOW;
5858
break;
59-
case TASK_PRI_HIGH ... TASK_PRI_MED - 1:
59+
case TASK_PRI_HIGH ... TASK_PRI_MED - 6:
6060
irq = PLATFORM_IRQ_TASK_HIGH;
6161
break;
62-
case TASK_PRI_MED:
62+
case TASK_PRI_MED - 5 ... TASK_PRI_MED + 5:
6363
default:
6464
irq = PLATFORM_IRQ_TASK_MED;
6565
break;
@@ -72,26 +72,38 @@ static inline void task_set_data(struct task *task)
7272
{
7373
struct list_item *dst = NULL;
7474
struct irq_task *irq_task;
75+
struct list_item *clist;
76+
struct task *ctask;
7577
uint32_t flags;
7678

7779
switch (task->priority) {
78-
case TASK_PRI_MED + 1 ... TASK_PRI_LOW:
80+
case TASK_PRI_MED + 6 ... TASK_PRI_LOW:
7981
irq_task = irq_low_task;
8082
dst = &irq_task->list;
8183
break;
82-
case TASK_PRI_HIGH ... TASK_PRI_MED - 1:
84+
case TASK_PRI_HIGH ... TASK_PRI_MED - 6:
8385
irq_task = irq_high_task;
8486
dst = &irq_task->list;
8587
break;
86-
case TASK_PRI_MED:
88+
case TASK_PRI_MED - 5 ... TASK_PRI_MED + 5:
8789
default:
8890
irq_task = irq_med_task;
8991
dst = &irq_task->list;
9092
break;
9193
}
9294

95+
/* find position in the list to append the item */
96+
list_for_item(clist, &irq_task->list) {
97+
trace_event(TRACE_CLASS_PIPE, "ins");
98+
ctask = container_of(clist, struct task, irq_list);
99+
if (task->priority >= ctask->priority)
100+
dst = clist;
101+
else
102+
break;
103+
}
104+
93105
spin_lock_irq(&irq_task->lock, flags);
94-
list_item_append(&task->irq_list, dst);
106+
list_item_insert(&task->irq_list, dst);
95107
spin_unlock_irq(&irq_task->lock, flags);
96108
}
97109

src/include/sof/list.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,18 @@ static inline void list_item_append(struct list_item *item,
7272
list->prev = item;
7373
}
7474

75+
/* insert new item to the position of the list */
76+
static inline void list_item_insert(struct list_item *item,
77+
struct list_item *pos)
78+
{
79+
struct list_item *tmp = pos->next;
80+
81+
item->next = tmp;
82+
item->prev = pos;
83+
pos->next = item;
84+
tmp->prev = item;
85+
}
86+
7587
/* delete item from the list leaves deleted list item
7688
*in undefined state list_is_empty won't return true
7789
*/

src/include/sof/schedule.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ struct sof;
5656
#define TASK_PRI_MED 0
5757
#define TASK_PRI_HIGH -20
5858

59+
#define TASK_PRI_IPC 1
60+
5961
/* maximun task time slice in microseconds */
6062
#define SCHEDULE_TASK_MAX_TIME_SLICE 5000
6163

src/ipc/apl-ipc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ int platform_ipc_init(struct ipc *ipc)
199199

200200
/* schedule */
201201
schedule_task_init(&_ipc->ipc_task, ipc_process_task, _ipc);
202-
schedule_task_config(&_ipc->ipc_task, 0, 0);
202+
schedule_task_config(&_ipc->ipc_task, TASK_PRI_IPC, 0);
203203

204204
/* allocate page table buffer */
205205
iipc->page_table = rballoc(RZONE_SYS, SOF_MEM_CAPS_RAM,

src/ipc/byt-ipc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ int platform_ipc_init(struct ipc *ipc)
221221

222222
/* schedule */
223223
schedule_task_init(&_ipc->ipc_task, ipc_process_task, _ipc);
224-
schedule_task_config(&_ipc->ipc_task, 0, 0);
224+
schedule_task_config(&_ipc->ipc_task, TASK_PRI_IPC, 0);
225225

226226
/* allocate page table buffer */
227227
iipc->page_table = rzalloc(RZONE_SYS, SOF_MEM_CAPS_RAM,

src/ipc/cnl-ipc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ int platform_ipc_init(struct ipc *ipc)
201201

202202
/* schedule */
203203
schedule_task_init(&_ipc->ipc_task, ipc_process_task, _ipc);
204-
schedule_task_config(&_ipc->ipc_task, 0, 0);
204+
schedule_task_config(&_ipc->ipc_task, TASK_PRI_IPC, 0);
205205

206206
/* allocate page table buffer */
207207
iipc->page_table = rballoc(RZONE_SYS, SOF_MEM_CAPS_RAM,

src/ipc/hsw-ipc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ int platform_ipc_init(struct ipc *ipc)
216216

217217
/* schedule */
218218
schedule_task_init(&_ipc->ipc_task, ipc_process_task, _ipc);
219-
schedule_task_config(&_ipc->ipc_task, 0, 0);
219+
schedule_task_config(&_ipc->ipc_task, TASK_PRI_IPC, 0);
220220

221221
/* allocate page table buffer */
222222
iipc->page_table = rzalloc(RZONE_SYS, SOF_MEM_CAPS_RAM,

src/lib/schedule.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ static inline struct task *edf_get_next(uint64_t current,
9999
struct list_item *clist;
100100
struct list_item *tlist;
101101
uint64_t next_delta = UINT64_MAX;
102+
int next_priority = TASK_PRI_LOW;
102103
uint64_t delta;
103104
uint64_t deadline;
104105
int reschedule = 0;
@@ -127,15 +128,21 @@ static inline struct task *edf_get_next(uint64_t current,
127128
/* include the length of task in deadline calc */
128129
deadline = task->deadline - task->max_rtime;
129130

130-
/* get earliest deadline */
131131
if (current < deadline) {
132132
delta = deadline - current;
133133

134-
if (delta < next_delta) {
134+
/* get highest priority */
135+
if (task->priority < next_priority) {
136+
next_priority = task->priority;
135137
next_delta = delta;
136138
next_task = task;
139+
} else if (task->priority == next_priority) {
140+
/* get earliest deadline */
141+
if (delta < next_delta) {
142+
next_delta = delta;
143+
next_task = task;
144+
}
137145
}
138-
139146
} else {
140147
/* missed scheduling - will be rescheduled */
141148
trace_pipe("ed!");

0 commit comments

Comments
 (0)