提交 570a7c05 编写于 作者: P Pavel Begunkov 提交者: Caspar Zhang

io-wq: reorder cancellation pending -> running

to #28736503

commit f4c2665e33f48904f2766d644df33fb3fd54b5ec upstream

Go all over all pending lists and cancel works there, and only then
try to match running requests. No functional changes here, just a
preparation for bulk cancellation.
Signed-off-by: NPavel Begunkov <asml.silence@gmail.com>
Signed-off-by: NJens Axboe <axboe@kernel.dk>
Signed-off-by: NXiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
Acked-by: NJoseph Qi <joseph.qi@linux.alibaba.com>
上级 819f9648
...@@ -933,7 +933,7 @@ static bool io_wq_worker_cancel(struct io_worker *worker, void *data) ...@@ -933,7 +933,7 @@ static bool io_wq_worker_cancel(struct io_worker *worker, void *data)
return ret; return ret;
} }
static enum io_wq_cancel io_wqe_cancel_work(struct io_wqe *wqe, static bool io_wqe_cancel_pending_work(struct io_wqe *wqe,
struct io_cb_cancel_data *match) struct io_cb_cancel_data *match)
{ {
struct io_wq_work_node *node, *prev; struct io_wq_work_node *node, *prev;
...@@ -941,11 +941,6 @@ static enum io_wq_cancel io_wqe_cancel_work(struct io_wqe *wqe, ...@@ -941,11 +941,6 @@ static enum io_wq_cancel io_wqe_cancel_work(struct io_wqe *wqe,
unsigned long flags; unsigned long flags;
bool found = false; bool found = false;
/*
* First check pending list, if we're lucky we can just remove it
* from there. CANCEL_OK means that the work is returned as-new,
* no completion will be posted for it.
*/
spin_lock_irqsave(&wqe->lock, flags); spin_lock_irqsave(&wqe->lock, flags);
wq_list_for_each(node, prev, &wqe->work_list) { wq_list_for_each(node, prev, &wqe->work_list) {
work = container_of(node, struct io_wq_work, list); work = container_of(node, struct io_wq_work, list);
...@@ -958,21 +953,20 @@ static enum io_wq_cancel io_wqe_cancel_work(struct io_wqe *wqe, ...@@ -958,21 +953,20 @@ static enum io_wq_cancel io_wqe_cancel_work(struct io_wqe *wqe,
} }
spin_unlock_irqrestore(&wqe->lock, flags); spin_unlock_irqrestore(&wqe->lock, flags);
if (found) { if (found)
io_run_cancel(work, wqe); io_run_cancel(work, wqe);
return IO_WQ_CANCEL_OK; return found;
} }
static bool io_wqe_cancel_running_work(struct io_wqe *wqe,
struct io_cb_cancel_data *match)
{
bool found;
/*
* Now check if a free (going busy) or busy worker has the work
* currently running. If we find it there, we'll return CANCEL_RUNNING
* as an indication that we attempt to signal cancellation. The
* completion will run normally in this case.
*/
rcu_read_lock(); rcu_read_lock();
found = io_wq_for_each_worker(wqe, io_wq_worker_cancel, match); found = io_wq_for_each_worker(wqe, io_wq_worker_cancel, match);
rcu_read_unlock(); rcu_read_unlock();
return found ? IO_WQ_CANCEL_RUNNING : IO_WQ_CANCEL_NOTFOUND; return found;
} }
enum io_wq_cancel io_wq_cancel_cb(struct io_wq *wq, work_cancel_fn *cancel, enum io_wq_cancel io_wq_cancel_cb(struct io_wq *wq, work_cancel_fn *cancel,
...@@ -982,18 +976,34 @@ enum io_wq_cancel io_wq_cancel_cb(struct io_wq *wq, work_cancel_fn *cancel, ...@@ -982,18 +976,34 @@ enum io_wq_cancel io_wq_cancel_cb(struct io_wq *wq, work_cancel_fn *cancel,
.fn = cancel, .fn = cancel,
.data = data, .data = data,
}; };
enum io_wq_cancel ret = IO_WQ_CANCEL_NOTFOUND;
int node; int node;
/*
* First check pending list, if we're lucky we can just remove it
* from there. CANCEL_OK means that the work is returned as-new,
* no completion will be posted for it.
*/
for_each_node(node) {
struct io_wqe *wqe = wq->wqes[node];
if (io_wqe_cancel_pending_work(wqe, &match))
return IO_WQ_CANCEL_OK;
}
/*
* Now check if a free (going busy) or busy worker has the work
* currently running. If we find it there, we'll return CANCEL_RUNNING
* as an indication that we attempt to signal cancellation. The
* completion will run normally in this case.
*/
for_each_node(node) { for_each_node(node) {
struct io_wqe *wqe = wq->wqes[node]; struct io_wqe *wqe = wq->wqes[node];
ret = io_wqe_cancel_work(wqe, &match); if (io_wqe_cancel_running_work(wqe, &match))
if (ret != IO_WQ_CANCEL_NOTFOUND) return IO_WQ_CANCEL_RUNNING;
break;
} }
return ret; return IO_WQ_CANCEL_NOTFOUND;
} }
static bool io_wq_io_cb_cancel_data(struct io_wq_work *work, void *data) static bool io_wq_io_cb_cancel_data(struct io_wq_work *work, void *data)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册