summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorMasahiro Yamada <masahiroy@kernel.org>2024-02-03 00:58:23 +0900
committerMasahiro Yamada <masahiroy@kernel.org>2024-02-20 20:44:48 +0900
commit980c9e198f1c5563380bed2a2672e592edf9efaa (patch)
treeacfbc1a77936e2d727dc8930b71ed4821ea21941 /scripts
parent7c4aa901bd9d7e95be95a5c888d026b3214bae05 (diff)
downloadlinux-stable-980c9e198f1c5563380bed2a2672e592edf9efaa.tar.gz
linux-stable-980c9e198f1c5563380bed2a2672e592edf9efaa.tar.bz2
linux-stable-980c9e198f1c5563380bed2a2672e592edf9efaa.zip
kconfig: convert linked list of files to hash table
Currently, a linked list is used to keep track of all the Kconfig files that have ever been parsed. Every time the "source" statement is encountered, the linked list is traversed to check if the file has been opened before. This prevents the same file from being recorded in include/config/auto.conf.cmd again. Given 1500+ Kconfig files parsed, a hashtable is now a more optimal data structure. By the way, you may wonder why we check this in the first place. It matters only when the same file is included multiple times. In old days, such a use case was forbidden, but commit f094f8a1b273 ("kconfig: allow multiple inclusion of the same file") provided a bit more flexibility. Of course, it is almost hypothetical... Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/kconfig/util.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/scripts/kconfig/util.c b/scripts/kconfig/util.c
index d6172f2f64c9..439c131b424e 100644
--- a/scripts/kconfig/util.c
+++ b/scripts/kconfig/util.c
@@ -7,6 +7,8 @@
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
+
+#include "hashtable.h"
#include "lkc.h"
unsigned int strhash(const char *s)
@@ -19,32 +21,32 @@ unsigned int strhash(const char *s)
return hash;
}
+/* hash table of all parsed Kconfig files */
+static HASHTABLE_DEFINE(file_hashtable, 1U << 11);
+
struct file {
- struct file *next;
+ struct hlist_node node;
char name[];
};
-static struct file *file_list;
-
/* file already present in list? If not add it */
const char *file_lookup(const char *name)
{
struct file *file;
size_t len;
+ int hash = strhash(name);
- for (file = file_list; file; file = file->next) {
- if (!strcmp(name, file->name)) {
+ hash_for_each_possible(file_hashtable, file, node, hash)
+ if (!strcmp(name, file->name))
return file->name;
- }
- }
len = strlen(name);
file = xmalloc(sizeof(*file) + len + 1);
memset(file, 0, sizeof(*file));
memcpy(file->name, name, len);
file->name[len] = '\0';
- file->next = file_list;
- file_list = file;
+
+ hash_add(file_hashtable, &file->node, hash);
str_printf(&autoconf_cmd, "\t%s \\\n", name);