// SPDX-License-Identifier: GPL-2.0-or-later
/*
 *  fs/eventpoll.c (Efficient event retrieval implementation)
 *  Copyright (C) 2001,...,2009	 Davide Libenzi
 *
 *  Davide Libenzi <davidel@xmailserver.org>
 */

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/sched/signal.h>
#include <linux/fs.h>
#include <linux/file.h>
#include <linux/signal.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/poll.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/hash.h>
#include <linux/spinlock.h>
#include <linux/syscalls.h>
#include <linux/rbtree.h>
#include <linux/wait.h>
#include <linux/eventpoll.h>
#include <linux/mount.h>
#include <linux/bitops.h>
#include <linux/mutex.h>
#include <linux/anon_inodes.h>
#include <linux/device.h>
#include <linux/uaccess.h>
#include <asm/io.h>
#include <asm/mman.h>
#include <linux/atomic.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/compat.h>
#include <linux/rculist.h>
#include <linux/capability.h>
#include <linux/seqlock.h>
#include <net/busy_poll.h>

/*
 * fs/eventpoll.c - Efficient event polling ("epoll") kernel implementation.
 *
 *
 * Overview
 * --------
 *
 * Each epoll_create(2) returns an anonymous [eventpoll] file whose
 * ->private_data is a struct eventpoll. Each EPOLL_CTL_ADD installs
 * a struct epitem linking one (watched file, fd) pair back to that
 * eventpoll via the watched file's f_op->poll() wait queue(s). When
 * the watched file signals readiness, ep_poll_callback() fires and
 * marks the epitem ready. epoll_wait(2) drains the ready list under
 * ep->mtx, re-queueing items in level-triggered mode.
 *
 * epoll instances can watch other epoll instances up to EP_MAX_NESTS
 * deep; cycles are forbidden and detected at EPOLL_CTL_ADD time.
 *
 *
 * Locking
 * -------
 *
 * Three levels, acquired from outer to inner:
 *
 *   epnested_mutex   (global; rare; taken only for EPOLL_CTL_ADD
 *                     loop / path checks)
 *     > ep->mtx     (per-eventpoll; sleepable; serializes most ops)
 *       > ep->lock  (per-eventpoll; IRQ-safe spinlock)
 *
 *   file->f_lock    (per-file; NOT IRQ-safe; guards f_ep hlist ops;
 *                    nested inside ep->mtx, outside ep->lock)
 *
 * Rationale:
 *   - ep->lock is a spinlock because ep_poll_callback() is called from
 *     wake_up() which may run in hard-IRQ context. All ep->lock
 *     critical sections use spin_lock_irqsave().
 *   - ep->mtx is a sleepable mutex because the event delivery loop
 *     calls copy_to_user(), and ep_insert() may sleep in
 *     kmem_cache_alloc() and f_op->poll().
 *   - epnested_mutex is global because cycle detection needs a global
 *     view of the epoll topology; a per-object scheme would let two
 *     concurrent inserts (A into B, B into A) construct a cycle
 *     without either observer seeing it.
 *   - Per-ep ep->mtx is preferred for scalability elsewhere. Events
 *     that require epnested_mutex are rare.
 *
 * When EPOLL_CTL_ADD nests one eventpoll inside another we acquire
 * ep->mtx on both: outer first, target second. Since cycles are
 * forbidden the set of live ep->mtx holds is always a strict chain,
 * communicated to lockdep via mutex_lock_nested() subclasses derived
 * from the current recursion depth.
 *
 *
 * Field protection
 * ----------------
 *
 * struct eventpoll:
 *   mtx              - self
 *   rbr              - ep->mtx
 *   ovflist, rdllist - ep->lock (IRQ-safe)
 *   wq               - ep->lock for queue mutation
 *   poll_wait        - internal waitqueue spinlock
 *   refs             - file->f_lock for adds; ep->mtx for removes;
 *                      RCU for readers (hlist_del_rcu + kfree_rcu(ep))
 *   ws               - ep->mtx
 *   gen, loop_check_depth - epnested_mutex
 *   file, user       - immutable after setup
 *   refcount         - atomic (refcount_t)
 *   napi_*           - READ_ONCE / WRITE_ONCE
 *
 * struct epitem:
 *   rbn / rcu union  - rbn: ep->mtx (while epi is linked in ep->rbr).
 *                      rcu: written only by kfree_rcu(epi) on the free
 *                      path; otherwise untouched by epoll code.
 *   rdllink, next    - ep->lock
 *   ffd, ep          - immutable after ep_insert()
 *   pwqlist          - ep->mtx for writes; POLLFREE clears pwq->whead
 *                      via smp_store_release(), see below
 *   fllink           - file->f_lock for mutation; hlist_del_rcu +
 *                      kfree_rcu(epi) for safe RCU readers
 *   ws               - RCU (rcu_assign_pointer /
 *                      rcu_dereference_check(mtx))
 *   event            - ep->mtx for writes; lockless read in
 *                      ep_poll_callback pairs with smp_mb() in
 *                      ep_modify()
 *
 *
 * Ready-list state machine
 * ------------------------
 *
 * Readiness is tracked in two lists under ep->lock:
 *
 *   rdllist   - doubly-linked FIFO; the "current" ready list.
 *   ovflist   - singly-linked LIFO; used during a scan to catch
 *               events that arrive while rdllist is being iterated
 *               without ep->lock.
 *
 * Encoded in ep->ovflist:
 *   EP_UNACTIVE_PTR - no scan active; callback appends to rdllist.
 *   NULL            - scan active, no spill yet.
 *   pointer to epi  - scan active with spilled items (LIFO).
 *
 * Encoded in epi->ovflist_next:
 *   EP_UNACTIVE_PTR - epi is not on ovflist.
 *   otherwise       - next epi on ovflist (NULL at tail).
 *
 * ep_start_scan() flips "not scanning" to "scanning" and splices
 * rdllist into a caller-local scan_batch. ep_done_scan() drains ovflist
 * back to rdllist (list_add head-insert reverses LIFO to FIFO),
 * flips back to "not scanning", and re-splices any items the caller
 * left in scan_batch (e.g., level-triggered re-queues).
 *
 *
 * Removal paths
 * -------------
 *
 * Three paths dispose of epitems and/or eventpolls:
 *
 *   A. ep_remove()              - EPOLL_CTL_DEL and ep_insert()
 *                                 rollback. Caller holds ep->mtx.
 *   B. ep_clear_and_put()       - close of the epoll fd itself
 *                                 (ep_eventpoll_release).
 *   C. eventpoll_release_file() - close of a watched file, invoked
 *                                 from __fput().
 *
 * Coordination:
 *   A and C exclude each other via the watched file's refcount.
 *   A pins the file with epi_fget() before touching file->f_ep or
 *   file->f_lock; if the pin fails, __fput() is in flight and C
 *   will clean this epi up. See the epi_fget() block comment.
 *   A and B both hold ep->mtx serially. B walks the rbtree with
 *   rb_next() captured before ep_remove() erases the current node.
 *   B and C both take ep->mtx; the loser sees fewer entries or an
 *   empty file->f_ep.
 *
 * Within every path the internal order is strict:
 *   ep_unregister_pollwait()  - drain pwqlist; synchronizes with any
 *                                in-flight ep_poll_callback via the
 *                                watched wait-queue head's lock.
 *   ep_remove_file()          - hlist_del_rcu of epi->fllink and,
 *                                if last watcher, clear file->f_ep,
 *                                under file->f_lock.
 *   ep_remove_epi()           - rb_erase, rdllist unlink (ep->lock),
 *                                wakeup_source_unregister,
 *                                kfree_rcu(epi).
 *
 * kfree_rcu(epi) defers the free past RCU readers in
 * reverse_path_check_proc(); kfree_rcu(ep) defers past readers in
 * ep_get_upwards_depth_proc().
 *
 *
 * POLLFREE handshake
 * ------------------
 *
 * When a subsystem tears down a wait-queue head that an epitem is
 * registered on (binder, signalfd, ...), it wakes the callback with
 * POLLFREE and must RCU-defer the head's free. The store/load pair:
 *
 *   ep_poll_callback() POLLFREE branch:
 *     smp_store_release(&pwq->whead, NULL)
 *
 *   ep_remove_wait_queue():
 *     smp_load_acquire(&pwq->whead)
 *
 * See those sites for the full argument.
 */

/* Epoll private bits inside the event mask */
#define EP_PRIVATE_BITS (EPOLLWAKEUP | EPOLLONESHOT | EPOLLET | EPOLLEXCLUSIVE)

#define EPOLLINOUT_BITS (EPOLLIN | EPOLLOUT)

#define EPOLLEXCLUSIVE_OK_BITS (EPOLLINOUT_BITS | EPOLLERR | EPOLLHUP | \
				EPOLLWAKEUP | EPOLLET | EPOLLEXCLUSIVE)

/* Maximum number of nesting allowed inside epoll sets */
#define EP_MAX_NESTS 4

#define EP_MAX_EVENTS (INT_MAX / sizeof(struct epoll_event))

#define EP_UNACTIVE_PTR ((void *) -1L)

#define EP_ITEM_COST (sizeof(struct epitem) + sizeof(struct eppoll_entry))

/* Wait structure used by the poll hooks */
struct eppoll_entry {
	/* List header used to link this structure to the "struct epitem" */
	struct eppoll_entry *next;

	/* The "base" pointer is set to the container "struct epitem" */
	struct epitem *base;

	/*
	 * Wait queue item that will be linked to the target file wait
	 * queue head.
	 */
	wait_queue_entry_t wait;

	/* The wait queue head that linked the "wait" wait queue item */
	wait_queue_head_t *whead;
};

/*
 * Each file descriptor added to the eventpoll interface will
 * have an entry of this type linked to the "rbr" RB tree.
 * Avoid increasing the size of this struct, there can be many thousands
 * of these on a server and we do not want this to take another cache line.
 */
struct epitem {
	union {
		/* RB tree node links this structure to the eventpoll RB tree */
		struct rb_node rbn;
		/* Used to free the struct epitem */
		struct rcu_head rcu;
	};

	/* Link on the owning eventpoll's ready list (ep->rdllist). */
	struct list_head rdllink;

	/*
	 * Link on the owning eventpoll's scan-overflow list (ep->ovflist),
	 * EP_UNACTIVE_PTR when not linked. See epi_on_ovflist() /
	 * epi_clear_ovflist() and the "Ready-list state machine" section
	 * in the top-of-file banner.
	 */
	struct epitem *ovflist_next;

	/* The file descriptor information this item refers to */
	struct epoll_key ffd;

	/* List containing poll wait queues */
	struct eppoll_entry *pwqlist;

	/* The "container" of this item */
	struct eventpoll *ep;

	/* List header used to link this item to the "struct file" items list */
	struct hlist_node fllink;

	/* wakeup_source used when EPOLLWAKEUP is set */
	struct wakeup_source __rcu *ws;

	/* The structure that describe the interested events and the source fd */
	struct epoll_event event;
};

/*
 * This structure is stored inside the "private_data" member of the file
 * structure and represents the main data structure for the eventpoll
 * interface.
 */
struct eventpoll {
	/*
	 * This mutex is used to ensure that files are not removed
	 * while epoll is using them. This is held during the event
	 * collection loop, the file cleanup path, the epoll file exit
	 * code and the ctl operations.
	 */
	struct mutex mtx;

	/* Wait queue used by sys_epoll_wait() */
	wait_queue_head_t wq;

	/* Wait queue used by file->poll() */
	wait_queue_head_t poll_wait;

	/* List of ready file descriptors */
	struct list_head rdllist;

	/* Lock which protects rdllist and ovflist */
	spinlock_t lock;

	/* Protect switching between rdllist and ovflist */
	seqcount_spinlock_t seq;

	/* RB tree root used to store monitored fd structs */
	struct rb_root_cached rbr;

	/*
	 * This is a single linked list that chains all the "struct epitem" that
	 * happened while transferring ready events to userspace w/out
	 * holding ->lock.
	 */
	struct epitem *ovflist;

	/* wakeup_source used when ep_send_events or __ep_eventpoll_poll is running */
	struct wakeup_source *ws;

	/* The user that created the eventpoll descriptor */
	struct user_struct *user;

	struct file *file;

	/* used to optimize loop detection check */
	u64 gen;
	struct hlist_head refs;
	u8 loop_check_depth;

	/* usage count, orchestrates "struct eventpoll" disposal */
	refcount_t refcount;

