xref: /openbmc/linux/include/linux/eventfd.h (revision 2d8c9dcf)
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 <davidel@xmailserver.org>
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>
17*2d8c9dcfSWen 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);
38ee62c6b2SSha Zhengju __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n);
3938f1755aSMin-Hua Chen __u64 eventfd_signal_mask(struct eventfd_ctx *ctx, __u64 n, __poll_t mask);
40ac6424b9SIngo Molnar int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_entry_t *wait,
41cb289d62SDavide Libenzi 				  __u64 *cnt);
4228f13267SDavid Woodhouse void eventfd_ctx_do_read(struct eventfd_ctx *ctx, __u64 *cnt);
43e1ad7468SDavide Libenzi 
eventfd_signal_allowed(void)44b542e383SThomas Gleixner static inline bool eventfd_signal_allowed(void)
45b5e683d5SJens Axboe {
469f0deaa1SDylan Yudaken 	return !current->in_eventfd;
47b5e683d5SJens Axboe }
48b5e683d5SJens Axboe 
49e1ad7468SDavide Libenzi #else /* CONFIG_EVENTFD */
50e1ad7468SDavide Libenzi 
5113389010SDavide Libenzi /*
5213389010SDavide Libenzi  * Ugly ugly ugly error layer to support modules that uses eventfd but
5313389010SDavide Libenzi  * pretend to work in !CONFIG_EVENTFD configurations. Namely, AIO.
5413389010SDavide Libenzi  */
55562787a5SDavide Libenzi 
eventfd_ctx_fdget(int fd)5613389010SDavide Libenzi static inline struct eventfd_ctx *eventfd_ctx_fdget(int fd)
5713389010SDavide Libenzi {
5813389010SDavide Libenzi 	return ERR_PTR(-ENOSYS);
5913389010SDavide Libenzi }
60e1ad7468SDavide Libenzi 
eventfd_signal(struct eventfd_ctx * ctx,__u64 n)61fd4e60bfSZhang Qilong static inline int eventfd_signal(struct eventfd_ctx *ctx, __u64 n)
6213389010SDavide Libenzi {
6313389010SDavide Libenzi 	return -ENOSYS;
6413389010SDavide Libenzi }
6513389010SDavide Libenzi 
eventfd_signal_mask(struct eventfd_ctx * ctx,__u64 n,unsigned mask)6603e02acdSJens Axboe static inline int eventfd_signal_mask(struct eventfd_ctx *ctx, __u64 n,
6703e02acdSJens Axboe 				      unsigned mask)
6803e02acdSJens Axboe {
6903e02acdSJens Axboe 	return -ENOSYS;
7003e02acdSJens Axboe }
7103e02acdSJens Axboe 
eventfd_ctx_put(struct eventfd_ctx * ctx)7213389010SDavide Libenzi static inline void eventfd_ctx_put(struct eventfd_ctx *ctx)
7313389010SDavide Libenzi {
7413389010SDavide Libenzi 
7513389010SDavide Libenzi }
7613389010SDavide Libenzi 
eventfd_ctx_remove_wait_queue(struct eventfd_ctx * ctx,wait_queue_entry_t * wait,__u64 * cnt)77cb289d62SDavide Libenzi static inline int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx,
78ac6424b9SIngo Molnar 						wait_queue_entry_t *wait, __u64 *cnt)
79cb289d62SDavide Libenzi {
80cb289d62SDavide Libenzi 	return -ENOSYS;
81cb289d62SDavide Libenzi }
82cb289d62SDavide Libenzi 
eventfd_signal_allowed(void)83b542e383SThomas Gleixner static inline bool eventfd_signal_allowed(void)
84b5e683d5SJens Axboe {
85b542e383SThomas Gleixner 	return true;
86b5e683d5SJens Axboe }
87b5e683d5SJens Axboe 
eventfd_ctx_do_read(struct eventfd_ctx * ctx,__u64 * cnt)8828f13267SDavid Woodhouse static inline void eventfd_ctx_do_read(struct eventfd_ctx *ctx, __u64 *cnt)
8928f13267SDavid Woodhouse {
9028f13267SDavid Woodhouse 
9128f13267SDavid Woodhouse }
9228f13267SDavid Woodhouse 
9313389010SDavide Libenzi #endif
94e1ad7468SDavide Libenzi 
95e1ad7468SDavide Libenzi #endif /* _LINUX_EVENTFD_H */
96e1ad7468SDavide Libenzi 
97