mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-25 14:12:13 +00:00
MINOR: task: permanently flag tasklets waking themselves up
Commit a17664d829
("MEDIUM: tasks: automatically requeue into the bulk
queue an already running tasklet") tried to inflict a penalty to
self-requeuing tasks/tasklets which correspond to those involved in
large, high-latency data transfers, for the benefit of all other
processing which requires a low latency. However, it turns out that
while it ought to do this on a case-by-case basis, basing itself on
the RUNNING flag isn't accurate because this flag doesn't leave for
tasklets, so we'd rather need a distinct flag to tag such tasklets.
This commit introduces TASK_SELF_WAKING to mark tasklets acting like
this. For now it's still set when TASK_RUNNING is present but this
will have to change. The flag is kept across wakeups.
This commit is contained in:
parent
849d4f047f
commit
bb238834da
@ -245,10 +245,16 @@ static inline void tasklet_wakeup(struct tasklet *tl)
|
||||
if (likely(tl->tid < 0)) {
|
||||
/* this tasklet runs on the caller thread */
|
||||
if (LIST_ISEMPTY(&tl->list)) {
|
||||
if (tl->state & TASK_RUNNING)
|
||||
if (tl->state & TASK_SELF_WAKING) {
|
||||
LIST_ADDQ(&task_per_thread[tid].tasklets[TL_BULK], &tl->list);
|
||||
else
|
||||
}
|
||||
else if (tl->state & TASK_RUNNING) {
|
||||
_HA_ATOMIC_OR(&tl->state, TASK_SELF_WAKING);
|
||||
LIST_ADDQ(&task_per_thread[tid].tasklets[TL_BULK], &tl->list);
|
||||
}
|
||||
else {
|
||||
LIST_ADDQ(&task_per_thread[tid].tasklets[TL_URGENT], &tl->list);
|
||||
}
|
||||
_HA_ATOMIC_ADD(&tasks_run_queue, 1);
|
||||
}
|
||||
} else {
|
||||
|
@ -36,6 +36,7 @@
|
||||
#define TASK_QUEUED 0x0004 /* The task has been (re-)added to the run queue */
|
||||
#define TASK_SHARED_WQ 0x0008 /* The task's expiration may be updated by other
|
||||
* threads, must be set before first queue/wakeup */
|
||||
#define TASK_SELF_WAKING 0x0010 /* task/tasklet found waking itself */
|
||||
|
||||
#define TASK_WOKEN_INIT 0x0100 /* woken up for initialisation purposes */
|
||||
#define TASK_WOKEN_TIMER 0x0200 /* woken up because of expired timer */
|
||||
|
@ -329,7 +329,7 @@ static int run_tasks_from_list(struct list *list, int max)
|
||||
|
||||
while (done < max && !LIST_ISEMPTY(list)) {
|
||||
t = (struct task *)LIST_ELEM(list->n, struct tasklet *, list);
|
||||
state = (t->state & TASK_SHARED_WQ) | TASK_RUNNING;
|
||||
state = (t->state & (TASK_SHARED_WQ|TASK_SELF_WAKING)) | TASK_RUNNING;
|
||||
state = _HA_ATOMIC_XCHG(&t->state, state);
|
||||
__ha_barrier_atomic_store();
|
||||
__tasklet_remove_from_tasklet_list((struct tasklet *)t);
|
||||
|
Loading…
Reference in New Issue
Block a user