	/* used to defer freeing past ep_get_upwards_depth_proc() RCU walk */
	struct rcu_head rcu;

#ifdef CONFIG_NET_RX_BUSY_POLL
	/* used to track busy poll napi_id */
	unsigned int napi_id;
	/* busy poll timeout */
	u32 busy_poll_usecs;
	/* busy poll packet budget */
	u16 busy_poll_budget;
	bool prefer_busy_poll;
#endif

#ifdef CONFIG_DEBUG_LOCK_ALLOC
	/* tracks wakeup nests for lockdep validation */
	u8 nests;
#endif
};

/* Wrapper struct used by poll queueing */
struct ep_pqueue {
	poll_table pt;
	struct epitem *epi;
};

/*
 * Configuration options available inside /proc/sys/fs/epoll/
 */
/* Maximum number of epoll watched descriptors, per user */
static long max_user_watches __read_mostly;

/*
 * Cycle and path-length checks at EPOLL_CTL_ADD
 * ---------------------------------------------
 *
 * When EPOLL_CTL_ADD creates a link that either targets an eventpoll
 * file or extends an existing chain of eventpolls, two checks run:
 *
 *   1. no cycle is being formed -- ep_loop_check() walks downward
 *      from the candidate target, and ep_get_upwards_depth_proc()
 *      walks upward from the outer ep, both bounded by EP_MAX_NESTS.
 *   2. no file accumulates more than path_limits[depth] wakeup paths
 *      of a given length -- reverse_path_check().
 *
 * Both need a global view of the epoll topology and must be atomic
 * with the insertion, so the check is serialized by epnested_mutex
 * and carries its scratch state on a stack-allocated struct
 * ep_ctl_ctx scoped to one do_epoll_ctl() call. Non-nested inserts
 * skip this machinery entirely and take only ep->mtx.
 *
 *   epnested_mutex     Serializes the whole check.
 *   loop_check_gen     Global monotonic stamp, bumped at the start of
 *                      a check and again at the end. ep->gen caches
 *                      the value under which ep was last visited by
 *                      ep_loop_check_proc() or
 *                      ep_get_upwards_depth_proc(); the post-check
 *                      bump ensures those cached stamps can no longer
 *                      equal loop_check_gen, so the
 *                      "ep->gen == loop_check_gen" trigger in
 *                      ep_ctl_lock() only fires while another check
 *                      is in flight.
 *
 * struct ep_ctl_ctx carries the rest (inserting_into, tfile_check_list,
 * path_count[]) through the walk; see its declaration below.
 *
 * Commits fdcfce93073d ("eventpoll: Fix integer overflow in
 * ep_loop_check_proc()") and f2e467a48287 ("eventpoll: Fix
 * semi-unbounded recursion") hardened the walk; any refactor must
 * preserve both bail-outs.
 */
static DEFINE_MUTEX(epnested_mutex);
static u64 loop_check_gen = 0;

#define PATH_ARR_SIZE 5

/*
 * Per-do_epoll_ctl() scratch for the loop / path checks. Allocated on
 * the caller's stack; populated by ep_ctl_lock() and the downward
 * walk; consumed by reverse_path_check(); released by ep_ctl_unlock().
 * Only valid while the caller holds epnested_mutex.
 */
struct ep_ctl_ctx {
	/*
	 * Outer eventpoll for one ep_loop_check(); if the downward walk
	 * reaches it the insert would form a cycle.
	 */
	struct eventpoll *inserting_into;

	/*
	 * Singly-linked list of epitems_head objects collected during
	 * ep_loop_check_proc(), then walked by reverse_path_check().
	 * Terminated by EP_UNACTIVE_PTR, not NULL: epitems_head->next
	 * doubles as a membership flag (a NULL ->next means "not on this
	 * list", see ep_remove_file()), so the list uses a non-NULL
	 * sentinel to keep the tail head distinguishable from an unlisted
	 * one.
	 */
	struct epitems_head *tfile_check_list;

	/*
	 * Per-depth wakeup-path tally used by reverse_path_check_proc();
	 * reinitialized to zero at the start of each reverse_path_check()
	 * iteration.
	 */
	int path_count[PATH_ARR_SIZE];
};

/* Slab cache used to allocate "struct epitem" */
static struct kmem_cache *epi_cache __ro_after_init;

/* Slab cache used to allocate "struct eppoll_entry" */
static struct kmem_cache *pwq_cache __ro_after_init;

/*
 * Wrapper anchor for file->f_ep when the watched file is not itself an
 * eventpoll; for the epoll-watches-epoll case, file->f_ep points at
 * &watched_ep->refs directly. The ->next field threads
 * ctx->tfile_check_list during one EPOLL_CTL_ADD path check. The ->file
 * field holds a reference to the associated file while the head is on
 * the list.
 */
struct epitems_head {
	struct hlist_head epitems;
	struct epitems_head *next;
	struct file *file;
};

static struct kmem_cache *ephead_cache __ro_after_init;

static inline void free_ephead(struct epitems_head *head)
{
	if (head)
		kmem_cache_free(ephead_cache, head);
}

static void list_file(struct file *file, struct ep_ctl_ctx *ctx)
{
	struct epitems_head *head;

	head = container_of(file->f_ep, struct epitems_head, epitems);
	if (!head->next) {
		/*
		 * The caller owns a reference to @file or holds the ep->mtx for the
		 * epitem that led here. The latter blocks eventpoll_release_file()
		 * before the file allocation can be freed and reused. A dying leaf
		 * can be skipped since removing links cannot increase the reverse
		 * path count.
		 */
		if (!file_ref_get(&file->f_ref))
			return;
		head->file = file;
		head->next = ctx->tfile_check_list;
		ctx->tfile_check_list = head;
	}
}

static void unlist_file(struct epitems_head *head)
{
	struct epitems_head *to_free = head;
	struct hlist_node *p = rcu_dereference(hlist_first_rcu(&head->epitems));
	struct file *file = head->file;
	if (p) {
		struct epitem *epi= container_of(p, struct epitem, fllink);
		spin_lock(&epi->ffd.file->f_lock);
		if (!hlist_empty(&head->epitems))
			to_free = NULL;
		head->next = NULL;
		head->file = NULL;
		spin_unlock(&epi->ffd.file->f_lock);
	}
	free_ephead(to_free);
	fput(file);
}

#ifdef CONFIG_SYSCTL

#include <linux/sysctl.h>

static long long_zero;
static long long_max = LONG_MAX;

static const struct ctl_table epoll_table[] = {
	{
		.procname	= "max_user_watches",
		.data		= &max_user_watches,
		.maxlen		= sizeof(max_user_watches),
		.mode		= 0644,
		.proc_handler	= proc_doulongvec_minmax,
		.extra1		= &long_zero,
		.extra2		= &long_max,
	},
};

static void __init epoll_sysctls_init(void)
{
	register_sysctl("fs/epoll", epoll_table);
}
#else
#define epoll_sysctls_init() do { } while (0)
#endif /* CONFIG_SYSCTL */

static const struct file_operations eventpoll_fops;

bool is_file_epoll(struct file *f)
{
	return f->f_op == &eventpoll_fops;
}

/* Compare RB tree keys */
static inline int ep_cmp_ffd(struct epoll_key *p1, struct epoll_key *p2)
{
	return (p1->file > p2->file ? +1:
	        (p1->file < p2->file ? -1 : p1->fd - p2->fd));
}

/* True iff @epi is on its owning ep's ready list. */
static inline bool ep_is_linked(struct epitem *epi)
{
	return !list_empty(&epi->rdllink);
}

static inline struct eppoll_entry *ep_pwq_from_wait(wait_queue_entry_t *p)
{
	return container_of(p, struct eppoll_entry, wait);
}

/* Get the "struct epitem" from a wait queue pointer */
static inline struct epitem *ep_item_from_wait(wait_queue_entry_t *p)
{
	return container_of(p, struct eppoll_entry, wait)->base;
}

/*
 * Ready-list / ovflist state (see "Ready-list state machine" in the
 * top-of-file banner for the full state machine). EP_UNACTIVE_PTR is
 * the sentinel; these wrappers name each transition and each test so
 * call sites do not need to know the sentinel's value.
 */

/* True iff @ep is between ep_enter_scan() and ep_exit_scan(). */
static inline bool ep_is_scanning(struct eventpoll *ep)
{
	return READ_ONCE(ep->ovflist) != EP_UNACTIVE_PTR;
}

/* Called by ep_start_scan(): divert ep_poll_callback() to ovflist. */
static inline void ep_enter_scan(struct eventpoll *ep)
{
	WRITE_ONCE(ep->ovflist, NULL);
}

/* Called by ep_done_scan(): redirect ep_poll_callback() back to rdllist. */
static inline void ep_exit_scan(struct eventpoll *ep)
{
	WRITE_ONCE(ep->ovflist, EP_UNACTIVE_PTR);
}

/* True iff @epi is currently linked on its ep's ovflist. */
static inline bool epi_on_ovflist(const struct epitem *epi)
{
	return epi->ovflist_next != EP_UNACTIVE_PTR;
}

/* Mark @epi as not on any ovflist (init and post-drain). */
static inline void epi_clear_ovflist(struct epitem *epi)
{
	epi->ovflist_next = EP_UNACTIVE_PTR;
}

/* True iff @ep has ready events that epoll_wait() might harvest. */
static inline bool ep_events_available(struct eventpoll *ep)
{
	unsigned int seq = read_seqcount_begin(&ep->seq);

	return !list_empty_careful(&ep->rdllist) || ep_is_scanning(ep) ||
		read_seqcount_retry(&ep->seq, seq);
}

#ifdef CONFIG_NET_RX_BUSY_POLL
/**
 * busy_loop_ep_timeout - check if busy poll has timed out. The timeout value
 * from the epoll instance ep is preferred, but if it is not set fallback to
 * the system-wide global via busy_loop_timeout.
 *
 * @start_time: The start time used to compute the remaining time until timeout.
 * @ep: Pointer to the eventpoll context.
 *
 * Return: true if the timeout has expired, false otherwise.
 */
static bool busy_loop_ep_timeout(unsigned long start_time,
				 struct eventpoll *ep)
{
	unsigned long bp_usec = READ_ONCE(ep->busy_poll_usecs);

	if (bp_usec) {
		unsigned long end_time = start_time + bp_usec;
		unsigned long now = busy_loop_current_time();

		return time_after(now, end_time);
	} else {
		return busy_loop_timeout(start_time);
	}
}

static bool ep_busy_loop_on(struct eventpoll *ep)
{
	return !!READ_ONCE(ep->busy_poll_usecs) ||
	       READ_ONCE(ep->prefer_busy_poll) ||
	       net_busy_loop_on();
}

static bool ep_busy_loop_end(void *p, unsigned long start_time)
{
	struct eventpoll *ep = p;

	return ep_events_available(ep) || busy_loop_ep_timeout(start_time, ep);
}

/*
 * Busy poll if globally on and supporting sockets found && no events,
 * busy loop will return if need_resched or ep_events_available.
 *
 * we must do our busy polling with irqs enabled
 */
static bool ep_busy_loop(struct eventpoll *ep)
{
	unsigned int napi_id = READ_ONCE(ep->napi_id);
	u16 budget = READ_ONCE(ep->busy_poll_budget);
	bool prefer_busy_poll = READ_ONCE(ep->prefer_busy_poll);

	if (!budget)
		budget = BUSY_POLL_BUDGET;

	if (napi_id_valid(napi_id) && ep_busy_loop_on(ep)) {
		napi_busy_loop(napi_id, ep_busy_loop_end,
			       ep, prefer_busy_poll, budget);
		if (ep_events_available(ep))
			return true;
		/*
		 * Busy poll timed out.  Drop NAPI ID for now, we can add
		 * it back in when we have moved a socket with a valid NAPI
		 * ID onto the ready list.
		 */
		if (prefer_busy_poll)
			napi_resume_irqs(napi_id);
		ep->napi_id = 0;
		return false;
	}
	return false;
}

/*
 * Set epoll busy poll NAPI ID from sk.
 */
