973 lines · 26.2 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0#include <linux/kernel.h>#include <linux/errno.h>#include <linux/fs.h>#include <linux/file.h>#include <linux/mm.h>#include <linux/slab.h>#include <linux/poll.h>#include <linux/hashtable.h>#include <linux/io_uring.h> #include <trace/events/io_uring.h> #include <uapi/linux/io_uring.h> #include "io_uring.h"#include "alloc_cache.h"#include "refs.h"#include "napi.h"#include "opdef.h"#include "kbuf.h"#include "poll.h"#include "cancel.h" struct io_poll_update {	struct file			*file;	u64				old_user_data;	u64				new_user_data;	__poll_t			events;	bool				update_events;	bool				update_user_data;}; struct io_poll_table {	struct poll_table_struct pt;	struct io_kiocb *req;	int nr_entries;	int error;	bool owning;	/* output value, set only if arm poll returns >0 */	__poll_t result_mask;}; #define IO_POLL_CANCEL_FLAG	BIT(31)#define IO_POLL_RETRY_FLAG	BIT(30)#define IO_POLL_REF_MASK	GENMASK(29, 0) /* * We usually have 1-2 refs taken, 128 is more than enough and we want to * maximise the margin between this amount and the moment when it overflows. */#define IO_POLL_REF_BIAS	128 #define IO_WQE_F_DOUBLE		1 static int io_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync,			void *key); static inline struct io_kiocb *wqe_to_req(struct wait_queue_entry *wqe){	unsigned long priv = (unsigned long)wqe->private; 	return (struct io_kiocb *)(priv & ~IO_WQE_F_DOUBLE);} static inline bool wqe_is_double(struct wait_queue_entry *wqe){	unsigned long priv = (unsigned long)wqe->private; 	return priv & IO_WQE_F_DOUBLE;} static bool io_poll_get_ownership_slowpath(struct io_kiocb *req){	int v; 	/*	 * poll_refs are already elevated and we don't have much hope for	 * grabbing the ownership. Instead of incrementing set a retry flag	 * to notify the loop that there might have been some change.	 */	v = atomic_fetch_or(IO_POLL_RETRY_FLAG, &req->poll_refs);	if (v & IO_POLL_REF_MASK)		return false;	return !(atomic_fetch_inc(&req->poll_refs) & IO_POLL_REF_MASK);} /* * If refs part of ->poll_refs (see IO_POLL_REF_MASK) is 0, it's free. We can * bump it and acquire ownership. It's disallowed to modify requests while not * owning it, that prevents from races for enqueueing task_work's and b/w * arming poll and wakeups. */static inline bool io_poll_get_ownership(struct io_kiocb *req){	if (unlikely((unsigned int)atomic_read(&req->poll_refs) >= IO_POLL_REF_BIAS))		return io_poll_get_ownership_slowpath(req);	return !(atomic_fetch_inc(&req->poll_refs) & IO_POLL_REF_MASK);} static void io_poll_mark_cancelled(struct io_kiocb *req){	atomic_or(IO_POLL_CANCEL_FLAG, &req->poll_refs);} static struct io_poll *io_poll_get_double(struct io_kiocb *req){	/* pure poll stashes this in ->async_data, poll driven retry elsewhere */	if (req->opcode == IORING_OP_POLL_ADD)		return req->async_data;	return req->apoll->double_poll;} static struct io_poll *io_poll_get_single(struct io_kiocb *req){	if (req->opcode == IORING_OP_POLL_ADD)		return io_kiocb_to_cmd(req, struct io_poll);	return &req->apoll->poll;} static void io_poll_req_insert(struct io_kiocb *req){	struct io_hash_table *table = &req->ctx->cancel_table;	u32 index = hash_long(req->cqe.user_data, table->hash_bits); 	lockdep_assert_held(&req->ctx->uring_lock); 	hlist_add_head(&req->hash_node, &table->hbs[index].list);} static void io_init_poll_iocb(struct io_poll *poll, __poll_t events){	poll->head = NULL;#define IO_POLL_UNMASK	(EPOLLERR|EPOLLHUP|EPOLLNVAL|EPOLLRDHUP)	/* mask in events that we always want/need */	poll->events = events | IO_POLL_UNMASK;	INIT_LIST_HEAD(&poll->wait.entry);	init_waitqueue_func_entry(&poll->wait, io_poll_wake);} static void io_poll_remove_waitq(struct io_poll *poll){	/*	 * If the waitqueue is being freed early but someone is already holds	 * ownership over it, we have to tear down the request as best we can.	 * That means immediately removing the request from its waitqueue and	 * preventing all further accesses to the waitqueue via the request.	 */	list_del_init(&poll->wait.entry); 	/*	 * Careful: this *must* be the last step, since as soon as req->head is	 * NULL'ed out, the request can be completed and freed, since	 * io_poll_remove_entry() will no longer need to take the waitqueue	 * lock.	 */	smp_store_release(&poll->head, NULL);} static inline void io_poll_remove_entry(struct io_poll *poll){	struct wait_queue_head *head = smp_load_acquire(&poll->head); 	if (head) {		spin_lock_irq(&head->lock);		io_poll_remove_waitq(poll);		spin_unlock_irq(&head->lock);	}} static void io_poll_remove_entries(struct io_kiocb *req){	/*	 * Nothing to do if neither of those flags are set. Avoid dipping	 * into the poll/apoll/double cachelines if we can.	 */	if (!(req->flags & (REQ_F_SINGLE_POLL | REQ_F_DOUBLE_POLL)))		return; 	/*	 * While we hold the waitqueue lock and the waitqueue is nonempty,	 * wake_up_pollfree() will wait for us.  However, taking the waitqueue	 * lock in the first place can race with the waitqueue being freed.	 *	 * We solve this as eventpoll does: by taking advantage of the fact that	 * all users of wake_up_pollfree() will RCU-delay the actual free.  If	 * we enter rcu_read_lock() and see that the pointer to the queue is	 * non-NULL, we can then lock it without the memory being freed out from	 * under us.	 *	 * Keep holding rcu_read_lock() as long as we hold the queue lock, in	 * case the caller deletes the entry from the queue, leaving it empty.	 * In that case, only RCU prevents the queue memory from being freed.	 */	rcu_read_lock();	if (req->flags & REQ_F_SINGLE_POLL)		io_poll_remove_entry(io_poll_get_single(req));	if (req->flags & REQ_F_DOUBLE_POLL)		io_poll_remove_entry(io_poll_get_double(req));	rcu_read_unlock();} enum {	IOU_POLL_DONE = 0,	IOU_POLL_NO_ACTION = 1,	IOU_POLL_REMOVE_POLL_USE_RES = 2,	IOU_POLL_REISSUE = 3,	IOU_POLL_REQUEUE = 4,}; static void __io_poll_execute(struct io_kiocb *req, int mask, unsigned tw_flags){	unsigned flags = tw_flags; 	io_req_set_res(req, mask, 0);	req->io_task_work.func = io_poll_task_func; 	trace_io_uring_task_add(req, mask); 	if (!(req->flags & REQ_F_POLL_NO_LAZY))		flags |= IOU_F_TWQ_LAZY_WAKE;	__io_req_task_work_add(req, flags);} static inline void io_poll_execute(struct io_kiocb *req, int res,				   unsigned tw_flags){	if (io_poll_get_ownership(req))		__io_poll_execute(req, res, tw_flags);} /* * All poll tw should go through this. Checks for poll events, manages * references, does rewait, etc. * * Returns a negative error on failure. IOU_POLL_NO_ACTION when no action * require, which is either spurious wakeup or multishot CQE is served. * IOU_POLL_DONE when it's done with the request, then the mask is stored in * req->cqe.res. IOU_POLL_REMOVE_POLL_USE_RES indicates to remove multishot * poll and that the result is stored in req->cqe. */static int io_poll_check_events(struct io_kiocb *req, io_tw_token_t tw){	int v; 	if (unlikely(tw.cancel))		return -ECANCELED; 	do {		v = atomic_read(&req->poll_refs); 		if (unlikely(v != 1)) {			/* tw should be the owner and so have some refs */			if (WARN_ON_ONCE(!(v & IO_POLL_REF_MASK)))				return IOU_POLL_NO_ACTION;			if (v & IO_POLL_CANCEL_FLAG)				return -ECANCELED;			/*			 * cqe.res contains only events of the first wake up			 * and all others are to be lost. Redo vfs_poll() to get			 * up to date state.			 */			if ((v & IO_POLL_REF_MASK) != 1)				req->cqe.res = 0; 			if (v & IO_POLL_RETRY_FLAG) {				req->cqe.res = 0;				/*				 * We won't find new events that came in between				 * vfs_poll and the ref put unless we clear the				 * flag in advance.				 */				atomic_andnot(IO_POLL_RETRY_FLAG, &req->poll_refs);				v &= ~IO_POLL_RETRY_FLAG;			}			v &= IO_POLL_REF_MASK;		} 		/* the mask was stashed in __io_poll_execute */		if (!req->cqe.res) {			__poll_t events = req->apoll_events;			struct poll_table_struct pt = { ._key = events }; 			req->cqe.res = vfs_poll(req->file, &pt) & events;			/*			 * We got woken with a mask, but someone else got to			 * it first. The above vfs_poll() doesn't add us back			 * to the waitqueue, so if we get nothing back, we			 * should be safe and attempt a reissue.			 */			if (unlikely(!req->cqe.res)) {				/* Multishot armed need not reissue */				if (!(events & EPOLLONESHOT))					continue;				return IOU_POLL_REISSUE;			}		}		if (req->apoll_events & EPOLLONESHOT)			return IOU_POLL_DONE; 		/* multishot, just fill a CQE and proceed */		if (!(req->flags & REQ_F_APOLL_MULTISHOT)) {			__poll_t mask = mangle_poll(req->cqe.res &						    req->apoll_events); 			if (!io_req_post_cqe(req, mask, IORING_CQE_F_MORE)) {				io_req_set_res(req, mask, 0);				return IOU_POLL_REMOVE_POLL_USE_RES;			}		} else {			int ret; 			/* multiple refs and HUP, ensure we loop once more */			if ((req->cqe.res & (POLLHUP | POLLRDHUP)) && v != 1)				v--; 			ret = io_poll_issue(req, tw);			if (ret == IOU_COMPLETE)				return IOU_POLL_REMOVE_POLL_USE_RES;			else if (ret == IOU_REQUEUE)				return IOU_POLL_REQUEUE;			if (ret != IOU_RETRY && ret < 0)				return ret;		} 		/* force the next iteration to vfs_poll() */		req->cqe.res = 0; 		/*		 * Release all references, retry if someone tried to restart		 * task_work while we were executing it.		 */	} while (atomic_sub_return(v, &req->poll_refs) & IO_POLL_REF_MASK); 	io_napi_add(req);	return IOU_POLL_NO_ACTION;} void io_poll_task_func(struct io_tw_req tw_req, io_tw_token_t tw){	struct io_kiocb *req = tw_req.req;	int ret; 	ret = io_poll_check_events(req, tw);	if (ret == IOU_POLL_NO_ACTION) {		return;	} else if (ret == IOU_POLL_REQUEUE) {		__io_poll_execute(req, 0, 0);		return;	}	io_poll_remove_entries(req);	/* task_work always has ->uring_lock held */	hash_del(&req->hash_node); 	if (req->opcode == IORING_OP_POLL_ADD) {		if (ret == IOU_POLL_DONE) {			struct io_poll *poll; 			poll = io_kiocb_to_cmd(req, struct io_poll);			req->cqe.res = mangle_poll(req->cqe.res & poll->events);		} else if (ret == IOU_POLL_REISSUE) {			io_req_task_submit(tw_req, tw);			return;		} else if (ret != IOU_POLL_REMOVE_POLL_USE_RES) {			req->cqe.res = ret;			req_set_fail(req);		} 		io_req_set_res(req, req->cqe.res, 0);		io_req_task_complete(tw_req, tw);	} else {		io_tw_lock(req->ctx, tw); 		if (ret == IOU_POLL_REMOVE_POLL_USE_RES)			io_req_task_complete(tw_req, tw);		else if (ret == IOU_POLL_DONE || ret == IOU_POLL_REISSUE)			io_req_task_submit(tw_req, tw);		else			io_req_defer_failed(req, ret);	}} static void io_poll_cancel_req(struct io_kiocb *req){	io_poll_mark_cancelled(req);	/* kick tw, which should complete the request */	io_poll_execute(req, 0, 0);} #define IO_ASYNC_POLL_COMMON	(EPOLLONESHOT | EPOLLPRI) static __cold int io_pollfree_wake(struct io_kiocb *req, struct io_poll *poll){	io_poll_mark_cancelled(req);	/* we have to kick tw in case it's not already */	io_poll_execute(req, 0, IOU_F_TWQ_IN_WAKE);	io_poll_remove_waitq(poll);	return 1;} static int io_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync,			void *key){	struct io_kiocb *req = wqe_to_req(wait);	struct io_poll *poll = container_of(wait, struct io_poll, wait);	__poll_t mask = key_to_poll(key); 	if (unlikely(mask & POLLFREE))		return io_pollfree_wake(req, poll); 	/* for instances that support it check for an event match first */	if (mask && !(mask & (poll->events & ~IO_ASYNC_POLL_COMMON)))		return 0; 	if (io_poll_get_ownership(req)) {		/*		 * If we trigger a multishot poll off our own wakeup path,		 * disable multishot as there is a circular dependency between		 * CQ posting and triggering the event.		 */		if (mask & EPOLL_URING_WAKE) {			poll->events |= EPOLLONESHOT;			req->apoll_events |= EPOLLONESHOT;		} 		/* optional, saves extra locking for removal in tw handler */		if (mask && poll->events & EPOLLONESHOT) {			io_poll_remove_waitq(poll);			if (wqe_is_double(wait))				req->flags &= ~REQ_F_DOUBLE_POLL;			else				req->flags &= ~REQ_F_SINGLE_POLL;		}		__io_poll_execute(req, mask, IOU_F_TWQ_IN_WAKE);	}	return 1;} /* fails only when polling is already completing by the first entry */static bool io_poll_double_prepare(struct io_kiocb *req){	struct wait_queue_head *head;	struct io_poll *poll = io_poll_get_single(req); 	/* head is RCU protected, see io_poll_remove_entries() comments */	rcu_read_lock();	head = smp_load_acquire(&poll->head);	/*	 * poll arm might not hold ownership and so race for req->flags with	 * io_poll_wake(). There is only one poll entry queued, serialise with	 * it by taking its head lock. As we're still arming the tw hanlder	 * is not going to be run, so there are no races with it.	 */	if (head) {		spin_lock_irq(&head->lock);		req->flags |= REQ_F_DOUBLE_POLL;		if (req->opcode == IORING_OP_POLL_ADD)			req->flags |= REQ_F_ASYNC_DATA;		spin_unlock_irq(&head->lock);	}	rcu_read_unlock();	return !!head;} static void __io_queue_proc(struct io_poll *poll, struct io_poll_table *pt,			    struct wait_queue_head *head,			    struct io_poll **poll_ptr){	struct io_kiocb *req = pt->req;	unsigned long wqe_private = (unsigned long) req; 	/*	 * The file being polled uses multiple waitqueues for poll handling	 * (e.g. one for read, one for write). Setup a separate io_poll	 * if this happens.	 */	if (unlikely(pt->nr_entries)) {		struct io_poll *first = poll; 		/* double add on the same waitqueue head, ignore */		if (first->head == head)			return;		/* already have a 2nd entry, fail a third attempt */		if (*poll_ptr) {			if ((*poll_ptr)->head == head)				return;			pt->error = -EINVAL;			return;		} 		poll = kmalloc_obj(*poll, GFP_ATOMIC);		if (!poll) {			pt->error = -ENOMEM;			return;		} 		/* mark as double wq entry */		wqe_private |= IO_WQE_F_DOUBLE;		io_init_poll_iocb(poll, first->events);		if (!io_poll_double_prepare(req)) {

Lines 1–500 of 973.