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 | |
11 | #include <uapi/linux/eventpoll.h> |
12 | #include <uapi/linux/kcmp.h> |
13 | |
14 | |
15 | /* Forward declarations to avoid compiler errors */ |
16 | struct file; |
17 | |
18 | |
19 | #ifdef CONFIG_EPOLL |
20 | |
21 | #ifdef CONFIG_KCMP |
22 | struct file *get_epoll_tfile_raw_ptr(struct file *file, int tfd, unsigned long toff); |
23 | #endif |
24 | |
25 | /* Used to release the epoll bits inside the "struct file" */ |
26 | void eventpoll_release_file(struct file *file); |
27 | |
28 | /* |
29 | * This is called from inside fs/file_table.c:__fput() to unlink files |
30 | * from the eventpoll interface. We need to have this facility to cleanup |
31 | * correctly files that are closed without being removed from the eventpoll |
32 | * interface. |
33 | */ |
34 | static inline void eventpoll_release(struct file *file) |
35 | { |
36 | |
37 | /* |
38 | * Fast check to avoid the get/release of the semaphore. Since |
39 | * we're doing this outside the semaphore lock, it might return |
40 | * false negatives, but we don't care. It'll help in 99.99% of cases |
41 | * to avoid the semaphore lock. False positives simply cannot happen |
42 | * because the file in on the way to be removed and nobody ( but |
43 | * eventpoll ) has still a reference to this file. |
44 | */ |
45 | if (likely(!file->f_ep)) |
46 | return; |
47 | |
48 | /* |
49 | * The file is being closed while it is still linked to an epoll |
50 | * descriptor. We need to handle this by correctly unlinking it |
51 | * from its containers. |
52 | */ |
53 | eventpoll_release_file(file); |
54 | } |
55 | |
56 | int do_epoll_ctl(int epfd, int op, int fd, struct epoll_event *epds, |
57 | bool nonblock); |
58 | |
59 | /* Tells if the epoll_ctl(2) operation needs an event copy from userspace */ |
60 | static inline int ep_op_has_event(int op) |
61 | { |
62 | return op != EPOLL_CTL_DEL; |
63 | } |
64 | |
65 | #else |
66 | |
67 | static inline void eventpoll_release(struct file *file) {} |
68 | |
69 | #endif |
70 | |
71 | #if defined(CONFIG_ARM) && defined(CONFIG_OABI_COMPAT) |
72 | /* ARM OABI has an incompatible struct layout and needs a special handler */ |
73 | extern struct epoll_event __user * |
74 | epoll_put_uevent(__poll_t revents, __u64 data, |
75 | struct epoll_event __user *uevent); |
76 | #else |
77 | static inline struct epoll_event __user * |
78 | epoll_put_uevent(__poll_t revents, __u64 data, |
79 | struct epoll_event __user *uevent) |
80 | { |
81 | if (__put_user(revents, &uevent->events) || |
82 | __put_user(data, &uevent->data)) |
83 | return NULL; |
84 | |
85 | return uevent+1; |
86 | } |
87 | #endif |
88 | |
89 | #endif /* #ifndef _LINUX_EVENTPOLL_H */ |
90 | |