Lines Matching refs:epi
248 struct epitem *epi; member
305 struct epitem *epi= container_of(p, struct epitem, fllink); in unlist_file() local
306 spin_lock(&epi->ffd.file->f_lock); in unlist_file()
310 spin_unlock(&epi->ffd.file->f_lock); in unlist_file()
366 static inline int ep_is_linked(struct epitem *epi) in ep_is_linked() argument
368 return !list_empty(&epi->rdllink); in ep_is_linked()
472 static inline void ep_set_busy_poll_napi_id(struct epitem *epi) in ep_set_busy_poll_napi_id() argument
474 struct eventpoll *ep = epi->ep; in ep_set_busy_poll_napi_id()
482 sock = sock_from_file(epi->ffd.file); in ep_set_busy_poll_napi_id()
569 static inline void ep_set_busy_poll_napi_id(struct epitem *epi) in ep_set_busy_poll_napi_id() argument
616 static void ep_poll_safewake(struct eventpoll *ep, struct epitem *epi, in ep_poll_safewake() argument
638 if (epi) { in ep_poll_safewake()
639 if ((is_file_epoll(epi->ffd.file))) { in ep_poll_safewake()
640 ep_src = epi->ffd.file->private_data; in ep_poll_safewake()
655 static void ep_poll_safewake(struct eventpoll *ep, struct epitem *epi, in ep_poll_safewake() argument
684 static void ep_unregister_pollwait(struct eventpoll *ep, struct epitem *epi) in ep_unregister_pollwait() argument
686 struct eppoll_entry **p = &epi->pwqlist; in ep_unregister_pollwait()
697 static inline struct wakeup_source *ep_wakeup_source(struct epitem *epi) in ep_wakeup_source() argument
699 return rcu_dereference_check(epi->ws, lockdep_is_held(&epi->ep->mtx)); in ep_wakeup_source()
703 static inline void ep_pm_stay_awake(struct epitem *epi) in ep_pm_stay_awake() argument
705 struct wakeup_source *ws = ep_wakeup_source(epi); in ep_pm_stay_awake()
711 static inline bool ep_has_wakeup_source(struct epitem *epi) in ep_has_wakeup_source() argument
713 return rcu_access_pointer(epi->ws) ? true : false; in ep_has_wakeup_source()
717 static inline void ep_pm_stay_awake_rcu(struct epitem *epi) in ep_pm_stay_awake_rcu() argument
722 ws = rcu_dereference(epi->ws); in ep_pm_stay_awake_rcu()
753 struct epitem *epi, *nepi; in ep_done_scan() local
761 for (nepi = READ_ONCE(ep->ovflist); (epi = nepi) != NULL; in ep_done_scan()
762 nepi = epi->next, epi->next = EP_UNACTIVE_PTR) { in ep_done_scan()
769 if (!ep_is_linked(epi)) { in ep_done_scan()
774 list_add(&epi->rdllink, &ep->rdllist); in ep_done_scan()
775 ep_pm_stay_awake(epi); in ep_done_scan()
833 static bool __ep_remove(struct eventpoll *ep, struct epitem *epi, bool force) in __ep_remove() argument
835 struct file *file = epi->ffd.file; in __ep_remove()
844 ep_unregister_pollwait(ep, epi); in __ep_remove()
848 if (epi->dying && !force) { in __ep_remove()
855 if (head->first == &epi->fllink && !epi->fllink.next) { in __ep_remove()
865 hlist_del_rcu(&epi->fllink); in __ep_remove()
869 rb_erase_cached(&epi->rbn, &ep->rbr); in __ep_remove()
872 if (ep_is_linked(epi)) in __ep_remove()
873 list_del_init(&epi->rdllink); in __ep_remove()
876 wakeup_source_unregister(ep_wakeup_source(epi)); in __ep_remove()
884 kfree_rcu(epi, rcu); in __ep_remove()
893 static void ep_remove_safe(struct eventpoll *ep, struct epitem *epi) in ep_remove_safe() argument
895 if (__ep_remove(ep, epi, false)) in ep_remove_safe()
902 struct epitem *epi; in ep_clear_and_put() local
914 epi = rb_entry(rbp, struct epitem, rbn); in ep_clear_and_put()
916 ep_unregister_pollwait(ep, epi); in ep_clear_and_put()
930 epi = rb_entry(rbp, struct epitem, rbn); in ep_clear_and_put()
931 ep_remove_safe(ep, epi); in ep_clear_and_put()
971 static __poll_t ep_item_poll(const struct epitem *epi, poll_table *pt, int depth);
977 struct epitem *epi, *tmp; in __ep_eventpoll_poll() local
992 list_for_each_entry_safe(epi, tmp, &txlist, rdllink) { in __ep_eventpoll_poll()
993 if (ep_item_poll(epi, &pt, depth + 1)) { in __ep_eventpoll_poll()
1002 __pm_relax(ep_wakeup_source(epi)); in __ep_eventpoll_poll()
1003 list_del_init(&epi->rdllink); in __ep_eventpoll_poll()
1029 static struct file *epi_fget(const struct epitem *epi) in epi_fget() argument
1033 file = epi->ffd.file; in epi_fget()
1044 static __poll_t ep_item_poll(const struct epitem *epi, poll_table *pt, in ep_item_poll() argument
1047 struct file *file = epi_fget(epi); in ep_item_poll()
1057 pt->_key = epi->event.events; in ep_item_poll()
1063 return res & epi->event.events; in ep_item_poll()
1079 struct epitem *epi = rb_entry(rbp, struct epitem, rbn); in ep_show_fdinfo() local
1080 struct inode *inode = file_inode(epi->ffd.file); in ep_show_fdinfo()
1084 epi->ffd.fd, epi->event.events, in ep_show_fdinfo()
1085 (long long)epi->event.data, in ep_show_fdinfo()
1086 (long long)epi->ffd.file->f_pos, in ep_show_fdinfo()
1115 struct epitem *epi; in eventpoll_release_file() local
1126 epi = hlist_entry(file->f_ep->first, struct epitem, fllink); in eventpoll_release_file()
1127 epi->dying = true; in eventpoll_release_file()
1134 ep = epi->ep; in eventpoll_release_file()
1136 dispose = __ep_remove(ep, epi, true); in eventpoll_release_file()
1178 struct epitem *epi, *epir = NULL; in ep_find() local
1183 epi = rb_entry(rbp, struct epitem, rbn); in ep_find()
1184 kcmp = ep_cmp_ffd(&ffd, &epi->ffd); in ep_find()
1190 epir = epi; in ep_find()
1202 struct epitem *epi; in ep_find_tfd() local
1205 epi = rb_entry(rbp, struct epitem, rbn); in ep_find_tfd()
1206 if (epi->ffd.fd == tfd) { in ep_find_tfd()
1208 return epi; in ep_find_tfd()
1223 struct epitem *epi; in get_epoll_tfile_raw_ptr() local
1231 epi = ep_find_tfd(ep, tfd, toff); in get_epoll_tfile_raw_ptr()
1232 if (epi) in get_epoll_tfile_raw_ptr()
1233 file_raw = epi->ffd.file; in get_epoll_tfile_raw_ptr()
1250 struct epitem *epi = ep_item_from_wait(wait); in ep_poll_callback() local
1251 struct eventpoll *ep = epi->ep; in ep_poll_callback()
1258 ep_set_busy_poll_napi_id(epi); in ep_poll_callback()
1266 if (!(epi->event.events & ~EP_PRIVATE_BITS)) in ep_poll_callback()
1275 if (pollflags && !(pollflags & epi->event.events)) in ep_poll_callback()
1285 if (epi->next == EP_UNACTIVE_PTR) { in ep_poll_callback()
1286 epi->next = READ_ONCE(ep->ovflist); in ep_poll_callback()
1287 WRITE_ONCE(ep->ovflist, epi); in ep_poll_callback()
1288 ep_pm_stay_awake_rcu(epi); in ep_poll_callback()
1290 } else if (!ep_is_linked(epi)) { in ep_poll_callback()
1292 list_add_tail(&epi->rdllink, &ep->rdllist); in ep_poll_callback()
1293 ep_pm_stay_awake_rcu(epi); in ep_poll_callback()
1301 if ((epi->event.events & EPOLLEXCLUSIVE) && in ep_poll_callback()
1305 if (epi->event.events & EPOLLIN) in ep_poll_callback()
1309 if (epi->event.events & EPOLLOUT) in ep_poll_callback()
1330 ep_poll_safewake(ep, epi, pollflags & EPOLL_URING_WAKE); in ep_poll_callback()
1332 if (!(epi->event.events & EPOLLEXCLUSIVE)) in ep_poll_callback()
1362 struct epitem *epi = epq->epi; in ep_ptable_queue_proc() local
1365 if (unlikely(!epi)) // an earlier allocation has failed in ep_ptable_queue_proc()
1370 epq->epi = NULL; in ep_ptable_queue_proc()
1376 pwq->base = epi; in ep_ptable_queue_proc()
1377 if (epi->event.events & EPOLLEXCLUSIVE) in ep_ptable_queue_proc()
1381 pwq->next = epi->pwqlist; in ep_ptable_queue_proc()
1382 epi->pwqlist = pwq; in ep_ptable_queue_proc()
1385 static void ep_rbtree_insert(struct eventpoll *ep, struct epitem *epi) in ep_rbtree_insert() argument
1395 kcmp = ep_cmp_ffd(&epi->ffd, &epic->ffd); in ep_rbtree_insert()
1402 rb_link_node(&epi->rbn, parent, p); in ep_rbtree_insert()
1403 rb_insert_color_cached(&epi->rbn, &ep->rbr, leftmost); in ep_rbtree_insert()
1445 struct epitem *epi; in reverse_path_check_proc() local
1451 hlist_for_each_entry_rcu(epi, refs, fllink) { in reverse_path_check_proc()
1452 struct hlist_head *refs = &epi->ep->refs; in reverse_path_check_proc()
1489 static int ep_create_wakeup_source(struct epitem *epi) in ep_create_wakeup_source() argument
1494 if (!epi->ep->ws) { in ep_create_wakeup_source()
1495 epi->ep->ws = wakeup_source_register(NULL, "eventpoll"); in ep_create_wakeup_source()
1496 if (!epi->ep->ws) in ep_create_wakeup_source()
1500 take_dentry_name_snapshot(&n, epi->ffd.file->f_path.dentry); in ep_create_wakeup_source()
1506 rcu_assign_pointer(epi->ws, ws); in ep_create_wakeup_source()
1512 static noinline void ep_destroy_wakeup_source(struct epitem *epi) in ep_destroy_wakeup_source() argument
1514 struct wakeup_source *ws = ep_wakeup_source(epi); in ep_destroy_wakeup_source()
1516 RCU_INIT_POINTER(epi->ws, NULL); in ep_destroy_wakeup_source()
1527 static int attach_epitem(struct file *file, struct epitem *epi) in attach_epitem() argument
1555 hlist_add_head_rcu(&epi->fllink, file->f_ep); in attach_epitem()
1569 struct epitem *epi; in ep_insert() local
1583 if (!(epi = kmem_cache_zalloc(epi_cache, GFP_KERNEL))) { in ep_insert()
1589 INIT_LIST_HEAD(&epi->rdllink); in ep_insert()
1590 epi->ep = ep; in ep_insert()
1591 ep_set_ffd(&epi->ffd, tfile, fd); in ep_insert()
1592 epi->event = *event; in ep_insert()
1593 epi->next = EP_UNACTIVE_PTR; in ep_insert()
1598 if (unlikely(attach_epitem(tfile, epi) < 0)) { in ep_insert()
1601 kmem_cache_free(epi_cache, epi); in ep_insert()
1613 ep_rbtree_insert(ep, epi); in ep_insert()
1625 ep_remove_safe(ep, epi); in ep_insert()
1629 if (epi->event.events & EPOLLWAKEUP) { in ep_insert()
1630 error = ep_create_wakeup_source(epi); in ep_insert()
1632 ep_remove_safe(ep, epi); in ep_insert()
1638 epq.epi = epi; in ep_insert()
1648 revents = ep_item_poll(epi, &epq.pt, 1); in ep_insert()
1655 if (unlikely(!epq.epi)) { in ep_insert()
1656 ep_remove_safe(ep, epi); in ep_insert()
1664 ep_set_busy_poll_napi_id(epi); in ep_insert()
1667 if (revents && !ep_is_linked(epi)) { in ep_insert()
1668 list_add_tail(&epi->rdllink, &ep->rdllist); in ep_insert()
1669 ep_pm_stay_awake(epi); in ep_insert()
1691 static int ep_modify(struct eventpoll *ep, struct epitem *epi, in ep_modify() argument
1706 epi->event.events = event->events; /* need barrier below */ in ep_modify()
1707 epi->event.data = event->data; /* protected by mtx */ in ep_modify()
1708 if (epi->event.events & EPOLLWAKEUP) { in ep_modify()
1709 if (!ep_has_wakeup_source(epi)) in ep_modify()
1710 ep_create_wakeup_source(epi); in ep_modify()
1711 } else if (ep_has_wakeup_source(epi)) { in ep_modify()
1712 ep_destroy_wakeup_source(epi); in ep_modify()
1741 if (ep_item_poll(epi, &pt, 1)) { in ep_modify()
1743 if (!ep_is_linked(epi)) { in ep_modify()
1744 list_add_tail(&epi->rdllink, &ep->rdllist); in ep_modify()
1745 ep_pm_stay_awake(epi); in ep_modify()
1766 struct epitem *epi, *tmp; in ep_send_events() local
1788 list_for_each_entry_safe(epi, tmp, &txlist, rdllink) { in ep_send_events()
1804 ws = ep_wakeup_source(epi); in ep_send_events()
1811 list_del_init(&epi->rdllink); in ep_send_events()
1818 revents = ep_item_poll(epi, &pt, 1); in ep_send_events()
1822 events = epoll_put_uevent(revents, epi->event.data, events); in ep_send_events()
1824 list_add(&epi->rdllink, &txlist); in ep_send_events()
1825 ep_pm_stay_awake(epi); in ep_send_events()
1831 if (epi->event.events & EPOLLONESHOT) in ep_send_events()
1832 epi->event.events &= EP_PRIVATE_BITS; in ep_send_events()
1833 else if (!(epi->event.events & EPOLLET)) { in ep_send_events()
1845 list_add_tail(&epi->rdllink, &ep->rdllist); in ep_send_events()
1846 ep_pm_stay_awake(epi); in ep_send_events()
2071 struct epitem *epi; in ep_loop_check_proc() local
2079 epi = rb_entry(rbp, struct epitem, rbn); in ep_loop_check_proc()
2080 if (unlikely(is_file_epoll(epi->ffd.file))) { in ep_loop_check_proc()
2082 ep_tovisit = epi->ffd.file->private_data; in ep_loop_check_proc()
2098 list_file(epi->ffd.file); in ep_loop_check_proc()
2111 struct epitem *epi; in ep_get_upwards_depth_proc() local
2115 hlist_for_each_entry_rcu(epi, &ep->refs, fllink) in ep_get_upwards_depth_proc()
2116 result = max(result, ep_get_upwards_depth_proc(epi->ep, depth + 1) + 1); in ep_get_upwards_depth_proc()
2242 struct epitem *epi; in do_epoll_ctl() local
2334 epi = ep_find(ep, fd_file(tf), fd); in do_epoll_ctl()
2339 if (!epi) { in do_epoll_ctl()
2346 if (epi) { in do_epoll_ctl()
2351 ep_remove_safe(ep, epi); in do_epoll_ctl()
2358 if (epi) { in do_epoll_ctl()
2359 if (!(epi->event.events & EPOLLEXCLUSIVE)) { in do_epoll_ctl()
2361 error = ep_modify(ep, epi, epds); in do_epoll_ctl()