static inline void ep_set_busy_poll_napi_id(struct epitem *epi)
{
	struct eventpoll *ep = epi->ep;
	unsigned int napi_id;
	struct socket *sock;
	struct sock *sk;

	if (!ep_busy_loop_on(ep))
		return;

	sock = sock_from_file(epi->ffd.file);
	if (!sock)
		return;

	sk = sock->sk;
	if (!sk)
		return;

	napi_id = READ_ONCE(sk->sk_napi_id);

	/* Non-NAPI IDs can be rejected
	 *	or
	 * Nothing to do if we already have this ID
	 */
	if (!napi_id_valid(napi_id) || napi_id == ep->napi_id)
		return;

	/* record NAPI ID for use in next busy poll */
	ep->napi_id = napi_id;
}

static long ep_eventpoll_bp_ioctl(struct file *file, unsigned int cmd,
				  unsigned long arg)
{
	struct eventpoll *ep = file->private_data;
	void __user *uarg = (void __user *)arg;
	struct epoll_params epoll_params;

	switch (cmd) {
	case EPIOCSPARAMS:
		if (copy_from_user(&epoll_params, uarg, sizeof(epoll_params)))
			return -EFAULT;

		/* pad byte must be zero */
		if (epoll_params.__pad)
			return -EINVAL;

		if (epoll_params.busy_poll_usecs > S32_MAX)
			return -EINVAL;

		if (epoll_params.prefer_busy_poll > 1)
			return -EINVAL;

		if (epoll_params.busy_poll_budget > NAPI_POLL_WEIGHT &&
		    !capable(CAP_NET_ADMIN))
			return -EPERM;

		WRITE_ONCE(ep->busy_poll_usecs, epoll_params.busy_poll_usecs);
		WRITE_ONCE(ep->busy_poll_budget, epoll_params.busy_poll_budget);
		WRITE_ONCE(ep->prefer_busy_poll, epoll_params.prefer_busy_poll);
		return 0;
	case EPIOCGPARAMS:
		memset(&epoll_params, 0, sizeof(epoll_params));
		epoll_params.busy_poll_usecs = READ_ONCE(ep->busy_poll_usecs);
		epoll_params.busy_poll_budget = READ_ONCE(ep->busy_poll_budget);
		epoll_params.prefer_busy_poll = READ_ONCE(ep->prefer_busy_poll);
		if (copy_to_user(uarg, &epoll_params, sizeof(epoll_params)))
			return -EFAULT;
		return 0;
	default:
		return -ENOIOCTLCMD;
	}
}

static void ep_suspend_napi_irqs(struct eventpoll *ep)
{
	unsigned int napi_id = READ_ONCE(ep->napi_id);

	if (napi_id_valid(napi_id) && READ_ONCE(ep->prefer_busy_poll))
		napi_suspend_irqs(napi_id);
}

static void ep_resume_napi_irqs(struct eventpoll *ep)
{
	unsigned int napi_id = READ_ONCE(ep->napi_id);

	if (napi_id_valid(napi_id) && READ_ONCE(ep->prefer_busy_poll))
		napi_resume_irqs(napi_id);
}

#else

static inline bool ep_busy_loop(struct eventpoll *ep)
{
	return false;
}

static inline void ep_set_busy_poll_napi_id(struct epitem *epi)
{
}

static long ep_eventpoll_bp_ioctl(struct file *file, unsigned int cmd,
				  unsigned long arg)
{
	return -EOPNOTSUPP;
}

static void ep_suspend_napi_irqs(struct eventpoll *ep)
{
}

static void ep_resume_napi_irqs(struct eventpoll *ep)
{
}

#endif /* CONFIG_NET_RX_BUSY_POLL */

/*
 * As described in commit 0ccf831cb lockdep: annotate epoll
 * the use of wait queues used by epoll is done in a very controlled
 * manner. Wake ups can nest inside each other, but are never done
 * with the same locking. For example:
 *
 *   dfd = socket(...);
 *   efd1 = epoll_create();
 *   efd2 = epoll_create();
 *   epoll_ctl(efd1, EPOLL_CTL_ADD, dfd, ...);
 *   epoll_ctl(efd2, EPOLL_CTL_ADD, efd1, ...);
 *
 * When a packet arrives to the device underneath "dfd", the net code will
 * issue a wake_up() on its poll wake list. Epoll (efd1) has installed a
 * callback wakeup entry on that queue, and the wake_up() performed by the
 * "dfd" net code will end up in ep_poll_callback(). At this point epoll
 * (efd1) notices that it may have some event ready, so it needs to wake up
 * the waiters on its poll wait list (efd2). So it calls ep_poll_safewake()
 * that ends up in another wake_up(), after having checked about the
 * recursion constraints. That are, no more than EP_MAX_NESTS, to avoid
 * stack blasting.
 *
 * When CONFIG_DEBUG_LOCK_ALLOC is enabled, make sure lockdep can handle
 * this special case of epoll.
 */
#ifdef CONFIG_DEBUG_LOCK_ALLOC

static void ep_poll_safewake(struct eventpoll *ep, struct epitem *epi,
			     unsigned pollflags)
{
	struct eventpoll *ep_src;
	unsigned long flags;
	u8 nests = 0;

	/*
	 * To set the subclass or nesting level for spin_lock_irqsave_nested()
	 * it might be natural to create a per-cpu nest count. However, since
	 * we can recurse on ep->poll_wait.lock, and a non-raw spinlock can
	 * schedule() in the -rt kernel, the per-cpu variable are no longer
	 * protected. Thus, we are introducing a per eventpoll nest field.
	 * If we are not being call from ep_poll_callback(), epi is NULL and
	 * we are at the first level of nesting, 0. Otherwise, we are being
	 * called from ep_poll_callback() and if a previous wakeup source is
	 * not an epoll file itself, we are at depth 1 since the wakeup source
	 * is depth 0. If the wakeup source is a previous epoll file in the
	 * wakeup chain then we use its nests value and record ours as
	 * nests + 1. The previous epoll file nests value is stable since its
	 * already holding its own poll_wait.lock.
	 */
	if (epi) {
		if ((is_file_epoll(epi->ffd.file))) {
			ep_src = epi->ffd.file->private_data;
			nests = ep_src->nests;
		} else {
			nests = 1;
		}
	}
	spin_lock_irqsave_nested(&ep->poll_wait.lock, flags, nests);
	ep->nests = nests + 1;
	wake_up_locked_poll(&ep->poll_wait, EPOLLIN | pollflags);
	ep->nests = 0;
	spin_unlock_irqrestore(&ep->poll_wait.lock, flags);
}

#else

static void ep_poll_safewake(struct eventpoll *ep, struct epitem *epi,
			     __poll_t pollflags)
{
	wake_up_poll(&ep->poll_wait, EPOLLIN | pollflags);
}

#endif

static void ep_remove_wait_queue(struct eppoll_entry *pwq)
{
	wait_queue_head_t *whead;

	rcu_read_lock();
	/*
	 * POLLFREE handshake, acquire side; see "POLLFREE handshake"
	 * at the top of this file.
	 *
	 * A NULL load is paired with the smp_store_release(&whead, NULL)
	 * in ep_poll_callback()'s POLLFREE branch: the teardown is
	 * complete and we must not touch whead again. On a non-NULL load
	 * rcu_read_lock() keeps the waitqueue memory alive (POLLFREE
	 * firers RCU-defer the free) and whead->lock inside
	 * remove_wait_queue() serializes us against the store side.
	 */
	whead = smp_load_acquire(&pwq->whead);
	if (whead)
		remove_wait_queue(whead, &pwq->wait);
	rcu_read_unlock();
}

/*
 * This function unregisters poll callbacks from the associated file
 * descriptor.  Must be called with "mtx" held.
 */
static void ep_unregister_pollwait(struct eventpoll *ep, struct epitem *epi)
{
	struct eppoll_entry **p = &epi->pwqlist;
	struct eppoll_entry *pwq;

	while ((pwq = *p) != NULL) {
		*p = pwq->next;
		ep_remove_wait_queue(pwq);
		kmem_cache_free(pwq_cache, pwq);
	}
}

/* call only when ep->mtx is held */
static inline struct wakeup_source *ep_wakeup_source(struct epitem *epi)
{
	return rcu_dereference_check(epi->ws, lockdep_is_held(&epi->ep->mtx));
}

/* call only when ep->mtx is held */
static inline void ep_pm_stay_awake(struct epitem *epi)
{
	struct wakeup_source *ws = ep_wakeup_source(epi);

	if (ws)
		__pm_stay_awake(ws);
}

static inline bool ep_has_wakeup_source(struct epitem *epi)
{
	return rcu_access_pointer(epi->ws) ? true : false;
}

/* call when ep->mtx cannot be held (ep_poll_callback) */
static inline void ep_pm_stay_awake_rcu(struct epitem *epi)
{
	struct wakeup_source *ws;

	rcu_read_lock();
	ws = rcu_dereference(epi->ws);
	if (ws)
		__pm_stay_awake(ws);
	rcu_read_unlock();
}


/*
 * ep->mutex needs to be held because we could be hit by
 * eventpoll_release_file() and epoll_ctl().
 */
static void ep_start_scan(struct eventpoll *ep, struct list_head *scan_batch)
{
	/*
	 * Steal the ready list, and re-init the original one to the
	 * empty list. Also, set ep->ovflist to NULL so that events
	 * happening while looping w/out locks, are not lost. We cannot
	 * have the poll callback to queue directly on ep->rdllist,
	 * because we want the "sproc" callback to be able to do it
	 * in a lockless way.
	 */
	lockdep_assert_irqs_enabled();
	spin_lock_irq(&ep->lock);
	write_seqcount_begin(&ep->seq);

	list_splice_init(&ep->rdllist, scan_batch);
	ep_enter_scan(ep);

	write_seqcount_end(&ep->seq);
	spin_unlock_irq(&ep->lock);
}

static void ep_done_scan(struct eventpoll *ep,
			 struct list_head *scan_batch)
{
	struct epitem *epi, *nepi;

	spin_lock_irq(&ep->lock);
	/*
	 * During the time we spent inside the "sproc" callback, some
	 * other events might have been queued by the poll callback.
	 * We re-insert them inside the main ready-list here.
	 */
	for (nepi = READ_ONCE(ep->ovflist); (epi = nepi) != NULL; ) {
		nepi = epi->ovflist_next;
		epi_clear_ovflist(epi);
		/*
		 * Skip items that the caller already returned via @scan_batch
		 * -- the list_splice() below takes care of those.
		 */
		if (!ep_is_linked(epi)) {
			/*
			 * ovflist is LIFO; list_add() head-insert here
			 * reverses the iteration order into FIFO.
			 */
			list_add(&epi->rdllink, &ep->rdllist);
			ep_pm_stay_awake(epi);
		}
	}

	write_seqcount_begin(&ep->seq);

	/* Back out of scan mode; callbacks target ep->rdllist again. */
	ep_exit_scan(ep);

	/*
	 * Quickly re-inject items left on "scan_batch".
	 */
	list_splice(scan_batch, &ep->rdllist);

	write_seqcount_end(&ep->seq);

	__pm_relax(ep->ws);

	if (!list_empty(&ep->rdllist)) {
		if (waitqueue_active(&ep->wq))
			wake_up(&ep->wq);
	}

	spin_unlock_irq(&ep->lock);
}

static void ep_get(struct eventpoll *ep)
{
	refcount_inc(&ep->refcount);
}

/*
 * Drop a reference to @ep; returns true iff it was the last, in which
 * case the caller is responsible for ep_free().
 */
static bool ep_put(struct eventpoll *ep)
{
	if (!refcount_dec_and_test(&ep->refcount))
		return false;

	WARN_ON_ONCE(!RB_EMPTY_ROOT(&ep->rbr.rb_root));
	return true;
}

static void ep_free(struct eventpoll *ep)
{
	ep_resume_napi_irqs(ep);
	mutex_destroy(&ep->mtx);
	free_uid(ep->user);
	wakeup_source_unregister(ep->ws);
	/* ep_get_upwards_depth_proc() may still hold epi->ep under RCU */
	kfree_rcu(ep, rcu);
}

/*
 * Pin @epi->ffd.file for operations that require both safe dereference
 * and exclusion from __fput().
 *
 * struct file uses SLAB_TYPESAFE_BY_RCU, so a freed slot can be
 * reassigned at any time. The bare load of epi->ffd.file is safe here
 * because the caller holds ep->mtx and eventpoll_release_file() blocks
 * on that mutex while tearing down the epi, so the backing file
 * allocation cannot be freed and reused under us. An rcu_read_lock()
 * is therefore unnecessary for the load.
 *
 * A successful file_ref_get() additionally blocks __fput() from
 * starting on this file: once the refcount has reached zero it cannot
 * come back. ep_remove() relies on that to touch file->f_lock and
 * file->f_ep without racing eventpoll_release_file() (see commit
 * a6dc643c6931). A NULL return means __fput() is already in flight;
 * the caller must bail without touching the file, and
 * eventpoll_release_file() will clean the epi up from its side.
 */
