diff options
author | gibbs <gibbs@FreeBSD.org> | 2015-01-04 19:55:44 +0000 |
---|---|---|
committer | gibbs <gibbs@FreeBSD.org> | 2015-01-04 19:55:44 +0000 |
commit | 7646916ff089c355a68002d03e370cbee7257a36 (patch) | |
tree | 2544a011500870de18dccea5ae7774609f97951e /sbin | |
parent | 8c983408f92d71a82eab4da6311e4a9133158247 (diff) | |
download | FreeBSD-src-7646916ff089c355a68002d03e370cbee7257a36.zip FreeBSD-src-7646916ff089c355a68002d03e370cbee7257a36.tar.gz |
Prevent live-lock and access of destroyed data in taskqueue_drain_all().
Phabric: https://reviews.freebsd.org/D1247
Reviewed by: jhb, avg
Sponsored by: Spectra Logic Corporation
sys/kern_subr_taskqueue.c:
Modify taskqueue_drain_all() processing to use a temporary
"barrier task", rather than rely on a user task that may
be destroyed during taskqueue_drain_all()'s execution. The
barrier task is queued behind all previously queued tasks
and then has its priority elevated so that future tasks
cannot pass it in the queue.
Use a similar barrier scheme to drain threads processing
current tasks. This requires taskqueue_run_locked() to
insert and remove the taskqueue_busy object for the running
thread for every task processed.
share/man/man9/taskqueue.9:
Remove warning about live-lock issues with taskqueue_drain_all()
and indicate that it does not wait for tasks queued after
it begins processing.
Diffstat (limited to 'sbin')
0 files changed, 0 insertions, 0 deletions