]> git.ipfire.org Git - thirdparty/haproxy.git/commit
CLEANUP: task: move the barrier after clearing th_ctx->current
authorWilly Tarreau <w@1wt.eu>
Fri, 21 Feb 2025 10:22:57 +0000 (11:22 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 21 Feb 2025 17:31:46 +0000 (18:31 +0100)
commite7510d62306ec4152db3c171744e2e1ef6b8de63
treec7a2c7d18a2f46308e9ed9f021e42ac471977ed4
parenteb41d768f954d5c7360fd19ec69f9d707b900532
CLEANUP: task: move the barrier after clearing th_ctx->current

There's a barrier after releasing the current task in the scheduler.
However it's improperly placed, it's done after pool_free() while in
fact it must be done immediately after resetting the current pointer.
Indeed, the purpose is to make sure that nobody sees the task as valid
when it's in the process of being released. This is something that
could theoretically happen if interrupted by a signal in the inlined
code of pool_free() if the compiler decided to postpone the write to
->current. In practice since nothing fancy is done in the inlined part
of the function, there's currently no risk of reordering. But it could
happen if the underlying __pool_free() were to be inlined for example,
and in this case we could possibly observe th_ctx->current pointing
to something currently being destroyed.

With the barrier between the two, there's no risk anymore.
src/task.c