static struct file *epi_fget(const struct epitem *epi)
{
	struct file *file;

	file = epi->ffd.file;
	if (!file_ref_get(&file->f_ref))
		file = NULL;
	return file;
}

/*
 * Takes &file->f_lock; returns with it released.
 */
static void ep_remove_file(struct eventpoll *ep, struct epitem *epi,
			     struct file *file)
{
	struct epitems_head *to_free = NULL;
	struct hlist_head *head;

	lockdep_assert_held(&ep->mtx);

	spin_lock(&file->f_lock);
	head = file->f_ep;
	if (hlist_is_singular_node(&epi->fllink, head)) {
		/*
		 * Last watcher: publish NULL so the eventpoll_release()
		 * fastpath in include/linux/eventpoll.h can skip the slow
		 * path on a future __fput(). Safe because every f_ep writer
		 * either holds a pin on @file via epi_fget() or is __fput()
		 * itself -- see the comment in eventpoll_release().
		 */
		WRITE_ONCE(file->f_ep, NULL);
		if (!is_file_epoll(file)) {
			struct epitems_head *v;
			v = container_of(head, struct epitems_head, epitems);
			if (!smp_load_acquire(&v->next))
				to_free = v;
		}
	}
	hlist_del_rcu(&epi->fllink);
	spin_unlock(&file->f_lock);
	free_ephead(to_free);
}

static void ep_remove_epi(struct eventpoll *ep, struct epitem *epi)
{
	lockdep_assert_held(&ep->mtx);

	rb_erase_cached(&epi->rbn, &ep->rbr);

	spin_lock_irq(&ep->lock);
	if (ep_is_linked(epi))
		list_del_init(&epi->rdllink);
	spin_unlock_irq(&ep->lock);

	wakeup_source_unregister(ep_wakeup_source(epi));
	/*
	 * At this point it is safe to free the eventpoll item. Use the union
	 * field epi->rcu, since we are trying to minimize the size of
	 * 'struct epitem'. The 'rbn' field is no longer in use. Protected by
	 * ep->mtx. The rcu read side, reverse_path_check_proc(), does not make
	 * use of the rbn field.
	 */
	kfree_rcu(epi, rcu);

	percpu_counter_dec(&ep->user->epoll_watches);
}

/*
 * ep_remove variant for callers owing an additional reference to the ep
 */
static void ep_remove(struct eventpoll *ep, struct epitem *epi)
{
	struct file *file __free(fput) = NULL;

	lockdep_assert_irqs_enabled();
	lockdep_assert_held(&ep->mtx);

	ep_unregister_pollwait(ep, epi);

	/*
	 * If we manage to grab a reference it means we're not in
	 * eventpoll_release_file() and aren't going to be: once @file's
	 * refcount has reached zero, file_ref_get() cannot bring it back.
	 */
	file = epi_fget(epi);
	if (!file)
		return;

	ep_remove_file(ep, epi, file);
	ep_remove_epi(ep, epi);
	WARN_ON_ONCE(ep_put(ep));
}

/*
 * Pass 1 of ep_clear_and_put(): drain every epi's pwqlist.
 * ep_unregister_pollwait() takes each watched wait-queue head's lock,
 * which synchronizes with any in-flight ep_poll_callback(); after
 * this returns no callback can still be about to dereference an epi
 * on this ep. Must strictly precede ep_drain_tree() -- fusing the
 * two walks would let a callback queued on epi_i still fire after
 * epi_{i+k} had already been freed.
 */
static void ep_drain_pollwaits(struct eventpoll *ep)
{
	struct rb_node *rbp;
	struct epitem *epi;

	lockdep_assert_held(&ep->mtx);

	for (rbp = rb_first_cached(&ep->rbr); rbp; rbp = rb_next(rbp)) {
		epi = rb_entry(rbp, struct epitem, rbn);

		ep_unregister_pollwait(ep, epi);
		cond_resched();
	}
}

/*
 * Pass 2 of ep_clear_and_put(): ep_remove() every epi. The per-epi
 * pwqlist is already empty (ep_drain_pollwaits ran), but the rest of
 * ep_remove() still runs: epi_fget() pin, f_ep clear under f_lock,
 * rbtree erase, rdllist unlink, kfree_rcu(epi). rb_next() is captured
 * before each erase so the iteration is stable.
 *
 * A concurrent eventpoll_release_file() (removal path C) on a watched
 * file serializes with us via ep->mtx; ep_remove() transparently
 * hands off any epi whose file is in __fput() by bailing when
 * epi_fget() returns NULL, and path C will clean that epi up.
 */
static void ep_drain_tree(struct eventpoll *ep)
{
	struct rb_node *rbp, *next;
	struct epitem *epi;

	lockdep_assert_held(&ep->mtx);

	for (rbp = rb_first_cached(&ep->rbr); rbp; rbp = next) {
		next = rb_next(rbp);
		epi = rb_entry(rbp, struct epitem, rbn);
		ep_remove(ep, epi);
		cond_resched();
	}
}

/*
 * Removal path B (see "Removal paths" in the top-of-file banner):
 * close of the epoll fd itself, reached via ep_eventpoll_release().
 *
 * Two passes under ep->mtx: first ep_drain_pollwaits() quiesces
 * in-flight callbacks, then ep_drain_tree() frees the epis. The
 * ep->refcount is kept > 0 across the walk by the ep file's own
 * share, which we drop below; ep_free() runs iff we were the last
 * holder after the tree drained.
 */
static void ep_clear_and_put(struct eventpoll *ep)
{
	/* Release any threads blocked in poll-on-ep. */
	if (waitqueue_active(&ep->poll_wait))
		ep_poll_safewake(ep, NULL, 0);

	mutex_lock(&ep->mtx);
	ep_drain_pollwaits(ep);
	ep_drain_tree(ep);
	mutex_unlock(&ep->mtx);

	if (ep_put(ep))
		ep_free(ep);
}

static long ep_eventpoll_ioctl(struct file *file, unsigned int cmd,
			       unsigned long arg)
{
	int ret;

	if (!is_file_epoll(file))
		return -EINVAL;

	switch (cmd) {
	case EPIOCSPARAMS:
	case EPIOCGPARAMS:
		ret = ep_eventpoll_bp_ioctl(file, cmd, arg);
		break;
	default:
		ret = -EINVAL;
		break;
	}

	return ret;
}

static int ep_eventpoll_release(struct inode *inode, struct file *file)
{
	struct eventpoll *ep = file->private_data;

	if (ep)
		ep_clear_and_put(ep);

	return 0;
}

static __poll_t ep_item_poll(const struct epitem *epi, poll_table *pt, int depth);

static __poll_t __ep_eventpoll_poll(struct file *file, poll_table *wait, int depth)
{
	struct eventpoll *ep = file->private_data;
	LIST_HEAD(scan_batch);
	struct epitem *epi, *tmp;
	poll_table pt;
	__poll_t res = 0;

	init_poll_funcptr(&pt, NULL);

	/* Insert inside our poll wait queue */
	poll_wait(file, &ep->poll_wait, wait);

	/*
	 * Proceed to find out if wanted events are really available inside
	 * the ready list.
	 */
	mutex_lock_nested(&ep->mtx, depth);
	ep_start_scan(ep, &scan_batch);
	list_for_each_entry_safe(epi, tmp, &scan_batch, rdllink) {
		if (ep_item_poll(epi, &pt, depth + 1)) {
			res = EPOLLIN | EPOLLRDNORM;
			break;
		} else {
			/*
			 * Item has been dropped into the ready list by the poll
			 * callback, but it's not actually ready, as far as
			 * caller requested events goes. We can remove it here.
			 */
			__pm_relax(ep_wakeup_source(epi));
			list_del_init(&epi->rdllink);
		}
	}
	ep_done_scan(ep, &scan_batch);
	mutex_unlock(&ep->mtx);
	return res;
}

/*
 * Differs from ep_eventpoll_poll() in that internal callers already have
 * the ep->mtx so we need to start from depth=1, such that mutex_lock_nested()
 * is correctly annotated.
 */
static __poll_t ep_item_poll(const struct epitem *epi, poll_table *pt,
				 int depth)
{
	struct file *file = epi_fget(epi);
	__poll_t res;

	/*
	 * We could return EPOLLERR | EPOLLHUP or something, but let's
	 * treat this more as "file doesn't exist, poll didn't happen".
	 */
	if (!file)
		return 0;

	pt->_key = epi->event.events;
	if (!is_file_epoll(file))
		res = vfs_poll(file, pt);
	else
		res = __ep_eventpoll_poll(file, pt, depth);
	fput(file);
	return res & epi->event.events;
}

static __poll_t ep_eventpoll_poll(struct file *file, poll_table *wait)
{
	return __ep_eventpoll_poll(file, wait, 0);
}

#ifdef CONFIG_PROC_FS
static void ep_show_fdinfo(struct seq_file *m, struct file *f)
{
	struct eventpoll *ep = f->private_data;
	struct rb_node *rbp;

	mutex_lock(&ep->mtx);
	for (rbp = rb_first_cached(&ep->rbr); rbp; rbp = rb_next(rbp)) {
		struct epitem *epi = rb_entry(rbp, struct epitem, rbn);
		struct inode *inode = file_inode(epi->ffd.file);

		seq_printf(m, "tfd: %8d events: %8x data: %16llx "
			   " pos:%lli ino:%llx sdev:%x\n",
			   epi->ffd.fd, epi->event.events,
			   (long long)epi->event.data,
			   (long long)epi->ffd.file->f_pos,
			   inode->i_ino, inode->i_sb->s_dev);
		if (seq_has_overflowed(m))
			break;
	}
	mutex_unlock(&ep->mtx);
}
#endif

/* File callbacks that implement the eventpoll file behaviour */
static const struct file_operations eventpoll_fops = {
#ifdef CONFIG_PROC_FS
	.show_fdinfo	= ep_show_fdinfo,
#endif
	.release	= ep_eventpoll_release,
	.poll		= ep_eventpoll_poll,
	.llseek		= noop_llseek,
	.unlocked_ioctl	= ep_eventpoll_ioctl,
	.compat_ioctl   = compat_ptr_ioctl,
};

/*
 * This is called from eventpoll_release() to unlink files from the eventpoll
 * interface. We need to have this facility to cleanup correctly files that are
 * closed without being removed from the eventpoll interface.
 */
void eventpoll_release_file(struct file *file)
{
	struct eventpoll *ep;
	struct epitem *epi;

	/*
	 * A concurrent ep_remove() cannot outrace us: it pins @file via
	 * epi_fget(), which fails once __fput() has dropped the refcount
	 * to zero -- the path we're on. So any racing ep_remove() bails
	 * and leaves the epi for us to clean up here.
	 */
again:
	spin_lock(&file->f_lock);
	if (file->f_ep && file->f_ep->first) {
		epi = hlist_entry(file->f_ep->first, struct epitem, fllink);
		spin_unlock(&file->f_lock);

		/*
		 * ep access is safe as we still own a reference to the ep
		 * struct
		 */
		ep = epi->ep;
		mutex_lock(&ep->mtx);

		ep_unregister_pollwait(ep, epi);

		ep_remove_file(ep, epi, file);
		ep_remove_epi(ep, epi);

		mutex_unlock(&ep->mtx);

		if (ep_put(ep))
			ep_free(ep);
		goto again;
	}
	spin_unlock(&file->f_lock);
}

static int ep_alloc(struct eventpoll **pep)
{
	struct eventpoll *ep;

	ep = kzalloc_obj(*ep);
	if (unlikely(!ep))
		return -ENOMEM;

	mutex_init(&ep->mtx);
	spin_lock_init(&ep->lock);
	seqcount_spinlock_init(&ep->seq, &ep->lock);
	init_waitqueue_head(&ep->wq);
	init_waitqueue_head(&ep->poll_wait);
	INIT_LIST_HEAD(&ep->rdllist);
	ep->rbr = RB_ROOT_CACHED;
	ep->ovflist = EP_UNACTIVE_PTR;	/* not scanning */
	ep->user = get_current_user();
	refcount_set(&ep->refcount, 1);

	*pep = ep;

	return 0;
}

