linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: tglx@linutronix.de, jpoimboe@redhat.com
Cc: linux-kernel@vger.kernel.org, x86@kernel.org,
	peterz@infradead.org, mhiramat@kernel.org, mbenes@suse.cz,
	brgerst@gmail.com
Subject: [PATCH v2 08/19] objtool: Optimize find_section_by_name()
Date: Tue, 17 Mar 2020 18:02:42 +0100	[thread overview]
Message-ID: <20200317170910.238357020@infradead.org> (raw)
In-Reply-To: 20200317170234.897520633@infradead.org

In order to avoid yet another linear search of (20k) sections, add a
name based hash.

This reduces objtool runtime on vmlinux.o by some 10s to around 35s.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 tools/objtool/elf.c |   10 +++++++++-
 tools/objtool/elf.h |    3 +++
 2 files changed, 12 insertions(+), 1 deletion(-)

--- a/tools/objtool/elf.c
+++ b/tools/objtool/elf.c
@@ -22,11 +22,16 @@
 
 #define MAX_NAME_LEN 128
 
+static inline u32 str_hash(const char *str)
+{
+	return jhash(str, strlen(str), 0);
+}
+
 struct section *find_section_by_name(struct elf *elf, const char *name)
 {
 	struct section *sec;
 
-	list_for_each_entry(sec, &elf->sections, list)
+	hash_for_each_possible(elf->section_name_hash, sec, name_hash, str_hash(name))
 		if (!strcmp(sec->name, name))
 			return sec;
 
@@ -202,6 +207,7 @@ static int read_sections(struct elf *elf
 
 		list_add_tail(&sec->list, &elf->sections);
 		hash_add(elf->section_hash, &sec->hash, sec->idx);
+		hash_add(elf->section_name_hash, &sec->name_hash, str_hash(sec->name));
 	}
 
 	if (stats)
@@ -441,6 +447,7 @@ struct elf *elf_read(const char *name, i
 
 	hash_init(elf->symbol_hash);
 	hash_init(elf->section_hash);
+	hash_init(elf->section_name_hash);
 	INIT_LIST_HEAD(&elf->sections);
 
 	elf->fd = open(name, flags);
@@ -581,6 +588,7 @@ struct section *elf_create_section(struc
 
 	list_add_tail(&sec->list, &elf->sections);
 	hash_add(elf->section_hash, &sec->hash, sec->idx);
+	hash_add(elf->section_name_hash, &sec->name_hash, str_hash(sec->name));
 
 	return sec;
 }
--- a/tools/objtool/elf.h
+++ b/tools/objtool/elf.h
@@ -10,6 +10,7 @@
 #include <gelf.h>
 #include <linux/list.h>
 #include <linux/hashtable.h>
+#include <linux/jhash.h>
 
 #ifdef LIBELF_USE_DEPRECATED
 # define elf_getshdrnum    elf_getshnum
@@ -26,6 +27,7 @@
 struct section {
 	struct list_head list;
 	struct hlist_node hash;
+	struct hlist_node name_hash;
 	GElf_Shdr sh;
 	struct list_head symbol_list;
 	struct list_head rela_list;
@@ -73,6 +75,7 @@ struct elf {
 	struct list_head sections;
 	DECLARE_HASHTABLE(symbol_hash, 20);
 	DECLARE_HASHTABLE(section_hash, 16);
+	DECLARE_HASHTABLE(section_name_hash, 16);
 };
 
 



  parent reply	other threads:[~2020-03-17 17:12 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-17 17:02 [PATCH v2 00/19] objtool: vmlinux.o and noinstr validation Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 01/19] objtool: Introduce validate_return() Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 02/19] objtool: Rename func_for_each_insn() Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 03/19] objtool: Rename func_for_each_insn_all() Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 04/19] x86/kexec: Use RIP relative addressing Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 05/19] objtool: Optimize find_symbol_by_index() Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 06/19] objtool: Add a statistics mode Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 07/19] objtool: Optimize find_section_by_index() Peter Zijlstra
2020-03-17 17:02 ` Peter Zijlstra [this message]
2020-03-17 17:02 ` [PATCH v2 09/19] objtool: Optimize find_symbol_*() and read_symbols() Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 10/19] objtool: Rename find_containing_func() Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 11/19] objtool: Resize insn_hash Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 12/19] objtool: Optimize find_symbol_by_name() Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 13/19] objtool: Optimize read_sections() Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 14/19] objtool: Delete cleanup() Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 15/19] objtool: Optimize find_rela_by_dest_range() Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 16/19] objtool: Implement noinstr validation Peter Zijlstra
2020-03-17 21:00   ` Josh Poimboeuf
2020-03-18  9:03     ` Peter Zijlstra
2020-03-18 10:06       ` Peter Zijlstra
2020-03-18 13:21   ` Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 17/19] objtool: Optimize !vmlinux.o again Peter Zijlstra
2020-03-18 13:20   ` Peter Zijlstra
2020-03-20 16:20     ` Miroslav Benes
2020-03-21 15:14       ` Peter Zijlstra
2020-03-21 16:11         ` Peter Zijlstra
2020-03-23  7:27           ` Miroslav Benes
2020-03-17 17:02 ` [PATCH v2 18/19] objtool: Use sec_offset_hash() for insn_hash Peter Zijlstra
2020-03-17 17:02 ` [PATCH v2 19/19] objtool: Detect loading function pointers across noinstr Peter Zijlstra
2020-03-17 23:39   ` kbuild test robot
2020-03-17 23:43     ` Nick Desaulniers
2020-03-18 11:02       ` Peter Zijlstra
2020-03-18  7:18   ` kbuild test robot
2020-03-17 21:05 ` [PATCH v2 00/19] objtool: vmlinux.o and noinstr validation Josh Poimboeuf
2020-03-18 13:18 ` [RFC][PATCH v2 20/19] kbuild/objtool: Add objtool-vmlinux.o pass Peter Zijlstra
2020-03-18 14:13   ` Peter Zijlstra
2020-03-18 18:34   ` Josh Poimboeuf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200317170910.238357020@infradead.org \
    --to=peterz@infradead.org \
    --cc=brgerst@gmail.com \
    --cc=jpoimboe@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mbenes@suse.cz \
    --cc=mhiramat@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).