1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2e1ad7468SDavide Libenzi /*
3e1ad7468SDavide Libenzi * include/linux/eventfd.h
4e1ad7468SDavide Libenzi *
5e1ad7468SDavide Libenzi * Copyright (C) 2007 Davide Libenzi <[email protected]>
6e1ad7468SDavide Libenzi *
7e1ad7468SDavide Libenzi */
8e1ad7468SDavide Libenzi
9e1ad7468SDavide Libenzi #ifndef _LINUX_EVENTFD_H
10e1ad7468SDavide Libenzi #define _LINUX_EVENTFD_H
11e1ad7468SDavide Libenzi
12cb289d62SDavide Libenzi #include <linux/wait.h>
13fa3fc2adSArnd Bergmann #include <linux/err.h>
14b5e683d5SJens Axboe #include <linux/percpu-defs.h>
15b5e683d5SJens Axboe #include <linux/percpu.h>
16b542e383SThomas Gleixner #include <linux/sched.h>
172d8c9dcfSWen Yang #include <uapi/linux/eventfd.h>
18b087498eSUlrich Drepper
19bcd0b235SDavide Libenzi /*
201d730c49SMartin Sustrik * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining
21bcd0b235SDavide Libenzi * new flags, since they might collide with O_* ones. We want
22bcd0b235SDavide Libenzi * to re-use O_* flags that couldn't possibly have a meaning
23bcd0b235SDavide Libenzi * from eventfd, in order to leave a free define-space for
24bcd0b235SDavide Libenzi * shared O_* flags.
25bcd0b235SDavide Libenzi */
26bcd0b235SDavide Libenzi #define EFD_SHARED_FCNTL_FLAGS (O_CLOEXEC | O_NONBLOCK)
27bcd0b235SDavide Libenzi #define EFD_FLAGS_SET (EFD_SHARED_FCNTL_FLAGS | EFD_SEMAPHORE)
28bcd0b235SDavide Libenzi
29105f2b70SEric Biggers struct eventfd_ctx;
304e10f3c9SAl Viro struct file;
314e10f3c9SAl Viro
3213389010SDavide Libenzi #ifdef CONFIG_EVENTFD
3313389010SDavide Libenzi
3413389010SDavide Libenzi void eventfd_ctx_put(struct eventfd_ctx *ctx);
35e1ad7468SDavide Libenzi struct file *eventfd_fget(int fd);
3613389010SDavide Libenzi struct eventfd_ctx *eventfd_ctx_fdget(int fd);
3713389010SDavide Libenzi struct eventfd_ctx *eventfd_ctx_fileget(struct file *file);
38*b7638ad0SChristian Brauner void eventfd_signal_mask(struct eventfd_ctx *ctx, __poll_t mask);
39ac6424b9SIngo Molnar int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_entry_t *wait,
40cb289d62SDavide Libenzi __u64 *cnt);
4128f13267SDavid Woodhouse void eventfd_ctx_do_read(struct eventfd_ctx *ctx, __u64 *cnt);
42e1ad7468SDavide Libenzi
eventfd_signal_allowed(void)43b542e383SThomas Gleixner static inline bool eventfd_signal_allowed(void)
44b5e683d5SJens Axboe {
459f0deaa1SDylan Yudaken return !current->in_eventfd;
46b5e683d5SJens Axboe }
47b5e683d5SJens Axboe
48e1ad7468SDavide Libenzi #else /* CONFIG_EVENTFD */
49e1ad7468SDavide Libenzi
5013389010SDavide Libenzi /*
5113389010SDavide Libenzi * Ugly ugly ugly error layer to support modules that uses eventfd but
5213389010SDavide Libenzi * pretend to work in !CONFIG_EVENTFD configurations. Namely, AIO.
5313389010SDavide Libenzi */
54562787a5SDavide Libenzi
eventfd_ctx_fdget(int fd)5513389010SDavide Libenzi static inline struct eventfd_ctx *eventfd_ctx_fdget(int fd)
5613389010SDavide Libenzi {
5713389010SDavide Libenzi return ERR_PTR(-ENOSYS);
5813389010SDavide Libenzi }
59e1ad7468SDavide Libenzi
eventfd_signal_mask(struct eventfd_ctx * ctx,__poll_t mask)60*b7638ad0SChristian Brauner static inline void eventfd_signal_mask(struct eventfd_ctx *ctx, __poll_t mask)
6113389010SDavide Libenzi {
6203e02acdSJens Axboe }
6303e02acdSJens Axboe
eventfd_ctx_put(struct eventfd_ctx * ctx)6413389010SDavide Libenzi static inline void eventfd_ctx_put(struct eventfd_ctx *ctx)
6513389010SDavide Libenzi {
6613389010SDavide Libenzi
6713389010SDavide Libenzi }
6813389010SDavide Libenzi
eventfd_ctx_remove_wait_queue(struct eventfd_ctx * ctx,wait_queue_entry_t * wait,__u64 * cnt)69cb289d62SDavide Libenzi static inline int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx,
70ac6424b9SIngo Molnar wait_queue_entry_t *wait, __u64 *cnt)
71cb289d62SDavide Libenzi {
72cb289d62SDavide Libenzi return -ENOSYS;
73cb289d62SDavide Libenzi }
74cb289d62SDavide Libenzi
eventfd_signal_allowed(void)75b542e383SThomas Gleixner static inline bool eventfd_signal_allowed(void)
76b5e683d5SJens Axboe {
77b542e383SThomas Gleixner return true;
78b5e683d5SJens Axboe }
79b5e683d5SJens Axboe
eventfd_ctx_do_read(struct eventfd_ctx * ctx,__u64 * cnt)8028f13267SDavid Woodhouse static inline void eventfd_ctx_do_read(struct eventfd_ctx *ctx, __u64 *cnt)
8128f13267SDavid Woodhouse {
8228f13267SDavid Woodhouse
8328f13267SDavid Woodhouse }
8428f13267SDavid Woodhouse
8513389010SDavide Libenzi #endif
86e1ad7468SDavide Libenzi
eventfd_signal(struct eventfd_ctx * ctx)87*b7638ad0SChristian Brauner static inline void eventfd_signal(struct eventfd_ctx *ctx)
88*b7638ad0SChristian Brauner {
89*b7638ad0SChristian Brauner eventfd_signal_mask(ctx, 0);
90*b7638ad0SChristian Brauner }
91*b7638ad0SChristian Brauner
92e1ad7468SDavide Libenzi #endif /* _LINUX_EVENTFD_H */
93e1ad7468SDavide Libenzi
94