[16/28] seccomp: Speedup entry cleaning

Submitted by Cyrill Gorcunov on March 20, 2018, 9:43 p.m.

Details

Message ID 20180320214313.25326-17-gorcunov@gmail.com
State Rejected
Series "seccomp, v2: Add support for per-thread tracking"
Headers show

Commit Message

Cyrill Gorcunov March 20, 2018, 9:43 p.m.
From: Cyrill Gorcunov <gorcunov@virtuozzo.com>

Signed-off-by: Cyrill Gorcunov <gorcunov@virtuozzo.com>
---
 criu/include/seccomp.h |  1 +
 criu/seccomp.c         | 14 +++++++++-----
 2 files changed, 10 insertions(+), 5 deletions(-)

Patch hide | download patch | download mbox

diff --git a/criu/include/seccomp.h b/criu/include/seccomp.h
index ff0465b8266f..c1c1bf4c3be4 100644
--- a/criu/include/seccomp.h
+++ b/criu/include/seccomp.h
@@ -53,6 +53,7 @@  struct seccomp_filter_chain {
 
 struct seccomp_entry {
 	struct rb_node			node;
+	struct seccomp_entry		*next;
 	pid_t				tid_real;
 	size_t				last_filter;
 	unsigned int			mode;
diff --git a/criu/seccomp.c b/criu/seccomp.c
index 0f0866e0c4a5..f73bcfbaaa1a 100644
--- a/criu/seccomp.c
+++ b/criu/seccomp.c
@@ -22,6 +22,7 @@ 
 #define LOG_PREFIX "seccomp: "
 
 static struct rb_root seccomp_tid_rb_root = RB_ROOT;
+static struct seccomp_entry *seccomp_tid_entry_root;
 
 struct seccomp_entry *seccomp_lookup(pid_t tid_real, bool create, bool mandatory)
 {
@@ -50,6 +51,7 @@  struct seccomp_entry *seccomp_lookup(pid_t tid_real, bool create, bool mandatory
 		rb_init_node(&entry->node);
 		entry->tid_real	= tid_real;
 
+		entry->next = seccomp_tid_entry_root, seccomp_tid_entry_root = entry;
 		rb_link_and_balance(&seccomp_tid_rb_root, &entry->node, parent, new);
 	} else {
 		if (mandatory)
@@ -92,14 +94,16 @@  static void seccomp_free_chain(struct seccomp_entry *entry)
 
 void seccomp_free_entries(void)
 {
-	struct seccomp_entry *entry;
-	struct rb_node *node;
+	struct seccomp_entry *entry, *next;
 
-	while ((node = rb_first(&seccomp_tid_rb_root))) {
-		rb_erase(node, &seccomp_tid_rb_root);
-		entry = rb_entry(node, struct seccomp_entry, node);
+	for (entry = seccomp_tid_entry_root; entry; entry = next) {
+		next = entry->next;
+		seccomp_free_chain(entry);
 		xfree(entry);
 	}
+
+	seccomp_tid_rb_root = RB_ROOT;
+	seccomp_tid_entry_root = NULL;
 }
 
 int seccomp_dump_thread(pid_t tid_real, ThreadCoreEntry *thread_core)