MINOR: task: split the tasklet vs task code in process_runnable_tasks()
There are a number of tests there which are enforced on tasklets while
they will never apply (various handlers, destroyed task or not, arguments,
results, ...). Instead let's have a single TASK_IS_TASKLET() test and call
the tasklet processing function directly, skipping all the rest.
It now appears visible that the only unneeded code is the update to
curr_task that is never used for tasklets, except for opportunistic
reporting in the debug handler, which can only catch si_cs_io_cb,
which in practice doesn't appear in any report so the extra cost
incurred there is pointless.
This change alone removes 700 bytes of code, mostly in
process_runnable_tasks() and increases the performance by about
1%.
diff --git a/src/task.c b/src/task.c
index 1ad6b01..5aa9ae4 100644
--- a/src/task.c
+++ b/src/task.c
@@ -41,7 +41,7 @@
unsigned int nb_tasks_cur = 0; /* copy of the tasks count */
unsigned int niced_tasks = 0; /* number of niced tasks in the run queue */
-THREAD_LOCAL struct task *curr_task = NULL; /* task currently running or NULL */
+THREAD_LOCAL struct task *curr_task = NULL; /* task (not tasklet) currently running or NULL */
__decl_aligned_spinlock(rq_lock); /* spin lock related to run queue */
__decl_aligned_rwlock(wq_lock); /* RW lock related to the wait queue */
@@ -395,8 +395,6 @@
break;
state = _HA_ATOMIC_XCHG(&t->state, TASK_RUNNING);
__ha_barrier_atomic_store();
- if (!TASK_IS_TASKLET(t))
- _HA_ATOMIC_SUB(&tt->task_list_size, 1);
ti->flags &= ~TI_FL_STUCK; // this thread is still running
activity[tid].ctxsw++;
@@ -404,19 +402,28 @@
process = t->process;
t->calls++;
- if (unlikely(!TASK_IS_TASKLET(t) && t->call_date)) {
+ if (TASK_IS_TASKLET(t)) {
+ process(NULL, ctx, state);
+ max_processed--;
+ continue;
+ }
+
+ /* OK then this is a regular task */
+
+ _HA_ATOMIC_SUB(&tt->task_list_size, 1);
+ if (unlikely(t->call_date)) {
uint64_t now_ns = now_mono_time();
t->lat_time += now_ns - t->call_date;
t->call_date = now_ns;
}
- curr_task = (struct task *)t;
+ curr_task = t;
__ha_barrier_store();
if (likely(process == process_stream))
t = process_stream(t, ctx, state);
else if (process != NULL)
- t = process(TASK_IS_TASKLET(t) ? NULL : t, ctx, state);
+ t = process(t, ctx, state);
else {
__task_free(t);
curr_task = NULL;