/*
 * Search the file inside the eventpoll tree. The RB tree operations
 * are protected by the "mtx" mutex, and ep_find() must be called with
 * "mtx" held.
 */
static struct epitem *ep_find(struct eventpoll *ep, struct epoll_key *tf)
{
	int kcmp;
	struct rb_node *rbp;
	struct epitem *epi, *epir = NULL;

	for (rbp = ep->rbr.rb_root.rb_node; rbp; ) {
		epi = rb_entry(rbp, struct epitem, rbn);
		kcmp = ep_cmp_ffd(tf, &epi->ffd);
		if (kcmp > 0)
			rbp = rbp->rb_right;
		else if (kcmp < 0)
			rbp = rbp->rb_left;
		else {
			epir = epi;
			break;
		}
	}

	return epir;
}

/*
 * This is the callback that is passed to the wait queue wakeup
 * mechanism. It is called by the stored file descriptors when they
 * have events to report.
 */
static int ep_poll_callback(wait_queue_entry_t *wait, unsigned mode, int sync, void *key)
{
	int pwake = 0;
	struct epitem *epi = ep_item_from_wait(wait);
	struct eventpoll *ep = epi->ep;
	__poll_t pollflags = key_to_poll(key);
	unsigned long flags;
	int ewake = 0;

	spin_lock_irqsave(&ep->lock, flags);

	ep_set_busy_poll_napi_id(epi);

	/*
	 * If the event mask does not contain any poll(2) event, we consider the
	 * descriptor to be disabled. This condition is likely the effect of the
	 * EPOLLONESHOT bit that disables the descriptor when an event is received,
	 * until the next EPOLL_CTL_MOD will be issued.
	 */
	if (!(epi->event.events & ~EP_PRIVATE_BITS))
		goto out_unlock;

	/*
	 * Check the events coming with the callback. At this stage, not
	 * every device reports the events in the "key" parameter of the
	 * callback. We need to be able to handle both cases here, hence the
	 * test for "key" != NULL before the event match test.
	 */
	if (pollflags && !(pollflags & epi->event.events))
		goto out_unlock;

	/*
	 * If we are transferring events to userspace, we can hold no locks
	 * (because we're accessing user memory, and because of linux f_op->poll()
	 * semantics). All the events that happen during that period of time are
	 * chained in ep->ovflist and requeued later on.
	 */
	if (ep_is_scanning(ep)) {
		if (!epi_on_ovflist(epi)) {
			epi->ovflist_next = READ_ONCE(ep->ovflist);
			WRITE_ONCE(ep->ovflist, epi);
			ep_pm_stay_awake_rcu(epi);
		}
	} else if (!ep_is_linked(epi)) {
		/* In the usual case, add event to ready list. */
		list_add_tail(&epi->rdllink, &ep->rdllist);
		ep_pm_stay_awake_rcu(epi);
	}

	/*
	 * Wake up ( if active ) both the eventpoll wait list and the ->poll()
	 * wait list.
	 */
	if (waitqueue_active(&ep->wq)) {
		if ((epi->event.events & EPOLLEXCLUSIVE) &&
					!(pollflags & POLLFREE)) {
			switch (pollflags & EPOLLINOUT_BITS) {
			case EPOLLIN:
				if (epi->event.events & EPOLLIN)
					ewake = 1;
				break;
			case EPOLLOUT:
				if (epi->event.events & EPOLLOUT)
					ewake = 1;
				break;
			case 0:
				ewake = 1;
				break;
			}
		}
		if (sync)
			wake_up_sync(&ep->wq);
		else
			wake_up(&ep->wq);
	}
	if (waitqueue_active(&ep->poll_wait))
		pwake++;

out_unlock:
	spin_unlock_irqrestore(&ep->lock, flags);

	/* We have to call this outside the lock */
	if (pwake)
		ep_poll_safewake(ep, epi, pollflags & EPOLL_URING_WAKE);

	if (!(epi->event.events & EPOLLEXCLUSIVE))
		ewake = 1;

	if (pollflags & POLLFREE) {
		/*
		 * POLLFREE handshake, release side; see "POLLFREE handshake"
		 * at the top of this file.
		 *
		 * Unlink our wait entry with list_del_init rather than
		 * __remove_wait_queue: a concurrent ep_remove_wait_queue()
		 * that already loaded a non-NULL whead may still call
		 * remove_wait_queue() after us, and list_del_init() tolerates
		 * the second delete.
		 *
		 * smp_store_release(&whead, NULL) publishes the teardown to
		 * ep_remove_wait_queue()'s smp_load_acquire(). Before this
		 * store, a racing ep_clear_and_put() / ep_remove() reaches
		 * ep_remove_wait_queue() which sees whead != NULL and takes
		 * whead->lock -- the same lock held by our caller, so it
		 * serializes behind us. Once whead is zeroed, nothing else
		 * protects ep / epi / wait.
		 */
		list_del_init(&wait->entry);
		smp_store_release(&ep_pwq_from_wait(wait)->whead, NULL);
	}

	return ewake;
}

/*
 * This is the callback that is used to add our wait queue to the
 * target file wakeup lists.
 */
static void ep_ptable_queue_proc(struct file *file, wait_queue_head_t *whead,
				 poll_table *pt)
{
	struct ep_pqueue *epq = container_of(pt, struct ep_pqueue, pt);
	struct epitem *epi = epq->epi;
	struct eppoll_entry *pwq;

	if (unlikely(!epi))	// an earlier allocation has failed
		return;

	pwq = kmem_cache_alloc(pwq_cache, GFP_KERNEL);
	if (unlikely(!pwq)) {
		epq->epi = NULL;
		return;
	}

	init_waitqueue_func_entry(&pwq->wait, ep_poll_callback);
	pwq->whead = whead;
	pwq->base = epi;
	if (epi->event.events & EPOLLEXCLUSIVE)
		add_wait_queue_exclusive(whead, &pwq->wait);
	else
		add_wait_queue(whead, &pwq->wait);
	pwq->next = epi->pwqlist;
	epi->pwqlist = pwq;
}

static void ep_rbtree_insert(struct eventpoll *ep, struct epitem *epi)
{
	int kcmp;
	struct rb_node **p = &ep->rbr.rb_root.rb_node, *parent = NULL;
	struct epitem *epic;
	bool leftmost = true;

	while (*p) {
		parent = *p;
		epic = rb_entry(parent, struct epitem, rbn);
		kcmp = ep_cmp_ffd(&epi->ffd, &epic->ffd);
		if (kcmp > 0) {
			p = &parent->rb_right;
			leftmost = false;
		} else
			p = &parent->rb_left;
	}
	rb_link_node(&epi->rbn, parent, p);
	rb_insert_color_cached(&epi->rbn, &ep->rbr, leftmost);
}



/*
 * Upper bound on wakeup paths emanating from any one watched file,
 * indexed by path depth (1..PATH_ARR_SIZE). For example, we allow
 * 1000 paths of length 1 from each watched file. These caps limit
 * the wakeup amplification that can be built from epoll-watches-
 * epoll topologies without rejecting reasonable usage.
 *
 * Enforced at EPOLL_CTL_ADD; CTL_MOD and CTL_DEL cannot add paths.
 * The running tallies live in ctx->path_count[] and are protected by
 * epnested_mutex.
 */
static const int path_limits[PATH_ARR_SIZE] = { 1000, 500, 100, 50, 10 };

static int path_count_inc(struct ep_ctl_ctx *ctx, int nests)
{
	/* Allow an arbitrary number of depth 1 paths */
	if (nests == 0)
		return 0;

	if (++ctx->path_count[nests] > path_limits[nests])
		return -1;
	return 0;
}

static void path_count_init(struct ep_ctl_ctx *ctx)
{
	int i;

	for (i = 0; i < PATH_ARR_SIZE; i++)
		ctx->path_count[i] = 0;
}

static int reverse_path_check_proc(struct ep_ctl_ctx *ctx,
				   struct hlist_head *refs, int depth)
{
	int error = 0;
	struct epitem *epi;

	if (depth > EP_MAX_NESTS) /* too deep nesting */
		return -1;

	/* CTL_DEL can remove links here, but that can't increase our count */
	hlist_for_each_entry_rcu(epi, refs, fllink) {
		struct hlist_head *refs = &epi->ep->refs;
		if (hlist_empty(refs))
			error = path_count_inc(ctx, depth);
		else
			error = reverse_path_check_proc(ctx, refs, depth + 1);
		if (error != 0)
			break;
	}
	return error;
}

/**
 * reverse_path_check - ctx->tfile_check_list is a list of epitems_head
 *                      anchoring files with newly proposed links; make
 *                      sure those links don't push any path-length bucket
 *                      over its limit in path_limits[].
 * @ctx: Per-do_epoll_ctl() scratch for the loop / path checks.
 *
 * Return: %zero if the proposed links don't create too many paths,
 *	    %-1 otherwise.
 */
static int reverse_path_check(struct ep_ctl_ctx *ctx)
{
	struct epitems_head *p;

	for (p = ctx->tfile_check_list; p != EP_UNACTIVE_PTR; p = p->next) {
		int error;
		path_count_init(ctx);
		rcu_read_lock();
		error = reverse_path_check_proc(ctx, &p->epitems, 0);
		rcu_read_unlock();
		if (error)
			return error;
	}
	return 0;
}

static int ep_create_wakeup_source(struct epitem *epi)
{
	struct name_snapshot n;
	struct wakeup_source *ws;

	if (!epi->ep->ws) {
		epi->ep->ws = wakeup_source_register(NULL, "eventpoll");
		if (!epi->ep->ws)
			return -ENOMEM;
	}

	take_dentry_name_snapshot(&n, epi->ffd.file->f_path.dentry);
	ws = wakeup_source_register(NULL, n.name.name);
	release_dentry_name_snapshot(&n);

	if (!ws)
		return -ENOMEM;
	rcu_assign_pointer(epi->ws, ws);

	return 0;
}

/* rare code path, only used when EPOLL_CTL_MOD removes a wakeup source */
static noinline void ep_destroy_wakeup_source(struct epitem *epi)
{
	struct wakeup_source *ws = ep_wakeup_source(epi);

	RCU_INIT_POINTER(epi->ws, NULL);

	/*
	 * wait for ep_pm_stay_awake_rcu to finish, synchronize_rcu is
	 * used internally by wakeup_source_remove, too (called by
	 * wakeup_source_unregister), so we cannot use call_rcu
	 */
	synchronize_rcu();
	wakeup_source_unregister(ws);
}

static int ep_attach_file(struct file *file, struct epitem *epi)
{
	struct epitems_head *to_free = NULL;
	struct hlist_head *head = NULL;
	struct eventpoll *ep = NULL;

	if (is_file_epoll(file))
		ep = file->private_data;

	if (ep) {
		head = &ep->refs;
	} else if (!READ_ONCE(file->f_ep)) {
allocate:
		to_free = kmem_cache_zalloc(ephead_cache, GFP_KERNEL);
		if (!to_free)
			return -ENOMEM;
		head = &to_free->epitems;
	}
	spin_lock(&file->f_lock);
	if (!file->f_ep) {
		if (unlikely(!head)) {
			spin_unlock(&file->f_lock);
			goto allocate;
		}
		/* See eventpoll_release() for details. */
		WRITE_ONCE(file->f_ep, head);
		to_free = NULL;
	}
	hlist_add_head_rcu(&epi->fllink, file->f_ep);
	spin_unlock(&file->f_lock);
	free_ephead(to_free);
	return 0;
}

/*
 * Charge the user's epoll_watches quota, allocate a fresh epitem for
 * @tf, and initialize its fields. The returned item is not yet linked
 * into any data structure; the caller must install it via
 * ep_register_epitem() (which takes over on success) or kmem_cache_free()
 * it and decrement epoll_watches on its own.
 *
 * Returns ERR_PTR(-ENOSPC) if the quota is exceeded, ERR_PTR(-ENOMEM)
 * if the slab allocation fails.
 */
static struct epitem *ep_alloc_epitem(struct eventpoll *ep,
				      const struct epoll_event *event,
				      struct epoll_key *tf)
{
	struct epitem *epi;

	if (unlikely(percpu_counter_compare(&ep->user->epoll_watches,
					    max_user_watches) >= 0))
		return ERR_PTR(-ENOSPC);
	percpu_counter_inc(&ep->user->epoll_watches);

