1224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*
2224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *  include/linux/eventpoll.h ( Efficient event polling implementation )
3224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *  Copyright (C) 2001,...,2006	 Davide Libenzi
4224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *
5224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *  This program is free software; you can redistribute it and/or modify
6224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *  it under the terms of the GNU General Public License as published by
7224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *  the Free Software Foundation; either version 2 of the License, or
8224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *  (at your option) any later version.
9224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *
10224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *  Davide Libenzi <davidel@xmailserver.org>
11224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *
12224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
13224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
14224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#ifndef _UAPI_LINUX_EVENTPOLL_H
15224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define _UAPI_LINUX_EVENTPOLL_H
16224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
17224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* For O_CLOEXEC */
18224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#include <linux/fcntl.h>
19224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#include <linux/types.h>
20224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
21224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* Flags for epoll_create1.  */
22224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define EPOLL_CLOEXEC O_CLOEXEC
23224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
24224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* Valid opcodes to issue to sys_epoll_ctl() */
25224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define EPOLL_CTL_ADD 1
26224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define EPOLL_CTL_DEL 2
27224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define EPOLL_CTL_MOD 3
28224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
29224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*
30224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Request the handling of system wakeup events so as to prevent system suspends
31224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * from happening while those events are being processed.
32224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *
33224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Assuming neither EPOLLET nor EPOLLONESHOT is set, system suspends will not be
34224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * re-allowed until epoll_wait is called again after consuming the wakeup
35224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * event(s).
36224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *
37224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Requires CAP_BLOCK_SUSPEND
38224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
39224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define EPOLLWAKEUP (1 << 29)
40224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
41224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* Set the One Shot behaviour for the target file descriptor */
42224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define EPOLLONESHOT (1 << 30)
43224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
44224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* Set the Edge Triggered behaviour for the target file descriptor */
45224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define EPOLLET (1 << 31)
46224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
47224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*
48224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * On x86-64 make the 64bit structure have the same alignment as the
49224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 32bit structure. This makes 32bit emulation easier.
50224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *
51224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * UML/x86_64 needs the same packing as x86_64
52224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
53224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#ifdef __x86_64__
54224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define EPOLL_PACKED __attribute__((packed))
55224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#else
56224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define EPOLL_PACKED
57224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#endif
58224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
59224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct epoll_event {
60224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	__u32 events;
61224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	__u64 data;
62224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng} EPOLL_PACKED;
63224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
64e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#ifdef CONFIG_PM_SLEEP
65e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline void ep_take_care_of_epollwakeup(struct epoll_event *epev)
66e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{
67e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris	if ((epev->events & EPOLLWAKEUP) && !capable(CAP_BLOCK_SUSPEND))
68e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris		epev->events &= ~EPOLLWAKEUP;
69e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris}
70e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#else
71e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferrisstatic inline void ep_take_care_of_epollwakeup(struct epoll_event *epev)
72e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris{
73e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris	epev->events &= ~EPOLLWAKEUP;
74e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris}
75e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#endif
76224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#endif /* _UAPI_LINUX_EVENTPOLL_H */
77