lkml.org 
[lkml]   [2019]   [Jan]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[RFC PATCH 07/15] epoll: extend epitem struct with new members for polling from userspace
Date
 ->bit
every epitem has an element inside user item array, this bit is
actually an index position of that user item array and also a
bit inside ep->items_bm

->ready_events
received events in the period when descriptor can't be polled
from userspace and ep->rdllist is used for keeping list of
ready items

->work
work for offloading polling from task context if epfd is polled
from userspace but driver does not provide pollflags on wakeup

Signed-off-by: Roman Penyaev <rpenyaev@suse.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Davidlohr Bueso <dbueso@suse.de>
Cc: Jason Baron <jbaron@akamai.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrea Parri <andrea.parri@amarulasolutions.com>
Cc: linux-fsdevel@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
fs/eventpoll.c | 21 +++++++++++++++------
1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index ae288f62aa4c..637b463587c1 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -9,6 +9,8 @@
*
* Davide Libenzi <davidel@xmailserver.org>
*
+ * Polling from userspace support by Roman Penyaev <rpenyaev@suse.de>
+ * (C) Copyright 2019 SUSE, All Rights Reserved
*/

#include <linux/init.h>
@@ -42,6 +44,7 @@
#include <linux/seq_file.h>
#include <linux/compat.h>
#include <linux/rculist.h>
+#include <linux/workqueue.h>
#include <net/busy_poll.h>

/*
@@ -176,6 +179,18 @@ struct epitem {

/* The structure that describe the interested events and the source fd */
struct epoll_event event;
+
+ /* Bit in user bitmap for user polling */
+ unsigned int bit;
+
+ /*
+ * Collect ready events for the period when descriptor is polled by user
+ * but events are routed to klists.
+ */
+ __poll_t ready_events;
+
+ /* Work for offloading event callback */
+ struct work_struct work;
};

#define EPOLL_USER_HEADER_SIZE 128
@@ -2557,12 +2572,6 @@ static int __init eventpoll_init(void)
ep_nested_calls_init(&poll_safewake_ncalls);
#endif

- /*
- * We can have many thousands of epitems, so prevent this from
- * using an extra cache line on 64-bit (and smaller) CPUs
- */
- BUILD_BUG_ON(sizeof(void *) <= 8 && sizeof(struct epitem) > 128);
-
/* Allocates slab cache used to allocate "struct epitem" items */
epi_cache = kmem_cache_create("eventpoll_epi", sizeof(struct epitem),
0, SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_ACCOUNT, NULL);
--
2.19.1
\
 
 \ /
  Last update: 2019-01-09 17:42    [W:0.073 / U:0.072 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site