	epi = kmem_cache_zalloc(epi_cache, GFP_KERNEL);
	if (unlikely(!epi)) {
		percpu_counter_dec(&ep->user->epoll_watches);
		return ERR_PTR(-ENOMEM);
	}

	INIT_LIST_HEAD(&epi->rdllink);
	epi->ep = ep;
	epi->ffd = *tf;
	epi->event = *event;
	epi_clear_ovflist(epi);

	return epi;
}

/*
 * Install @epi into its target file's f_ep hlist and into @ep's rbtree,
 * taking one additional reference on @ep for the lifetime of the item.
 *
 * If @tep is non-NULL, the target file is itself an eventpoll; we hold
 * tep->mtx at subclass 1 across the attach + rbtree insert to serialize
 * with the target side. RB tree ops are protected by @ep->mtx, which
 * the caller already holds.
 *
 * On failure the epi is freed and the epoll_watches counter decremented,
 * matching ep_alloc_epitem()'s allocation. After this returns
 * successfully, ep_insert()'s later error paths use ep_remove() for
 * unwind; that cannot drop @ep's refcount to zero because the ep file
 * itself still holds the original reference.
 */
static int ep_register_epitem(struct ep_ctl_ctx *ctx, struct eventpoll *ep,
			      struct epitem *epi, struct eventpoll *tep,
			      int full_check)
{
	struct file *tfile = epi->ffd.file;
	int error;

	if (tep)
		mutex_lock_nested(&tep->mtx, 1);

	error = ep_attach_file(tfile, epi);
	if (unlikely(error)) {
		if (tep)
			mutex_unlock(&tep->mtx);
		kmem_cache_free(epi_cache, epi);
		percpu_counter_dec(&ep->user->epoll_watches);
		return error;
	}

	if (full_check && !tep)
		list_file(tfile, ctx);

	ep_rbtree_insert(ep, epi);

	if (tep)
		mutex_unlock(&tep->mtx);

	ep_get(ep);
	return 0;
}

/*
 * Must be called with "mtx" held.
 */
static int ep_insert(struct ep_ctl_ctx *ctx, struct eventpoll *ep,
		     const struct epoll_event *event, struct epoll_key *tf,
		     int full_check)
{
	int error, pwake = 0;
	__poll_t revents;
	struct epitem *epi;
	struct ep_pqueue epq;
	struct eventpoll *tep = NULL;

	if (is_file_epoll(tf->file))
		tep = tf->file->private_data;

	lockdep_assert_irqs_enabled();

	epi = ep_alloc_epitem(ep, event, tf);
	if (IS_ERR(epi))
		return PTR_ERR(epi);

	error = ep_register_epitem(ctx, ep, epi, tep, full_check);
	if (error)
		return error;

	/* Reject the insert if the new link would create too many back-paths. */
	if (unlikely(full_check && reverse_path_check(ctx))) {
		ep_remove(ep, epi);
		return -EINVAL;
	}

	if (epi->event.events & EPOLLWAKEUP) {
		error = ep_create_wakeup_source(epi);
		if (error) {
			ep_remove(ep, epi);
			return error;
		}
	}

	/* Initialize the poll table using the queue callback */
	epq.epi = epi;
	init_poll_funcptr(&epq.pt, ep_ptable_queue_proc);

	/*
	 * Attach the item to the poll hooks and get current event bits.
	 * We can safely use the file* here because its usage count has
	 * been increased by the caller of this function. Note that after
	 * this operation completes, the poll callback can start hitting
	 * the new item.
	 */
	revents = ep_item_poll(epi, &epq.pt, 1);

	/* ep_ptable_queue_proc() signals allocation failure by clearing epq.epi. */
	if (unlikely(!epq.epi)) {
		ep_remove(ep, epi);
		return -ENOMEM;
	}

	/* Drop the new item onto the ready list if it is already ready. */
	spin_lock_irq(&ep->lock);

	ep_set_busy_poll_napi_id(epi);

	if (revents && !ep_is_linked(epi)) {
		list_add_tail(&epi->rdllink, &ep->rdllist);
		ep_pm_stay_awake(epi);

		if (waitqueue_active(&ep->wq))
			wake_up(&ep->wq);
		if (waitqueue_active(&ep->poll_wait))
			pwake++;
	}

	spin_unlock_irq(&ep->lock);

	/* We have to call this outside the lock */
	if (pwake)
		ep_poll_safewake(ep, NULL, 0);

	return 0;
}

/*
 * Modify the interest event mask by dropping an event if the new mask
 * has a match in the current file status. Must be called with "mtx" held.
 */
static int ep_modify(struct eventpoll *ep, struct epitem *epi,
		     const struct epoll_event *event)
{
	int pwake = 0;
	poll_table pt;

	lockdep_assert_irqs_enabled();

	init_poll_funcptr(&pt, NULL);

	/*
	 * Set the new event interest mask before calling f_op->poll();
	 * otherwise we might miss an event that happens between the
	 * f_op->poll() call and the new event set registering.
	 */
	epi->event.events = event->events; /* need barrier below */
	epi->event.data = event->data; /* protected by mtx */
	if (epi->event.events & EPOLLWAKEUP) {
		if (!ep_has_wakeup_source(epi))
			ep_create_wakeup_source(epi);
	} else if (ep_has_wakeup_source(epi)) {
		ep_destroy_wakeup_source(epi);
	}

	/*
	 * The following barrier has two effects:
	 *
	 * 1) Flush epi changes above to other CPUs.  This ensures
	 *    we do not miss events from ep_poll_callback if an
	 *    event occurs immediately after we call f_op->poll().
	 *    We need this because we did not take ep->lock while
	 *    changing epi above (but ep_poll_callback does take
	 *    ep->lock).
	 *
	 * 2) We also need to ensure we do not miss _past_ events
	 *    when calling f_op->poll().  This barrier also
	 *    pairs with the barrier in wq_has_sleeper (see
	 *    comments for wq_has_sleeper).
	 *
	 * This barrier will now guarantee ep_poll_callback or f_op->poll
	 * (or both) will notice the readiness of an item.
	 */
	smp_mb();

	/*
	 * Get current event bits. We can safely use the file* here because
	 * its usage count has been increased by the caller of this function.
	 * If the item is "hot" and it is not registered inside the ready
	 * list, push it inside.
	 */
	if (ep_item_poll(epi, &pt, 1)) {
		spin_lock_irq(&ep->lock);
		if (!ep_is_linked(epi)) {
			list_add_tail(&epi->rdllink, &ep->rdllist);
			ep_pm_stay_awake(epi);

			/* Notify waiting tasks that events are available */
			if (waitqueue_active(&ep->wq))
				wake_up(&ep->wq);
			if (waitqueue_active(&ep->poll_wait))
				pwake++;
		}
		spin_unlock_irq(&ep->lock);
	}

	/* We have to call this outside the lock */
	if (pwake)
		ep_poll_safewake(ep, NULL, 0);

	return 0;
}

/*
 * Attempt to deliver one event for @epi into @*uevents.
 *
 * Returns 1 if an event was delivered (with *uevents advanced to the
 * next slot), 0 if the re-poll reported no caller-requested events
 * (@epi drops out of the ready list; a future callback will re-add
 * it), or -EFAULT if copy_to_user() faulted (in which case @epi is
 * re-inserted at the head of @scan_batch so ep_done_scan() merges it
 * back to rdllist for the next attempt).
 *
 * PM bookkeeping and level-triggered re-queue are handled here.
 * Caller holds ep->mtx and the scan is active.
 */
static int ep_deliver_event(struct eventpoll *ep, struct epitem *epi,
			    poll_table *pt,
			    struct epoll_event __user **uevents,
			    struct list_head *scan_batch)
{
	struct epoll_event __user *next;
	struct wakeup_source *ws;
	__poll_t revents;

	/*
	 * Activate ep->ws before deactivating epi->ws to prevent
	 * triggering auto-suspend here (in case we reactivate epi->ws
	 * below).  Rearranging to delay the deactivation would let
	 * epi->ws drift out of sync with ep_is_linked().
	 */
	ws = ep_wakeup_source(epi);
	if (ws) {
		if (ws->active)
			__pm_stay_awake(ep->ws);
		__pm_relax(ws);
	}

	list_del_init(&epi->rdllink);

	/*
	 * Re-poll under ep->mtx so userspace cannot change the item
	 * out from under us. If no caller-requested events remain,
	 * @epi stays off the ready list; the poll callback will
	 * re-queue it when events next appear.
	 */
	revents = ep_item_poll(epi, pt, 1);
	if (!revents)
		return 0;

	next = epoll_put_uevent(revents, epi->event.data, *uevents);
	if (!next) {
		/*
		 * copy_to_user() faulted: put the item back so
		 * ep_done_scan() splices it onto rdllist for the next
		 * attempt.
		 */
		list_add(&epi->rdllink, scan_batch);
		ep_pm_stay_awake(epi);
		return -EFAULT;
	}
	*uevents = next;

	if (epi->event.events & EPOLLONESHOT) {
		epi->event.events &= EP_PRIVATE_BITS;
	} else if (!(epi->event.events & EPOLLET)) {
		/*
		 * Level-triggered: re-queue so the next epoll_wait()
		 * rechecks availability. We are the sole writer to
		 * rdllist here -- epoll_ctl() callers are locked out
		 * by ep->mtx, and the poll callback queues to ovflist
		 * during scans.
		 */
		list_add_tail(&epi->rdllink, &ep->rdllist);
		ep_pm_stay_awake(epi);
	}
	return 1;
}

static int ep_send_events(struct eventpoll *ep,
			  struct epoll_event __user *events, int maxevents)
{
	struct epitem *epi, *tmp;
	LIST_HEAD(scan_batch);
	poll_table pt;
	int res = 0;

	/*
	 * Always short-circuit for fatal signals to allow threads to make a
	 * timely exit without the chance of finding more events available and
	 * fetching repeatedly.
	 */
	if (fatal_signal_pending(current))
		return -EINTR;

	init_poll_funcptr(&pt, NULL);

	mutex_lock(&ep->mtx);
	ep_start_scan(ep, &scan_batch);

	/*
	 * We can loop without lock because we are passed a task-private
	 * scan_batch; items cannot vanish while we hold ep->mtx.
	 */
	list_for_each_entry_safe(epi, tmp, &scan_batch, rdllink) {
		int delivered;

		if (res >= maxevents)
			break;

		delivered = ep_deliver_event(ep, epi, &pt, &events, &scan_batch);
		if (delivered < 0) {
			if (!res)
				res = delivered;
			break;
		}
		res += delivered;
	}

	ep_done_scan(ep, &scan_batch);
	mutex_unlock(&ep->mtx);

	return res;
}

static struct timespec64 *ep_timeout_to_timespec(struct timespec64 *to, long ms)
{
	struct timespec64 now;

	if (ms < 0)
		return NULL;

	if (!ms) {
		to->tv_sec = 0;
		to->tv_nsec = 0;
		return to;
	}

	to->tv_sec = ms / MSEC_PER_SEC;
	to->tv_nsec = NSEC_PER_MSEC * (ms % MSEC_PER_SEC);

	ktime_get_ts64(&now);
	*to = timespec64_add_safe(now, *to);
	return to;
}

/*
 * autoremove_wake_function, but remove even on failure to wake up, because we
 * know that default_wake_function/ttwu will only fail if the thread is already
 * woken, and in that case the ep_poll loop will remove the entry anyways, not
 * try to reuse it.
 */
static int ep_autoremove_wake_function(struct wait_queue_entry *wq_entry,
				       unsigned int mode, int sync, void *key)
{
	int ret = default_wake_function(wq_entry, mode, sync, key);

	/*
	 * Pairs with list_empty_careful in ep_poll, and ensures future loop
	 * iterations see the cause of this wakeup.
	 */
	list_del_init_careful(&wq_entry->entry);
	return ret;
}

static int ep_try_send_events(struct eventpoll *ep,
			      struct epoll_event __user *events, int maxevents)
{
	int res;

	/*
	 * Try to transfer events to user space. In case we get 0 events and
	 * there's still timeout left over, we go trying again in search of
	 * more luck.
	 */
	res = ep_send_events(ep, events, maxevents);
	if (res > 0)
		ep_suspend_napi_irqs(ep);
	return res;
}

static int ep_schedule_timeout(ktime_t *to)
{
	if (to)
		return ktime_after(*to, ktime_get());
	else
		return 1;
}

