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
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [day] [month] [year] [list]
Message-Id: <201201092154.q09LssQC031126@int-mx01.intmail.prod.int.phx2.redhat.com>
Date:	Mon, 9 Jan 2012 16:54:54 -0500
From:	Jason Baron <jbaron@...hat.com>
To:	akpm@...ux-foundation.org
Cc:	davidel@...ilserver.org, nelhage@...lice.com,
	linux-kernel@...r.kernel.org
Subject: [PATCH] epoll: Cleanup limit paths

Cleanups based on Andrew Morton's review:
https://lkml.org/lkml/2011/9/2/356

Signed-off-by: Jason Baron <jbaron@...hat.com>
---
 fs/eventpoll.c |   36 ++++++++++++++++++++++--------------
 1 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index fd8b8b9..ca47608 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -202,7 +202,7 @@ struct eventpoll {
 
 	/* used to optimize loop detection check */
 	int visited;
-	struct list_head visitedllink;
+	struct list_head visited_list_link;
 };
 
 /* Wait structure used by the poll hooks */
@@ -262,10 +262,13 @@ static struct kmem_cache *epi_cache __read_mostly;
 static struct kmem_cache *pwq_cache __read_mostly;
 
 /* Visited nodes during ep_loop_check(), so we can unset them when we finish */
-LIST_HEAD(visited_list);
+static LIST_HEAD(visited_list);
 
-/* Files with newly added links, which need a limit on emanating paths */
-LIST_HEAD(tfile_check_list);
+/*
+ * List of files with newly added links, where we may need to limit the number
+ * of emanating paths. Protected by the epmutex.
+ */
+static LIST_HEAD(tfile_check_list);
 
 #ifdef CONFIG_SYSCTL
 
@@ -944,16 +947,19 @@ static void ep_rbtree_insert(struct eventpoll *ep, struct epitem *epi)
 
 
 #define PATH_ARR_SIZE 5
-/* These are the number paths of length 1 to 5, that we are allowing to emanate
+/*
+ * These are the number paths of length 1 to 5, that we are allowing to emanate
  * from a single file of interest. For example, we allow 1000 paths of length
  * 1, to emanate from each file of interest. This essentially represents the
  * potential wakeup paths, which need to be limited in order to avoid massive
  * uncontrolled wakeup storms. The common use case should be a single ep which
  * is connected to n file sources. In this case each file source has 1 path
- * of length 1. Thus, the numbers below should be more than sufficient.
+ * of length 1. Thus, the numbers below should be more than sufficient. These
+ * path limits are enforced during an EPOLL_CTL_ADD operation, since a modify
+ * and delete can't add additional paths. Protected by the epmutex.
  */
-int path_limits[PATH_ARR_SIZE] = { 1000, 500, 100, 50, 10 };
-int path_count[PATH_ARR_SIZE];
+static const int path_limits[PATH_ARR_SIZE] = { 1000, 500, 100, 50, 10 };
+static int path_count[PATH_ARR_SIZE];
 
 static int path_count_inc(int nests)
 {
@@ -1408,7 +1414,7 @@ static int ep_loop_check_proc(void *priv, void *cookie, int call_nests)
 
 	mutex_lock_nested(&ep->mtx, call_nests + 1);
 	ep->visited = 1;
-	list_add(&ep->visitedllink, &visited_list);
+	list_add(&ep->visited_list_link, &visited_list);
 	for (rbp = rb_first(&ep->rbr); rbp; rbp = rb_next(rbp)) {
 		epi = rb_entry(rbp, struct epitem, rbn);
 		if (unlikely(is_file_epoll(epi->ffd.file))) {
@@ -1421,12 +1427,13 @@ static int ep_loop_check_proc(void *priv, void *cookie, int call_nests)
 			if (error != 0)
 				break;
 		} else {
-			/* if we've reached a file that is not associated with
-			 * an ep, then then we need to check if the newly added
+			/*
+			 * If we've reached a file that is not associated with
+			 * an ep, then we need to check if the newly added
 			 * links are going to add too many wakeup paths. We do
 			 * this by adding it to the tfile_check_list, if it's
 			 * not already there, and calling reverse_path_check()
-			 * during ep_insert()
+			 * during ep_insert().
 			 */
 			if (list_empty(&epi->ffd.file->f_tfile_llink))
 				list_add(&epi->ffd.file->f_tfile_llink,
@@ -1457,9 +1464,10 @@ static int ep_loop_check(struct eventpoll *ep, struct file *file)
 	ret = ep_call_nested(&poll_loop_ncalls, EP_MAX_NESTS,
 			      ep_loop_check_proc, file, ep, current);
 	/* clear visited list */
-	list_for_each_entry_safe(ep_cur, ep_next, &visited_list, visitedllink) {
+	list_for_each_entry_safe(ep_cur, ep_next, &visited_list,
+							visited_list_link) {
 		ep_cur->visited = 0;
-		list_del(&ep_cur->visitedllink);
+		list_del(&ep_cur->visited_list_link);
 	}
 	return ret;
 }
-- 
1.7.7.5

--
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

Powered by Openwall GNU/*/Linux Powered by OpenVZ