This one introduces structures of user items array: struct user_epheader - describes inserted epoll items. struct user_epitem - single epoll item, visible to userspace. Signed-off-by: Roman Penyaev <rpenyaev@xxxxxxx> Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> Cc: Davidlohr Bueso <dbueso@xxxxxxx> Cc: Jason Baron <jbaron@xxxxxxxxxx> Cc: Al Viro <viro@xxxxxxxxxxxxxxxxxx> Cc: "Paul E. McKenney" <paulmck@xxxxxxxxxxxxxxxxxx> Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> Cc: Andrea Parri <andrea.parri@xxxxxxxxxxxxxxxxxxxx> Cc: linux-fsdevel@xxxxxxxxxxxxxxx Cc: linux-kernel@xxxxxxxxxxxxxxx --- fs/eventpoll.c | 9 +++++++++ include/uapi/linux/eventpoll.h | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 2cc183e86a29..f598442512f3 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -9,6 +9,8 @@ * * Davide Libenzi <davidel@xxxxxxxxxxxxxxx> * + * Polling from userspace support by Roman Penyaev <rpenyaev@xxxxxxx> + * (C) Copyright 2019 SUSE, All Rights Reserved */ #include <linux/init.h> @@ -109,6 +111,13 @@ #define EP_ITEM_COST (sizeof(struct epitem) + sizeof(struct eppoll_entry)) +/* + * That is around 1.3mb of allocated memory for one epfd. What is more + * important is ->index_length, which should be ^2, so do not increase + * max items number to avoid size doubling of user index. + */ +#define EP_USERPOLL_MAX_ITEMS_NR 65536 + struct epoll_filefd { struct file *file; int fd; diff --git a/include/uapi/linux/eventpoll.h b/include/uapi/linux/eventpoll.h index 39dfc29f0f52..690a625ddeb2 100644 --- a/include/uapi/linux/eventpoll.h +++ b/include/uapi/linux/eventpoll.h @@ -79,4 +79,23 @@ struct epoll_event { __u64 data; } EPOLL_PACKED; +struct epoll_uitem { + __poll_t ready_events; + struct epoll_event event; +}; + +#define EPOLL_USERPOLL_HEADER_SIZE 128 +#define EPOLL_USERPOLL_HEADER_MAGIC 0xeb01eb01 + +struct epoll_uheader { + u32 magic; /* epoll user header magic */ + u32 header_length; /* length of the header + items */ + u32 index_length; /* length of the index ring, always pow2 */ + u32 max_items_nr; /* max number of items */ + u32 head; /* updated by userland */ + u32 tail; /* updated by kernel */ + + struct epoll_uitem items[] __aligned(EPOLL_USERPOLL_HEADER_SIZE); +}; + #endif /* _UAPI_LINUX_EVENTPOLL_H */ -- 2.19.1