/**
 * ep_poll - Retrieves ready events, and delivers them to the caller-supplied
 *           event buffer.
 *
 * @ep: Pointer to the eventpoll context.
 * @events: Pointer to the userspace buffer where the ready events should be
 *          stored.
 * @maxevents: Size (in terms of number of events) of the caller event buffer.
 * @timeout: Maximum timeout for the ready events fetch operation, in
 *           timespec. If the timeout is zero, the function will not block,
 *           while if the @timeout ptr is NULL, the function will block
 *           until at least one event has been retrieved (or an error
 *           occurred).
 *
 * Return: the number of ready events which have been fetched, or an
 *          error code, in case of error.
 */
static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events,
		   int maxevents, struct timespec64 *timeout)
{
	int res, timed_out = 0;
	bool eavail;
	u64 slack = 0;
	wait_queue_entry_t wait;
	ktime_t expires, *to = NULL;

	lockdep_assert_irqs_enabled();

	if (timeout && (timeout->tv_sec | timeout->tv_nsec)) {
		to = &expires;
		*to = timespec64_to_ktime(*timeout);
	} else if (timeout) {
		/*
		 * Avoid the unnecessary trip to the wait queue loop, if the
		 * caller specified a non blocking operation.
		 */
		timed_out = 1;
	}

	/*
	 * This call is racy: We may or may not see events that are being added
	 * to the ready list under the lock (e.g., in IRQ callbacks). For cases
	 * with a non-zero timeout, this thread will check the ready list under
	 * lock and will add to the wait queue.  For cases with a zero
	 * timeout, the user by definition should not care and will have to
	 * recheck again.
	 */
	eavail = ep_events_available(ep);

	while (1) {
		if (eavail) {
			res = ep_try_send_events(ep, events, maxevents);
			if (res)
				return res;
		}

		if (timed_out)
			return 0;

		eavail = ep_busy_loop(ep);
		if (eavail)
			continue;

		if (signal_pending(current))
			return -EINTR;

		/*
		 * Internally init_wait() uses autoremove_wake_function(),
		 * thus wait entry is removed from the wait queue on each
		 * wakeup. Why it is important? In case of several waiters
		 * each new wakeup will hit the next waiter, giving it the
		 * chance to harvest new event. Otherwise wakeup can be
		 * lost. This is also good performance-wise, because on
		 * normal wakeup path no need to call __remove_wait_queue()
		 * explicitly, thus ep->lock is not taken, which halts the
		 * event delivery.
		 *
		 * In fact, we now use an even more aggressive function that
		 * unconditionally removes, because we don't reuse the wait
		 * entry between loop iterations. This lets us also avoid the
		 * performance issue if a process is killed, causing all of its
		 * threads to wake up without being removed normally.
		 */
		init_wait(&wait);
		wait.func = ep_autoremove_wake_function;

		spin_lock_irq(&ep->lock);
		/*
		 * Barrierless variant, waitqueue_active() is called under
		 * the same lock on wakeup ep_poll_callback() side, so it
		 * is safe to avoid an explicit barrier.
		 */
		__set_current_state(TASK_INTERRUPTIBLE);

		/*
		 * Do the final check under the lock. ep_start/done_scan()
		 * plays with two lists (->rdllist and ->ovflist) and there
		 * is always a race when both lists are empty for short
		 * period of time although events are pending, so lock is
		 * important.
		 */
		eavail = ep_events_available(ep);
		if (!eavail)
			__add_wait_queue_exclusive(&ep->wq, &wait);

		spin_unlock_irq(&ep->lock);

		if (!eavail) {
			if (to)
				slack = select_estimate_accuracy(timeout);
			timed_out = !ep_schedule_timeout(to) ||
				!schedule_hrtimeout_range(to, slack,
							  HRTIMER_MODE_ABS);
		}
		__set_current_state(TASK_RUNNING);

		/*
		 * We were woken up, thus go and try to harvest some events.
		 * If timed out and still on the wait queue, recheck eavail
		 * carefully under lock, below.
		 */
		eavail = true;

		if (!list_empty_careful(&wait.entry)) {
			spin_lock_irq(&ep->lock);
			/*
			 * If the thread timed out and is not on the wait queue,
			 * it means that the thread was woken up after its
			 * timeout expired before it could reacquire the lock.
			 * Thus, when wait.entry is empty, it needs to harvest
			 * events.
			 */
			if (timed_out)
				eavail = list_empty(&wait.entry);
			__remove_wait_queue(&ep->wq, &wait);
			spin_unlock_irq(&ep->lock);
		}
	}
}

/**
 * ep_loop_check_proc - verify that adding an epoll file @ep inside another
 *                      epoll file does not create closed loops, and
 *                      determine the depth of the subtree starting at @ep
 *
 * @ctx: Per-do_epoll_ctl() scratch for the loop / path checks.
 * @ep: the &struct eventpoll to be currently checked.
 * @depth: Current depth of the path being checked.
 *
 * Return: depth of the subtree, or a value bigger than EP_MAX_NESTS if we found
 * a loop or went too deep.
 */
static int ep_loop_check_proc(struct ep_ctl_ctx *ctx,
			      struct eventpoll *ep, int depth)
{
	int result = 0;
	struct rb_node *rbp;
	struct epitem *epi;

	if (ep->gen == loop_check_gen)
		return ep->loop_check_depth;

	mutex_lock_nested(&ep->mtx, depth + 1);
	ep->gen = loop_check_gen;
	for (rbp = rb_first_cached(&ep->rbr); rbp; rbp = rb_next(rbp)) {
		epi = rb_entry(rbp, struct epitem, rbn);
		if (unlikely(is_file_epoll(epi->ffd.file))) {
			struct eventpoll *ep_tovisit;
			ep_tovisit = epi->ffd.file->private_data;
			if (ep_tovisit == ctx->inserting_into ||
			    depth > EP_MAX_NESTS)
				result = EP_MAX_NESTS+1;
			else
				result = max(result,
					     ep_loop_check_proc(ctx, ep_tovisit,
								depth + 1) + 1);
			if (result > EP_MAX_NESTS)
				break;
		} else {
			/*
			 * A non-epoll leaf. Queue it for the companion
			 * reverse_path_check() that runs after this walk so
			 * any new links we propose don't add too many wakeup
			 * paths.
			 */
			list_file(epi->ffd.file, ctx);
		}
	}
	ep->loop_check_depth = result;
	mutex_unlock(&ep->mtx);

	return result;
}

/* ep_get_upwards_depth_proc - determine depth of @ep when traversed upwards */
static int ep_get_upwards_depth_proc(struct eventpoll *ep, int depth)
{
	int result = 0;
	struct epitem *epi;

	if (ep->gen == loop_check_gen)
		return ep->loop_check_depth;
	hlist_for_each_entry_rcu(epi, &ep->refs, fllink)
		result = max(result, ep_get_upwards_depth_proc(epi->ep, depth + 1) + 1);
	ep->gen = loop_check_gen;
	ep->loop_check_depth = result;
	return result;
}

/**
 * ep_loop_check - Performs a check to verify that adding an epoll file (@to)
 *                 into another epoll file (represented by @ep) does not create
 *                 closed loops or too deep chains.
 *
 * @ctx: Per-CTL_ADD scratch context.
 * @ep:  Pointer to the epoll we are inserting into.
 * @to:  Pointer to the epoll to be inserted.
 *
 * Return: %zero if adding the epoll @to inside the epoll @from
 * does not violate the constraints, or %-1 otherwise.
 */
static int ep_loop_check(struct ep_ctl_ctx *ctx, struct eventpoll *ep,
			 struct eventpoll *to)
{
	int depth, upwards_depth;

	ctx->inserting_into = ep;
	/*
	 * Check how deep down we can get from @to, and whether it is possible
	 * to loop up to @ep.
	 */
	depth = ep_loop_check_proc(ctx, to, 0);
	if (depth > EP_MAX_NESTS)
		return -1;
	/* Check how far up we can go from @ep. */
	rcu_read_lock();
	upwards_depth = ep_get_upwards_depth_proc(ep, 0);
	rcu_read_unlock();

	return (depth+1+upwards_depth > EP_MAX_NESTS) ? -1 : 0;
}

static void clear_tfile_check_list(struct ep_ctl_ctx *ctx)
{
	rcu_read_lock();
	while (ctx->tfile_check_list != EP_UNACTIVE_PTR) {
		struct epitems_head *head = ctx->tfile_check_list;
		ctx->tfile_check_list = head->next;
		unlist_file(head);
	}
	rcu_read_unlock();
}

/*
 * Open an eventpoll file descriptor.
 */
static int do_epoll_create(int flags)
{
	int error;
	struct eventpoll *ep;

	/* Check the EPOLL_* constant for consistency.  */
	BUILD_BUG_ON(EPOLL_CLOEXEC != O_CLOEXEC);

	if (flags & ~EPOLL_CLOEXEC)
		return -EINVAL;
	/*
	 * Create the internal data structure ("struct eventpoll").
	 */
	error = ep_alloc(&ep);
	if (error < 0)
		return error;
	/*
	 * Creates all the items needed to setup an eventpoll file. That is,
	 * a file structure and a free file descriptor.
	 */
	FD_PREPARE(fdf, O_RDWR | (flags & O_CLOEXEC),
		   anon_inode_getfile("[eventpoll]", &eventpoll_fops, ep,
				      O_RDWR | (flags & O_CLOEXEC)));
	if (fdf.err) {
		ep_clear_and_put(ep);
		return fdf.err;
	}
	ep->file = fd_prepare_file(fdf);
	return fd_publish(fdf);
}

SYSCALL_DEFINE1(epoll_create1, int, flags)
{
	return do_epoll_create(flags);
}

SYSCALL_DEFINE1(epoll_create, int, size)
{
	if (size <= 0)
		return -EINVAL;

	return do_epoll_create(0);
}

#ifdef CONFIG_PM_SLEEP
static inline void ep_take_care_of_epollwakeup(struct epoll_event *epev)
{
	if ((epev->events & EPOLLWAKEUP) && !capable(CAP_BLOCK_SUSPEND))
		epev->events &= ~EPOLLWAKEUP;
}
#else
static inline void ep_take_care_of_epollwakeup(struct epoll_event *epev)
{
	epev->events &= ~EPOLLWAKEUP;
}
#endif

static inline int epoll_mutex_lock(struct mutex *mutex, bool nonblock)
{
	if (!nonblock) {
		mutex_lock(mutex);
		return 0;
	}
	return mutex_trylock(mutex) ? 0 : -EAGAIN;
}

/*
 * Acquire the locks required for do_epoll_ctl() on @ep for @op.
 *
 * Always takes ep->mtx. For EPOLL_CTL_ADD, additionally runs the
 * loop / path check under epnested_mutex when the topology can
 * change: @ep is already watched (epfile->f_ep non-NULL), @ep was
 * recently loop-checked (ep->gen == loop_check_gen), or @tfile is
 * itself an eventpoll.
 *
 * Return value encodes both outcome and lock state:
 *
 *   0        success; ep->mtx held.
 *   1        success; ep->mtx held AND the full check ran under
 *            epnested_mutex (which is also still held). The value
 *            doubles as the @full_check argument to ep_insert().
 *   -errno   failure; no locks held.
 *
 * The caller releases what was taken with ep_ctl_unlock(ep, ret).
 *
 * Holding epnested_mutex on add is what prevents two racing
 * EPOLL_CTL_ADDs on different eps from building a cycle without
 * either walker observing it.
 */
static int ep_ctl_lock(struct ep_ctl_ctx *ctx, struct eventpoll *ep, int op,
		       struct file *epfile, struct file *tfile, bool nonblock)
{
	struct eventpoll *tep;
	int error;

	error = epoll_mutex_lock(&ep->mtx, nonblock);
	if (error)
		return error;

	if (op != EPOLL_CTL_ADD)
		return 0;
	if (!READ_ONCE(epfile->f_ep) && ep->gen != loop_check_gen &&
	    !is_file_epoll(tfile))
		return 0;

	/* Full check needed: drop ep->mtx so we can take epnested_mutex. */
	mutex_unlock(&ep->mtx);
	error = epoll_mutex_lock(&epnested_mutex, nonblock);
	if (error)
		return error;

	loop_check_gen++;

	if (is_file_epoll(tfile)) {
		tep = tfile->private_data;
		if (ep_loop_check(ctx, ep, tep) != 0) {
			error = -ELOOP;
			goto err_unlock_nested;
		}
	}

