work: proper timeout for new and rescheduled work

Takes work flag into consideration during initial and
rescheduled timeout setup.

Signed-off-by: Tomasz Lauda <tomasz.lauda@linux.intel.com>
This commit is contained in:
Tomasz Lauda 2019-01-17 17:59:35 +01:00 committed by Liam Girdwood
parent b749cd0fab
commit 1f97d44a3b
1 changed files with 13 additions and 12 deletions

View File

@ -379,8 +379,13 @@ void work_schedule(struct work_queue *queue, struct work *w, uint64_t timeout)
}
/* convert timeout micro seconds to CPU clock ticks */
w->timeout = queue->ticks_per_msec * timeout / 1000 +
work_get_timer(queue);
if (w->flags & WORK_SYNC)
w->timeout =
queue_calc_next_timeout(queue, work_get_timer(queue));
else
w->timeout =
queue_calc_next_timeout(queue,
work_shared_ctx->last_tick);
/* insert work into list */
list_item_prepend(&w->list, &queue->work);
@ -430,22 +435,18 @@ void work_reschedule(struct work_queue *queue, struct work *w, uint64_t timeout)
uint64_t time;
/* convert timeout micro seconds to CPU clock ticks */
time = queue->ticks_per_msec * timeout / 1000 +
work_get_timer(queue);
if (w->flags & WORK_SYNC)
time = queue_calc_next_timeout(queue, work_get_timer(queue));
else
time = queue_calc_next_timeout(queue,
work_shared_ctx->last_tick);
reschedule(queue, w, time);
}
void work_reschedule_default(struct work *w, uint64_t timeout)
{
struct work_queue *queue = *arch_work_queue_get();
uint64_t time;
/* convert timeout micro seconds to CPU clock ticks */
time = queue->ticks_per_msec * timeout / 1000 +
work_get_timer(queue);
reschedule(queue, w, time);
work_reschedule(*arch_work_queue_get(), w, timeout);
}
void work_reschedule_default_at(struct work *w, uint64_t time)