eventpoll.h 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * include/linux/eventpoll.h ( Efficient event polling implementation )
  4. * Copyright (C) 2001,...,2006 Davide Libenzi
  5. *
  6. * Davide Libenzi <davidel@xmailserver.org>
  7. */
  8. #ifndef _LINUX_EVENTPOLL_H
  9. #define _LINUX_EVENTPOLL_H
  10. #include <uapi/linux/eventpoll.h>
  11. #include <uapi/linux/kcmp.h>
  12. /* Forward declarations to avoid compiler errors */
  13. struct file;
  14. #ifdef CONFIG_EPOLL
  15. #ifdef CONFIG_KCMP
  16. struct file *get_epoll_tfile_raw_ptr(struct file *file, int tfd, unsigned long toff);
  17. #endif
  18. /* Used to initialize the epoll bits inside the "struct file" */
  19. static inline void eventpoll_init_file(struct file *file)
  20. {
  21. INIT_LIST_HEAD(&file->f_ep_links);
  22. INIT_LIST_HEAD(&file->f_tfile_llink);
  23. }
  24. /* Used to release the epoll bits inside the "struct file" */
  25. void eventpoll_release_file(struct file *file);
  26. /*
  27. * This is called from inside fs/file_table.c:__fput() to unlink files
  28. * from the eventpoll interface. We need to have this facility to cleanup
  29. * correctly files that are closed without being removed from the eventpoll
  30. * interface.
  31. */
  32. static inline void eventpoll_release(struct file *file)
  33. {
  34. /*
  35. * Fast check to avoid the get/release of the semaphore. Since
  36. * we're doing this outside the semaphore lock, it might return
  37. * false negatives, but we don't care. It'll help in 99.99% of cases
  38. * to avoid the semaphore lock. False positives simply cannot happen
  39. * because the file in on the way to be removed and nobody ( but
  40. * eventpoll ) has still a reference to this file.
  41. */
  42. if (likely(list_empty(&file->f_ep_links)))
  43. return;
  44. /*
  45. * The file is being closed while it is still linked to an epoll
  46. * descriptor. We need to handle this by correctly unlinking it
  47. * from its containers.
  48. */
  49. eventpoll_release_file(file);
  50. }
  51. int do_epoll_ctl(int epfd, int op, int fd, struct epoll_event *epds,
  52. bool nonblock);
  53. /* Tells if the epoll_ctl(2) operation needs an event copy from userspace */
  54. static inline int ep_op_has_event(int op)
  55. {
  56. return op != EPOLL_CTL_DEL;
  57. }
  58. #else
  59. static inline void eventpoll_init_file(struct file *file) {}
  60. static inline void eventpoll_release(struct file *file) {}
  61. #endif
  62. #endif /* #ifndef _LINUX_EVENTPOLL_H */