	error = epoll_mutex_lock(&ep->mtx, nonblock);
	if (error)
		goto err_unlock_nested;

	return 1;

err_unlock_nested:
	clear_tfile_check_list(ctx);
	loop_check_gen++;
	mutex_unlock(&epnested_mutex);
	return error;
}

static void ep_ctl_unlock(struct ep_ctl_ctx *ctx, struct eventpoll *ep,
			  int full_check)
{
	mutex_unlock(&ep->mtx);
	if (full_check) {
		clear_tfile_check_list(ctx);
		loop_check_gen++;
		mutex_unlock(&epnested_mutex);
	}
}

int do_epoll_ctl_file(struct file *f, int op, struct epoll_key *tf,
		      struct epoll_event *epds, bool nonblock)
{
	int error;
	int full_check;
	struct eventpoll *ep;
	struct epitem *epi;
	struct ep_ctl_ctx ctx = {
		.tfile_check_list = EP_UNACTIVE_PTR,
	};

	/* The target file descriptor must support poll */
	if (!file_can_poll(tf->file))
		return -EPERM;

	/* Check if EPOLLWAKEUP is allowed */
	if (ep_op_has_event(op))
		ep_take_care_of_epollwakeup(epds);

	/*
	 * The @f file must itself be an eventpoll, and we do not permit
	 * adding an epoll file descriptor inside itself.
	 */
	if (f == tf->file || !is_file_epoll(f))
		return -EINVAL;

	/*
	 * epoll adds to the wakeup queue at EPOLL_CTL_ADD time only,
	 * so EPOLLEXCLUSIVE is not allowed for a EPOLL_CTL_MOD operation.
	 * Also, nested exclusive wakeups are not supported.
	 */
	if (ep_op_has_event(op) && (epds->events & EPOLLEXCLUSIVE)) {
		if (op == EPOLL_CTL_MOD)
			return -EINVAL;
		if (op == EPOLL_CTL_ADD && (is_file_epoll(tf->file) ||
				(epds->events & ~EPOLLEXCLUSIVE_OK_BITS)))
			return -EINVAL;
	}

	ep = f->private_data;

	full_check = ep_ctl_lock(&ctx, ep, op, f, tf->file, nonblock);
	if (full_check < 0)
		return full_check;

	/*
	 * Look the target up in ep's RB tree. We hold ep->mtx, so the
	 * item stays valid until we release.
	 */
	epi = ep_find(ep, tf);

	error = -EINVAL;
	switch (op) {
	case EPOLL_CTL_ADD:
		if (!epi) {
			epds->events |= EPOLLERR | EPOLLHUP;
			error = ep_insert(&ctx, ep, epds, tf, full_check);
		} else
			error = -EEXIST;
		break;
	case EPOLL_CTL_DEL:
		if (epi) {
			/*
			 * The eventpoll itself is still alive: the refcount
			 * can't go to zero here.
			 */
			ep_remove(ep, epi);
			error = 0;
		} else {
			error = -ENOENT;
		}
		break;
	case EPOLL_CTL_MOD:
		if (epi) {
			if (!(epi->event.events & EPOLLEXCLUSIVE)) {
				epds->events |= EPOLLERR | EPOLLHUP;
				error = ep_modify(ep, epi, epds);
			}
		} else
			error = -ENOENT;
		break;
	}

	ep_ctl_unlock(&ctx, ep, full_check);
	return error;
}

int do_epoll_ctl(int epfd, int op, int fd, struct epoll_event *epds,
		 bool nonblock)
{
	struct epoll_key efd;

	CLASS(fd, f)(epfd);
	if (fd_empty(f))
		return -EBADF;

	/* Get the "struct file *" for the target file */
	CLASS(fd, tf)(fd);
	if (fd_empty(tf))
		return -EBADF;

	efd.file = fd_file(tf);
	efd.fd = fd;
	return do_epoll_ctl_file(fd_file(f), op, &efd, epds, nonblock);
}

/*
 * The following function implements the controller interface for
 * the eventpoll file that enables the insertion/removal/change of
 * file descriptors inside the interest set.
 */
SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd,
		struct epoll_event __user *, event)
{
	struct epoll_event epds;

	if (ep_op_has_event(op) &&
	    copy_from_user(&epds, event, sizeof(struct epoll_event)))
		return -EFAULT;

	return do_epoll_ctl(epfd, op, fd, &epds, false);
}

static int ep_check_params(struct file *file, struct epoll_event __user *evs,
			   int maxevents)
{
	/* The maximum number of event must be greater than zero */
	if (maxevents <= 0 || maxevents > EP_MAX_EVENTS)
		return -EINVAL;

	/* Verify that the area passed by the user is writeable */
	if (!access_ok(evs, maxevents * sizeof(struct epoll_event)))
		return -EFAULT;

	/*
	 * We have to check that the file structure underneath the fd
	 * the user passed to us _is_ an eventpoll file.
	 */
	if (!is_file_epoll(file))
		return -EINVAL;

	return 0;
}

int epoll_sendevents(struct file *file, struct epoll_event __user *events,
		     int maxevents)
{
	struct eventpoll *ep;
	int ret;

	ret = ep_check_params(file, events, maxevents);
	if (unlikely(ret))
		return ret;

	ep = file->private_data;
	/*
	 * Racy call, but that's ok - it should get retried based on
	 * poll readiness anyway.
	 */
	if (ep_events_available(ep))
		return ep_try_send_events(ep, events, maxevents);
	return 0;
}

/*
 * Implement the event wait interface for the eventpoll file. It is the kernel
 * part of the user space epoll_wait(2).
 */
static int do_epoll_wait(int epfd, struct epoll_event __user *events,
			 int maxevents, struct timespec64 *to)
{
	struct eventpoll *ep;
	int ret;

	/* Get the "struct file *" for the eventpoll file */
	CLASS(fd, f)(epfd);
	if (fd_empty(f))
		return -EBADF;

	ret = ep_check_params(fd_file(f), events, maxevents);
	if (unlikely(ret))
		return ret;

	/*
	 * At this point it is safe to assume that the "private_data" contains
	 * our own data structure.
	 */
	ep = fd_file(f)->private_data;

	/* Time to fish for events ... */
	return ep_poll(ep, events, maxevents, to);
}

SYSCALL_DEFINE4(epoll_wait, int, epfd, struct epoll_event __user *, events,
		int, maxevents, int, timeout)
{
	struct timespec64 to;

	return do_epoll_wait(epfd, events, maxevents,
			     ep_timeout_to_timespec(&to, timeout));
}

/*
 * Implement the event wait interface for the eventpoll file. It is the kernel
 * part of the user space epoll_pwait(2).
 */
static int do_epoll_pwait(int epfd, struct epoll_event __user *events,
			  int maxevents, struct timespec64 *to,
			  const sigset_t __user *sigmask, size_t sigsetsize)
{
	int error;

	/*
	 * If the caller wants a certain signal mask to be set during the wait,
	 * we apply it here.
	 */
	error = set_user_sigmask(sigmask, sigsetsize);
	if (error)
		return error;

	error = do_epoll_wait(epfd, events, maxevents, to);

	restore_saved_sigmask_unless(error == -EINTR);

	return error;
}

SYSCALL_DEFINE6(epoll_pwait, int, epfd, struct epoll_event __user *, events,
		int, maxevents, int, timeout, const sigset_t __user *, sigmask,
		size_t, sigsetsize)
{
	struct timespec64 to;

	return do_epoll_pwait(epfd, events, maxevents,
			      ep_timeout_to_timespec(&to, timeout),
			      sigmask, sigsetsize);
}

SYSCALL_DEFINE6(epoll_pwait2, int, epfd, struct epoll_event __user *, events,
		int, maxevents, const struct __kernel_timespec __user *, timeout,
		const sigset_t __user *, sigmask, size_t, sigsetsize)
{
	struct timespec64 ts, *to = NULL;

	if (timeout) {
		if (get_timespec64(&ts, timeout))
			return -EFAULT;
		to = &ts;
		if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
			return -EINVAL;
	}

	return do_epoll_pwait(epfd, events, maxevents, to,
			      sigmask, sigsetsize);
}

#ifdef CONFIG_KCMP
static struct epitem *ep_find_tfd(struct eventpoll *ep, int tfd, unsigned long toff)
{
	struct rb_node *rbp;
	struct epitem *epi;

	for (rbp = rb_first_cached(&ep->rbr); rbp; rbp = rb_next(rbp)) {
		epi = rb_entry(rbp, struct epitem, rbn);
		if (epi->ffd.fd == tfd) {
			if (toff == 0)
				return epi;
			else
				toff--;
		}
		cond_resched();
	}

	return NULL;
}

struct file *get_epoll_tfile_raw_ptr(struct file *file, int tfd,
				     unsigned long toff)
{
	struct file *file_raw;
	struct eventpoll *ep;
	struct epitem *epi;

	if (!is_file_epoll(file))
		return ERR_PTR(-EINVAL);

	ep = file->private_data;

	mutex_lock(&ep->mtx);
	epi = ep_find_tfd(ep, tfd, toff);
	if (epi)
		file_raw = epi->ffd.file;
	else
		file_raw = ERR_PTR(-ENOENT);
	mutex_unlock(&ep->mtx);

	return file_raw;
}
#endif /* CONFIG_KCMP */

#ifdef CONFIG_COMPAT
static int do_compat_epoll_pwait(int epfd, struct epoll_event __user *events,
				 int maxevents, struct timespec64 *timeout,
				 const compat_sigset_t __user *sigmask,
				 compat_size_t sigsetsize)
{
	long err;

	/*
	 * If the caller wants a certain signal mask to be set during the wait,
	 * we apply it here.
	 */
	err = set_compat_user_sigmask(sigmask, sigsetsize);
	if (err)
		return err;

	err = do_epoll_wait(epfd, events, maxevents, timeout);

	restore_saved_sigmask_unless(err == -EINTR);

	return err;
}

COMPAT_SYSCALL_DEFINE6(epoll_pwait, int, epfd,
		       struct epoll_event __user *, events,
		       int, maxevents, int, timeout,
		       const compat_sigset_t __user *, sigmask,
		       compat_size_t, sigsetsize)
{
	struct timespec64 to;

	return do_compat_epoll_pwait(epfd, events, maxevents,
				     ep_timeout_to_timespec(&to, timeout),
				     sigmask, sigsetsize);
}

COMPAT_SYSCALL_DEFINE6(epoll_pwait2, int, epfd,
		       struct epoll_event __user *, events,
		       int, maxevents,
		       const struct __kernel_timespec __user *, timeout,
		       const compat_sigset_t __user *, sigmask,
		       compat_size_t, sigsetsize)
{
	struct timespec64 ts, *to = NULL;

	if (timeout) {
		if (get_timespec64(&ts, timeout))
			return -EFAULT;
		to = &ts;
		if (poll_select_set_timeout(to, ts.tv_sec, ts.tv_nsec))
			return -EINVAL;
	}

	return do_compat_epoll_pwait(epfd, events, maxevents, to,
				     sigmask, sigsetsize);
}

#endif

static int __init eventpoll_init(void)
{
	struct sysinfo si;

	si_meminfo(&si);
	/*
	 * Allows top 4% of lomem to be allocated for epoll watches (per user).
	 */
	max_user_watches = (((si.totalram - si.totalhigh) / 25) << PAGE_SHIFT) /
		EP_ITEM_COST;
	BUG_ON(max_user_watches < 0);

	/*
	 * We can have many thousands of epitems, so prevent this from
	 * using an extra cache line on 64-bit (and smaller) CPUs
	 */
	BUILD_BUG_ON(sizeof(void *) <= 8 && sizeof(struct epitem) > 128);

	/* Allocates slab cache used to allocate "struct epitem" items */
	epi_cache = kmem_cache_create("eventpoll_epi", sizeof(struct epitem),
			0, SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_ACCOUNT, NULL);

	/* Allocates slab cache used to allocate "struct eppoll_entry" */
	pwq_cache = kmem_cache_create("eventpoll_pwq",
		sizeof(struct eppoll_entry), 0, SLAB_PANIC|SLAB_ACCOUNT, NULL);
	epoll_sysctls_init();

	ephead_cache = kmem_cache_create("ep_head",
		sizeof(struct epitems_head), 0, SLAB_PANIC|SLAB_ACCOUNT, NULL);

	return 0;
}
fs_initcall(eventpoll_init);
