Commit 3bfa5bcb authored by Jens Axboe's avatar Jens Axboe
Browse files

io_uring: cleanup io_poll_remove_one() logic



We only need apoll in the one section, do the juggling with the work
restoration there. This removes a special case further down as well.

No functional changes in this patch.

Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 6a4d07cd
Loading
Loading
Loading
Loading
+13 −14
Original line number Diff line number Diff line
@@ -4470,34 +4470,33 @@ static bool __io_poll_remove_one(struct io_kiocb *req,
		do_complete = true;
	}
	spin_unlock(&poll->head->lock);
	hash_del(&req->hash_node);
	return do_complete;
}

static bool io_poll_remove_one(struct io_kiocb *req)
{
	struct async_poll *apoll = NULL;
	bool do_complete;

	if (req->opcode == IORING_OP_POLL_ADD) {
		io_poll_remove_double(req);
		do_complete = __io_poll_remove_one(req, &req->poll);
	} else {
		apoll = req->apoll;
		struct async_poll *apoll = req->apoll;

		/* non-poll requests have submit ref still */
		do_complete = __io_poll_remove_one(req, &req->apoll->poll);
		if (do_complete)
		do_complete = __io_poll_remove_one(req, &apoll->poll);
		if (do_complete) {
			io_put_req(req);
	}

	hash_del(&req->hash_node);

	if (do_complete && apoll) {
			/*
		 * restore ->work because we need to call io_req_work_drop_env.
			 * restore ->work because we will call
			 * io_req_work_drop_env below when dropping the
			 * final reference.
			 */
			memcpy(&req->work, &apoll->work, sizeof(req->work));
			kfree(apoll);
		}
	}

	if (do_complete) {
		io_cqring_fill_event(req, -ECANCELED);