lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Sun, 25 Mar 2012 21:12:41 +0200 From: Hagen Paul Pfeifer <hagen@...u.net> To: torvalds@...ux-foundation.org Cc: linux-kernel@...r.kernel.org, Hagen Paul Pfeifer <hagen@...u.net> Subject: [PATCH] epoll: add EPOLLEXCLUSIVE support High performance server sometimes create one listening socket (e.g. port 80), create a epoll file descriptor and add the socket. Afterwards create SC_NPROCESSORS_ONLN threads and wait for events. This often result in a thundering herd problem because all CPUs are scheduled. This patch add an additional flag to epoll_ctl(2) called EPOLLEXCLUSIVE. If a descriptor is added with this flag only one CPU is scheduled in. Signed-off-by: Hagen Paul Pfeifer <hagen@...u.net> --- Dave rejected the patch and said not network specific. Because there is no epoll maintainer I send it now directly. fs/eventpoll.c | 7 +++++-- include/linux/eventpoll.h | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 629e9ed..16d787f 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -88,7 +88,7 @@ */ /* Epoll private bits inside the event mask */ -#define EP_PRIVATE_BITS (EPOLLONESHOT | EPOLLET) +#define EP_PRIVATE_BITS (EPOLLONESHOT | EPOLLET | EPOLLEXCLUSIVE) /* Maximum number of nesting allowed inside epoll sets */ #define EP_MAX_NESTS 4 @@ -969,7 +969,10 @@ static void ep_ptable_queue_proc(struct file *file, wait_queue_head_t *whead, init_waitqueue_func_entry(&pwq->wait, ep_poll_callback); pwq->whead = whead; pwq->base = epi; - add_wait_queue(whead, &pwq->wait); + if (unlikely(epi->event.events & EPOLLEXCLUSIVE)) + add_wait_queue_exclusive(whead, &pwq->wait); + else + add_wait_queue(whead, &pwq->wait); list_add_tail(&pwq->llink, &epi->pwqlist); epi->nwait++; } else { diff --git a/include/linux/eventpoll.h b/include/linux/eventpoll.h index 657ab55..d334389 100644 --- a/include/linux/eventpoll.h +++ b/include/linux/eventpoll.h @@ -26,6 +26,9 @@ #define EPOLL_CTL_DEL 2 #define EPOLL_CTL_MOD 3 +/* Set Exclusive wake up behaviour for the target file descriptor */ +#define EPOLLEXCLUSIVE (1 << 29) + /* Set the One Shot behaviour for the target file descriptor */ #define EPOLLONESHOT (1 << 30) -- 1.7.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists