From 7c7afc65c2138cd6b69872ee90370911e6cf9052 Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Sun, 16 Jan 2022 00:31:10 +0100 Subject: [PATCH 01/25] libkmod: add helper functions for walking indices ... and use them to implement kmod_index_dump(). These helpers will be useful in depmod. Signed-off-by: Martin Wilck --- libkmod/libkmod-index.c | 70 +++++++++++++++++++++++++++-------------- libkmod/libkmod-index.h | 6 ++++ 2 files changed, 52 insertions(+), 24 deletions(-) diff --git a/libkmod/libkmod-index.c b/libkmod/libkmod-index.c index cc11f4d3..15d8d661 100644 --- a/libkmod/libkmod-index.c +++ b/libkmod/libkmod-index.c @@ -395,20 +395,18 @@ static struct index_node_f *index_readchild(const struct index_node_f *parent, u return NULL; } -static void index_dump_node(struct index_node_f *node, struct strbuf *buf, - struct wrtbuf *wbuf) +static void index_walk_node(struct index_node_f *node, struct strbuf *buf, + index_walk_cb *callback, void *arg) { struct index_value *v; size_t pushed; + const char *key; pushed = strbuf_pushchars(buf, node->prefix); + key = strbuf_str(buf); - for (v = node->values; v != NULL; v = v->next) { - wrtbuf_write(wbuf, buf->bytes, strbuf_used(buf)); - wrtbuf_write(wbuf, " ", 1); - wrtbuf_write(wbuf, v->value, strlen(v->value)); - wrtbuf_write(wbuf, "\n", 1); - } + for (v = node->values; v != NULL; v = v->next) + callback(key, v->value, v->len, v->priority, arg); for (uint8_t ch = node->first; ch <= node->last; ch++) { struct index_node_f *child = index_readchild(node, ch); @@ -417,7 +415,7 @@ static void index_dump_node(struct index_node_f *node, struct strbuf *buf, continue; if (strbuf_pushchar(buf, ch)) { - index_dump_node(child, buf, wbuf); + index_walk_node(child, buf, callback, arg); strbuf_popchar(buf); } } @@ -426,19 +424,37 @@ static void index_dump_node(struct index_node_f *node, struct strbuf *buf, index_close(node); } -void index_dump(struct index_file *in, int fd, bool alias_prefix) +void index_walk(struct index_file *in, bool alias_prefix, index_walk_cb *callback, + void *arg) { DECLARE_STRBUF_WITH_STACK(buf, 128); struct index_node_f *root; - struct wrtbuf wbuf; root = index_readroot(in); if (root == NULL) return; - wrtbuf_init(&wbuf, fd); if (!alias_prefix || strbuf_pushchars(&buf, "alias ")) - index_dump_node(root, &buf, &wbuf); + index_walk_node(root, &buf, callback, arg); +} + +static void index_dump_cb(const char *key, const char *str, unsigned int len, + unsigned int priority, void *arg) +{ + struct wrtbuf *wbuf = arg; + + wrtbuf_write(wbuf, key, strlen(key)); + wrtbuf_write(wbuf, " ", 1); + wrtbuf_write(wbuf, str, len - 1); + wrtbuf_write(wbuf, "\n", 1); +} + +void index_dump(struct index_file *in, int fd, bool alias_prefix) +{ + struct wrtbuf wbuf; + + wrtbuf_init(&wbuf, fd); + index_walk(in, alias_prefix, index_dump_cb, &wbuf); wrtbuf_flush(&wbuf); } @@ -852,22 +868,21 @@ static struct index_mm_node *index_mm_readchild(const struct index_mm_node *pare return NULL; } -static void index_mm_dump_node(struct index_mm_node *node, struct strbuf *buf, - struct wrtbuf *wbuf) +static void index_mm_walk_node(const struct index_mm_node *node, struct strbuf *buf, + index_walk_cb *callback, void *arg) { const void *p; size_t i, pushed; + const char *key; pushed = strbuf_pushchars(buf, node->prefix); + key = strbuf_str(buf); for (i = 0, p = node->values; i < node->value_count; i++) { struct index_mm_value v; read_value_mm(&p, &v); - wrtbuf_write(wbuf, buf->bytes, strbuf_used(buf)); - wrtbuf_write(wbuf, " ", 1); - wrtbuf_write(wbuf, v.value, v.len); - wrtbuf_write(wbuf, "\n", 1); + callback(key, v.value, v.len, v.priority, arg); } for (uint8_t ch = node->first; ch <= node->last; ch++) { @@ -878,7 +893,7 @@ static void index_mm_dump_node(struct index_mm_node *node, struct strbuf *buf, continue; if (strbuf_pushchar(buf, ch)) { - index_mm_dump_node(child, buf, wbuf); + index_mm_walk_node(child, buf, callback, arg); strbuf_popchar(buf); } } @@ -886,19 +901,26 @@ static void index_mm_dump_node(struct index_mm_node *node, struct strbuf *buf, strbuf_popchars(buf, pushed); } -void index_mm_dump(const struct index_mm *idx, int fd, bool alias_prefix) +void index_mm_walk(const struct index_mm *idx, bool alias_prefix, index_walk_cb *callback, + void *arg) { DECLARE_STRBUF_WITH_STACK(buf, 128); struct index_mm_node nbuf, *root; - struct wrtbuf wbuf; root = index_mm_readroot(idx, &nbuf); if (root == NULL) return; - wrtbuf_init(&wbuf, fd); if (!alias_prefix || strbuf_pushchars(&buf, "alias ")) - index_mm_dump_node(root, &buf, &wbuf); + index_mm_walk_node(root, &buf, callback, arg); +} + +void index_mm_dump(const struct index_mm *idx, int fd, bool alias_prefix) +{ + struct wrtbuf wbuf; + + wrtbuf_init(&wbuf, fd); + index_mm_walk(idx, alias_prefix, index_dump_cb, &wbuf); wrtbuf_flush(&wbuf); } diff --git a/libkmod/libkmod-index.h b/libkmod/libkmod-index.h index 47c50d38..7023fcb0 100644 --- a/libkmod/libkmod-index.h +++ b/libkmod/libkmod-index.h @@ -16,10 +16,14 @@ struct index_value { /* In-memory index (depmod only) */ struct index_file; +typedef void(index_walk_cb)(const char *key, const char *value, unsigned int len, + unsigned int prio, void *arg); struct index_file *index_file_open(const char *filename); void index_file_close(struct index_file *idx); char *index_search(struct index_file *idx, const char *key); void index_dump(struct index_file *in, int fd, bool alias_prefix); +void index_walk(struct index_file *in, bool alias_prefix, index_walk_cb *callback, + void *arg); struct index_value *index_searchwild(struct index_file *idx, const char *key); void index_values_free(struct index_value *values); @@ -31,4 +35,6 @@ int index_mm_open(const struct kmod_ctx *ctx, const char *filename, void index_mm_close(struct index_mm *index); char *index_mm_search(const struct index_mm *idx, const char *key); struct index_value *index_mm_searchwild(const struct index_mm *idx, const char *key); +void index_mm_walk(const struct index_mm *idx, bool alias_prefix, index_walk_cb *callback, + void *arg); void index_mm_dump(const struct index_mm *idx, int fd, bool alias_prefix); From 8bfd8cc81d846503c4e9453152f4135f97b01cea Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Sun, 19 Sep 2021 20:53:52 +0200 Subject: [PATCH 02/25] libkmod: only use first value when looking up symbols Symbol mappings are unique: depmod_symbol_add() doesn't allow more than one owner of a symbol by storing it in the hash. Thus the regular symbol lookup will only ever return a list with a single entry, the module containing the symbol. Rename kmod_lookup_alias_from_alias_bin to kmod_lookup_alias_from_alias_bin_n, adding an extra parameter indicating the maximum number of values to return. kmod_lookup_alias_from_alias_bin() calls this function setting the maximum to UINT_MAX. When looking up symbols, in modules.symbols.bin, set the maximum to 1. This way the CRC will not be mistaken as a module name. Signed-off-by: Martin Wilck --- libkmod/libkmod.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/libkmod/libkmod.c b/libkmod/libkmod.c index f4510d0e..26eeec6a 100644 --- a/libkmod/libkmod.c +++ b/libkmod/libkmod.c @@ -348,11 +348,13 @@ void kmod_pool_del_module(struct kmod_ctx *ctx, struct kmod_module *mod, const c hash_del(ctx->modules_by_name, key); } -static int kmod_lookup_alias_from_alias_bin(struct kmod_ctx *ctx, - enum kmod_index index_number, - const char *name, struct kmod_list **list) +static int kmod_lookup_alias_from_alias_bin_n(struct kmod_ctx *ctx, + enum kmod_index index_number, + const char *name, struct kmod_list **list, + unsigned int max_match) { int err, nmatch = 0; + unsigned int n; struct index_file *idx; struct index_value *realnames, *realname; @@ -378,7 +380,8 @@ static int kmod_lookup_alias_from_alias_bin(struct kmod_ctx *ctx, index_file_close(idx); } - for (realname = realnames; realname; realname = realname->next) { + for (realname = realnames, n = 0; realname && n < max_match; + realname = realname->next, n++) { struct kmod_module *mod; struct kmod_list *node; @@ -409,14 +412,21 @@ static int kmod_lookup_alias_from_alias_bin(struct kmod_ctx *ctx, return err; } +static int kmod_lookup_alias_from_alias_bin(struct kmod_ctx *ctx, + enum kmod_index index_number, + const char *name, struct kmod_list **list) +{ + return kmod_lookup_alias_from_alias_bin_n(ctx, index_number, name, list, UINT_MAX); +} + int kmod_lookup_alias_from_symbols_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) { if (!strstartswith(name, "symbol:")) return 0; - return kmod_lookup_alias_from_alias_bin(ctx, KMOD_INDEX_MODULES_SYMBOL, name, - list); + return kmod_lookup_alias_from_alias_bin_n(ctx, KMOD_INDEX_MODULES_SYMBOL, name, + list, 1); } int kmod_lookup_alias_from_aliases_file(struct kmod_ctx *ctx, const char *name, From e8cb779d6e4dbadc49c6ca1b7241d37aeb4a2246 Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Sun, 19 Sep 2021 16:00:39 +0200 Subject: [PATCH 03/25] depmod: write crcsum to modules.symbols.bin Add a the symbol's CRC as second value to every index entry in modules.symbols.bin, using a pseudo "priority" value of UINT_MAX. This will cause modprobe versions that lack the previous patch to complain about invalid modules if modules are looked up by symbol: alias, because they will interpret the CRC as a module name: modprobe: ERROR: could not find module by name='01fe7347' modprobe: ERROR: could not insert '01fe7347': Unknown symbol in module, or unknown parameter (see dmesg) The module owning the symbol and its dependencies will be loaded nonetheless, though. In the unlikely case [*] that the CRC matches a module name, modprobe will try to load that module, too. If the predecessor patch is applied, the CRC will be ignored by modprobe. [*] Afaics, there is currently no module name that matches ^[a-f0-9]{8}$. Signed-off-by: Martin Wilck --- tools/depmod.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/depmod.c b/tools/depmod.c index 5f020f83..fadb6e68 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -2352,6 +2352,7 @@ static int output_symbols_bin(struct depmod *depmod, FILE *out) while (hash_iter_next(&iter, NULL, &v)) { int duplicate; const struct symbol *sym = v; + char crcbuf[17]; if (sym->owner == NULL) continue; @@ -2369,6 +2370,9 @@ static int output_symbols_bin(struct depmod *depmod, FILE *out) if (duplicate && depmod->cfg->warn_dups) WRN("duplicate module syms:\n%s %s\n", strbuf_str(&salias), sym->owner->modname); + + snprintf(crcbuf, sizeof(crcbuf), "%08" PRIx64, sym->crc); + index_insert(idx, strbuf_str(&salias), crcbuf, UINT_MAX); } index_write(idx, out); From 2d8074e59433121918ad0ee24512a2777226e3cb Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Mon, 13 Sep 2021 22:51:03 +0200 Subject: [PATCH 04/25] depmod: add option -I/--incremental Add the option -I/--incremental. With this option, depmod will add the modules given on the command line to the existing module data base. Don't write files related to built-in modules in this mode. This patch just adds the option and documentation, the implementation follows in subsequent patches. Signed-off-by: Martin Wilck --- man/depmod.8.scd | 13 ++++++++++--- tools/depmod.c | 34 ++++++++++++++++++++++------------ 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/man/depmod.8.scd b/man/depmod.8.scd index 1cb6cfc2..aebd3260 100644 --- a/man/depmod.8.scd +++ b/man/depmod.8.scd @@ -7,10 +7,10 @@ depmod - Generate modules.dep and map files. # SYNOPSIS *depmod* [*-b* _basedir_] [*-m* _moduledir_] [*-o* _outdir_] [*-e*] [*-E* _Module.symvers_] -\ \ \ \ \ \ \ \[*-F* _System.map_] [*-n*] [*-v*] [*-A*] [*-P* _prefix_] [*-w*] [_version_] +\ \ \ \ \ \ \ \[*-F* _System.map_] [*-n*] [*-v*] [*-A*] [*-P* _prefix_] [*-w*] [*-I*] [_version_] *depmod* [*-e*] [*-E* _Module.symvers_] [*-F* _System.map_] [*-n*] [*-v*] [*-P* _prefix_] -\ \ \ \ \ \ \ \[*-w*] [_version_] [_filename_...] +\ \ \ \ \ \ \ \[*-w*] [*-I*] [_version_] [_filename_...] # DESCRIPTION @@ -25,7 +25,7 @@ and is empty. See options below to override when needed. It determines what symbols each module exports and needs. This list is written to *modules.dep*, and a binary hashed version named modules.dep.bin, in the same directory. If filenames are given on the command line, only those modules are -examined (which is rarely useful unless all modules are listed). *depmod* also +examined (which is rarely useful unless incremental mode is used). *depmod* also creates a list of symbols provided by modules in the file named modules.symbols and its binary hashed version, modules.symbols.bin. Finally, *depmod* will output a file named modules.devname if modules supply special device names @@ -136,6 +136,13 @@ depmod -b /tmp/build -m kernel-modules *-h*, *--help* Print the help message and exit. +*-I*, *--incremental* + Run in incremental mode. This mode preserves previous module dependencies + and adds the dependencies of the modules given on the command line. If no + modules are given or *--all* is set, the module directory is scanned for + added or deleted modules, and the *modules.dep* file and other outputs + are updated accordingly. + *-n*, *--show*, *--dry-run* This sends the resulting *modules.dep* and the various map files to standard output rather than writing them into the module directory. diff --git a/tools/depmod.c b/tools/depmod.c index fadb6e68..728453bb 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -50,10 +50,11 @@ static const char *const default_cfg_paths[] = { // clang-format on }; -static const char cmdopts_s[] = "aAb:m:o:C:E:F:evnP:wVh"; +static const char cmdopts_s[] = "aAIb:m:o:C:E:F:evnP:wVh"; static const struct option cmdopts[] = { { "all", no_argument, 0, 'a' }, { "quick", no_argument, 0, 'A' }, + { "incremental", no_argument, 0, 'I' }, { "basedir", required_argument, 0, 'b' }, { "moduledir", required_argument, 0, 'm' }, { "outdir", required_argument, 0, 'o' }, @@ -83,6 +84,7 @@ static void help(void) "Options:\n" "\t-a, --all Probe all modules\n" "\t-A, --quick Only does the work if there's a new module\n" + "\t-I, --incremental Add modules from the command line\n" "\t-e, --errsyms Report not supplied symbols\n" "\t-n, --show Write the dependency file on stdout only\n" "\t-P, --symbol-prefix Architecture symbol prefix\n" @@ -516,6 +518,7 @@ struct cfg { uint8_t check_symvers; uint8_t print_unknown; uint8_t warn_dups; + uint8_t incremental; struct cfg_override *overrides; struct cfg_search *searches; struct cfg_external *externals; @@ -2573,18 +2576,19 @@ static int depmod_output(struct depmod *depmod, FILE *out) static const struct depfile { const char *name; int (*cb)(struct depmod *depmod, FILE *out); + bool skip_if_incremental; } *itr, depfiles[] = { - { "modules.dep", output_deps }, - { "modules.dep.bin", output_deps_bin }, - { "modules.alias", output_aliases }, - { "modules.alias.bin", output_aliases_bin }, - { "modules.softdep", output_softdeps }, - { "modules.weakdep", output_weakdeps }, - { "modules.symbols", output_symbols }, - { "modules.symbols.bin", output_symbols_bin }, - { "modules.builtin.bin", output_builtin_bin }, - { "modules.builtin.alias.bin", output_builtin_alias_bin }, - { "modules.devname", output_devname }, + { "modules.dep", output_deps, false }, + { "modules.dep.bin", output_deps_bin, false }, + { "modules.alias", output_aliases, false }, + { "modules.alias.bin", output_aliases_bin, false }, + { "modules.softdep", output_softdeps, false }, + { "modules.weakdep", output_weakdeps, false }, + { "modules.symbols", output_symbols, false }, + { "modules.symbols.bin", output_symbols_bin, false }, + { "modules.builtin.bin", output_builtin_bin, true }, + { "modules.builtin.alias.bin", output_builtin_alias_bin, true }, + { "modules.devname", output_devname, false }, {}, }; const char *dname = depmod->cfg->outdirname; @@ -2614,6 +2618,9 @@ static int depmod_output(struct depmod *depmod, FILE *out) struct tmpfile file; int r, ferr; + if (depmod->cfg->incremental && itr->skip_if_incremental) + continue; + if (fp == NULL) { mode_t mode = 0644; @@ -2922,6 +2929,9 @@ static int do_depmod(int argc, char *argv[]) case 'A': maybe_all = 1; break; + case 'I': + cfg.incremental = 1; + break; case 'b': free(root_arg); root_arg = path_make_absolute_cwd(optarg); From 0400d6f9a3dc5c7395e4d6f5f5898ed6550a88c6 Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Wed, 15 Sep 2021 22:34:58 +0200 Subject: [PATCH 05/25] depmod -I: read current depmod data base from index files For incremental depmod, we need to read in the complete state of the current depmod data base first. We read modules and module dependencies from "modules.dep.bin", symbols and their CRCs from "modules.symbols.bin", using the previously added CRC value. The aliases can't be read from "modules.alias.bin", because in the .bin file, dashes are substituted by underscores in a way that can't be easily undone. That doesn't matter for kmod/modprobe, but for depmod it does. Thus we read the aliases from "modules.alias" instead. Finally, read the softdeps, too. Signed-off-by: Martin Wilck --- libkmod/libkmod-internal.h | 1 + libkmod/libkmod-module.c | 6 +- tools/depmod.c | 426 +++++++++++++++++++++++++++++++++++-- 3 files changed, 413 insertions(+), 20 deletions(-) diff --git a/libkmod/libkmod-internal.h b/libkmod/libkmod-internal.h index c4c24e6f..0d1b2bdc 100644 --- a/libkmod/libkmod-internal.h +++ b/libkmod/libkmod-internal.h @@ -133,6 +133,7 @@ _nonnull_(1)void kmod_module_set_visited(struct kmod_module *mod, bool visited); _nonnull_(1) void kmod_module_set_builtin(struct kmod_module *mod, bool builtin); _nonnull_(1) void kmod_module_set_required(struct kmod_module *mod, bool required); _nonnull_all_ bool kmod_module_is_builtin(struct kmod_module *mod); +_nonnull_(1, 2) struct kmod_list *kmod_module_info_append(struct kmod_list **list, const char *key, size_t keylen, const char *value, size_t valuelen); /* libkmod-file.c */ struct kmod_file; diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c index 796dafa1..68e7b831 100644 --- a/libkmod/libkmod-module.c +++ b/libkmod/libkmod-module.c @@ -1777,9 +1777,9 @@ static void kmod_module_info_free(struct kmod_module_info *info) free(info); } -static struct kmod_list *kmod_module_info_append(struct kmod_list **list, const char *key, - size_t keylen, const char *value, - size_t valuelen) +struct kmod_list *kmod_module_info_append(struct kmod_list **list, const char *key, + size_t keylen, const char *value, + size_t valuelen) { struct kmod_module_info *info; struct kmod_list *n; diff --git a/tools/depmod.c b/tools/depmod.c index 728453bb..da7e32b7 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -28,6 +28,7 @@ #include #include +#include #undef ERR #undef DBG @@ -127,12 +128,6 @@ _printf_format_(1, 2) static inline void _show(const char *fmt, ...) #define INDEX_VERSION ((INDEX_VERSION_MAJOR << 16) | INDEX_VERSION_MINOR) #define INDEX_CHILDMAX 128u -struct index_value { - struct index_value *next; - unsigned int priority; - char value[0]; -}; - /* In-memory index (depmod only) */ struct index_node { char *prefix; /* path compression */ @@ -179,16 +174,6 @@ static struct index_node *index_create(void) return node; } -static void index_values_free(struct index_value *values) -{ - while (values) { - struct index_value *value = values; - - values = value->next; - free(value); - } -} - static void index_destroy(struct index_node *node) { int c; @@ -2665,6 +2650,401 @@ static int depmod_output(struct depmod *depmod, FILE *out) return err; } +static struct index_mm *read_index_mm_bin(const char *name, const struct depmod *depmod) +{ + struct index_mm *index; + unsigned long long dummy; + char fn[PATH_MAX]; + + if (snprintf(fn, PATH_MAX, "%s/%s.bin", depmod->cfg->dirname, name) >= PATH_MAX) + return NULL; + + if (index_mm_open(depmod->ctx, fn, &dummy, &index) != 0) + return NULL; + + return index; +} + +static char *module_abspath(const char *str, size_t plen, const struct depmod *depmod) +{ + char *path; + size_t len; + + if (str[0] == '/') + return strndup(str, plen); + + len = strlen(depmod->cfg->dirname); + path = malloc(len + plen + 2); + if (!path) + return NULL; + + memcpy(path, depmod->cfg->dirname, len); + path[len] = '/'; + memcpy(path + len + 1, str, plen); + path[len + plen + 1] = '\0'; + + return path; +} + +static void add_module_from_deps(const char *name, const char *deps, unsigned int len, + unsigned int prio, void *arg) +{ + struct depmod *depmod = arg; + const char *colon = strchr(deps, ':'); + char *path; + struct kmod_module *kmod; + int rc; + + if (!colon) { + WRN("%s: unexpected value \"%s\"\n", __func__, deps); + return; + } + + path = module_abspath(deps, colon - deps, depmod); + rc = kmod_module_new_from_path(depmod->ctx, path, &kmod); + if (rc < 0) { + ERR("%s: failed to create module %s: %s\n", __func__, path, strerror(-rc)); + goto out_free_path; + } + assert(streq(kmod_module_get_name(kmod), name)); + + rc = depmod_module_add(depmod, kmod); + if (rc < 0) { + ERR("%s: could not add module %s: %s\n", __func__, path, strerror(-rc)); + kmod_module_unref(kmod); + } + + DBG("%s: added %s as %s\n", __func__, name, kmod_module_get_path(kmod)); + +out_free_path: + free(path); +} + +static void add_module_deps_from_deps(const char *name, const char *deps, + unsigned int len, unsigned int prio, void *arg) +{ + struct depmod *depmod = arg; + const char *dps = strchr(deps, ':'); + char *tmp, *tok, *ptr = NULL; + struct mod *mod; + + if (!dps) { + WRN("%s: unexpected value \"%s\"\n", __func__, deps); + return; + } + + mod = hash_find(depmod->modules_by_name, name); + if (!mod) { + ERR("%s: failed to find %s\n", __func__, name); + return; + } + + dps++; + while (*dps == ' ') + dps++; + if (*dps == '\0') { + DBG("%s: %s has no dependencies\n", __func__, name); + return; + } + + tmp = strdup(dps); + if (!tmp) + return; + + for (tok = strtok_r(tmp, " ", &ptr); tok; tok = strtok_r(NULL, " \t", &ptr)) { + struct mod *dmod; + char *p; + int err; + + p = strrchr(tok, '/'); + if (!p) + p = tok; + p = strstr(p, KMOD_EXTENSION_UNCOMPRESSED); + if (!p) { + ERR("%s: invalid path %s\n", __func__, tok); + continue; + } + p[strlen(KMOD_EXTENSION_UNCOMPRESSED)] = '\0'; + + dmod = hash_find(depmod->modules_by_uncrelpath, tok); + if (!dmod) { + ERR("%s: dep %s not found\n", __func__, tok); + continue; + } + + err = array_append_unique(&mod->deps, dmod); + if (err < 0 && err != -EEXIST) { + ERR("%s: failed to add dep %s->%s (%s)\n", __func__, mod->modname, + tok, strerror(-err)); + continue; + } + dmod->users++; + DBG("%s: %s depends on \"%s\"\n", __func__, mod->modname, tok); + } + free(tmp); +} + +static void add_symbol_cb(const char *key, const char *val, unsigned int len, + unsigned int prio, void *arg) +{ + struct depmod *depmod = arg; + static const char _symbol[] = "symbol:"; + struct mod *mod; + struct symbol *sym, *old; + size_t namelen; + int err; + + if (strncmp(key, _symbol, sizeof(_symbol) - 1)) { + ERR("%s: unexpected key %s\n", __func__, key); + return; + } + key += sizeof(_symbol) - 1; + namelen = strlen(key) + 1; + + if (prio == UINT_MAX) { + /* CRC value */ + uint64_t crc; + char *ep; + + old = hash_find(depmod->symbols, key); + if (old == NULL) { + ERR("%s: symbol \"%s\" not found\n", __func__, key); + return; + } + crc = strtoull(val, &ep, 16); + if (*val == '\0' || *ep != '\0') { + ERR("%s: invalid crc \"%s\"\n", __func__, val); + return; + } + if (old->crc && old->crc != crc) + WRN("%s: crc mismatch for %s: %" PRIx64 " != %" PRIx64 "\n", + __func__, key, old->crc, crc); + old->crc = crc; + + DBG("%s: %s has crc %" PRIx64 "\n", __func__, key, crc); + return; + } + + sym = calloc(1, sizeof(struct symbol) + namelen); + if (!sym) + return; + + mod = hash_find(depmod->modules_by_name, val); + if (!mod) { + ERR("%s: module %s not found\n", __func__, val); + return; + } + sym->owner = mod; + memcpy(sym->name, key, namelen); + + old = hash_find(depmod->symbols, sym->name); + if (old && old->owner) { + ERR("%s: symbol %s (->%s) already present, owner %s\n", __func__, + sym->name, mod->path, old->owner->path); + free(sym); + } else if (old) { + DBG("%s: setting owner of %s(%" PRIx64 ") to %s\n", __func__, sym->name, + sym->crc, mod->path); + old->owner = mod; + free(sym); + } else { + err = hash_add(depmod->symbols, sym->name, sym); + if (err < 0) { + ERR("%s: failed to add symbol \"%s\"\n", __func__, key); + free(sym); + return; + } + DBG("add %p sym=%s, crc=%" PRIx64 ", owner=%p %s\n", sym, sym->name, + sym->crc, mod->modname, mod->path); + } +} + +static void add_alias_cb(const char *key, const char *val, void *arg) +{ + struct depmod *depmod = arg; + struct mod *mod; + static const char __alias[] = "alias"; + struct kmod_list *kl; + + mod = hash_find(depmod->modules_by_name, val); + if (mod == NULL) { + ERR("%s: module %s not found\n", __func__, val); + return; + } + + if ((kl = kmod_module_info_append(&mod->info_list, __alias, sizeof(__alias) - 1, + key, strlen(key))) == 0) + ERR("%s: failed to add alias \"%s\" to \"%s\"\n", __func__, key, val); + else { + const char *ali = kmod_module_info_get_value(kmod_list_last(kl)); + + if (array_append(&mod->alias_values, ali) < 0) + ERR("%s: failed to add alias \"%s\" to \"%s\" to array\n", + __func__, ali, val); + else + DBG("%s: %s: alias[%zu] => \"%s\"\n", __func__, val, + mod->alias_values.count - 1, ali); + } +} + +static int read_aliases(struct depmod *depmod) +{ + char line[10240]; + char *fn; + FILE *fp; + int rc = -EINVAL; + + rc = asprintf(&fn, "%s/modules.alias", depmod->cfg->dirname); + if (rc == -1) + return -ENOMEM; + + fp = fopen(fn, "r"); + if (fp == NULL) { + rc = -errno; + ERR("%s: failed to open %s: %s\n", __func__, fn, strerror(errno)); + free(fn); + return rc; + } + + INF("%s: loading %s\n", __func__, fn); + free(fn); + while (fgets(line, sizeof(line), fp) != NULL) { + static const char __alias[] = "alias "; + char *p, *key, *val; + + if (line[0] == '\0' || line[0] == '\n' || line[0] == '#') + continue; + + p = strchr(line, '\n'); + if (p != NULL) + *p = '\0'; + if (p == NULL || strncmp(line, __alias, sizeof(__alias) - 1)) { + WRN("%s: invalid line \"%s\"\n", __func__, line); + goto out_close; + } + + key = line + sizeof(__alias) - 1; + val = strrchr(key, ' '); + assert(val != NULL && val > key); + *val++ = '\0'; + add_alias_cb(key, val, depmod); + } + rc = 0; +out_close: + fclose(fp); + return rc; +} + +static int read_softdeps(struct depmod *depmod) +{ + char line[10240]; + char *fn; + FILE *fp; + int rc = -EINVAL; + + rc = asprintf(&fn, "%s/modules.softdep", depmod->cfg->dirname); + if (rc == -1) + return -ENOMEM; + + fp = fopen(fn, "r"); + if (fp == NULL) { + rc = -errno; + ERR("%s: failed to open %s: %s\n", __func__, fn, strerror(errno)); + free(fn); + return rc; + } + + INF("%s: loading %s\n", __func__, fn); + free(fn); + + while (fgets(line, sizeof(line), fp) != NULL) { + static const char __softdep[] = "softdep"; + char *p, *key, *val; + struct mod *mod; + struct kmod_list *kl; + + if (line[0] == '\0' || line[0] == '\n' || line[0] == '#') + continue; + + p = strchr(line, '\n'); + if (p != NULL) + *p = '\0'; + if (p == NULL || strncmp(line, __softdep, sizeof(__softdep) - 1) || + (line[sizeof(__softdep) - 1] != ' ')) { + WRN("%s: invalid line \"%s\"\n", __func__, line); + goto out_close; + } + + key = line + sizeof(__softdep); + while (*key == ' ' || *key == '\t') + key++; + + val = strpbrk(key, " \t"); + if (val == NULL) { + WRN("%s: no softdep\n", __func__); + goto out_close; + } + *val++ = '\0'; + while (*val == ' ' || *val == '\t') + val++; + + mod = hash_find(depmod->modules_by_name, key); + if (mod == NULL) { + ERR("%s: module %s not found\n", __func__, key); + continue; + } + + if ((kl = kmod_module_info_append(&mod->info_list, __softdep, + sizeof(__softdep) - 1, val, + strlen(val))) == 0) + ERR("%s: failed to add softdep \"%s\" => \"%s\"\n", __func__, key, + val); + else { + const char *softdep = + kmod_module_info_get_value(kmod_list_last(kl)); + + if (array_append(&mod->softdep_values, softdep) < 0) + ERR("%s: failed to add softdep \"%s\" to \"%s\" to array\n", + __func__, softdep, val); + else + DBG("%s: %s: softdep[%zu] => \"%s\"\n", __func__, val, + mod->softdep_values.count - 1, softdep); + } + } + rc = 0; +out_close: + fclose(fp); + return rc; +} + +static int depmod_modules_read_mm(struct depmod *depmod) +{ + struct index_mm *deps, *symbols; + + deps = read_index_mm_bin("modules.dep", depmod); + if (deps == NULL) + WRN("failed to read modules.dep.bin\n"); + else { + index_mm_walk(deps, false, add_module_from_deps, depmod); + index_mm_walk(deps, false, add_module_deps_from_deps, depmod); + index_mm_close(deps); + } + + symbols = read_index_mm_bin("modules.symbols", depmod); + if (symbols == NULL) + WRN("failed to read modules.symbols.bin\n"); + else { + index_mm_walk(symbols, false, add_symbol_cb, depmod); + index_mm_close(symbols); + } + + read_aliases(depmod); + read_softdeps(depmod); + depmod_modules_build_array(depmod); + + return 0; +} + static void depmod_add_fake_syms(struct depmod *depmod) { /* __this_module is magically inserted by kernel loader. */ @@ -3085,7 +3465,19 @@ static int do_depmod(int argc, char *argv[]) cfg.print_unknown = 0; } - if (all) { + if (cfg.incremental) { + err = cfg_load(&cfg, config_paths); + if (err < 0) { + CRIT("could not load configuration files\n"); + goto cmdline_modules_failed; + } + err = depmod_modules_read_mm(&depmod); + if (err < 0) { + CRIT("could not read modules: %s\n", strerror(-err)); + goto cmdline_modules_failed; + } + goto done; + } else if (all) { err = cfg_load(&cfg, config_paths); if (err < 0) { CRIT("could not load configuration files\n"); From 14f445522b7d5a734b3cc6075b820ec69f593238 Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Sun, 19 Sep 2021 21:58:12 +0200 Subject: [PATCH 06/25] depmod: track reverse dependencies Add an additional field in "struct mod" to track the list of users of a module (other modules depending on this module). This allows quicker lookup later on. Signed-off-by: Martin Wilck --- tools/depmod.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tools/depmod.c b/tools/depmod.c index da7e32b7..8617a2e0 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -946,6 +946,7 @@ struct mod { struct array softdep_values; struct array weakdep_values; struct array deps; /* struct symbol */ + struct array user; /* modules depending on this one */ size_t baselen; /* points to start of basename/filename */ size_t modnamesz; int sort_idx; /* sort index using modules.order */ @@ -979,6 +980,7 @@ static void mod_free(struct mod *mod) array_free_array(&mod->weakdep_values); array_free_array(&mod->softdep_values); array_free_array(&mod->alias_values); + array_free_array(&mod->user); kmod_module_unref(mod->kmod); kmod_module_info_free_list(mod->info_list); kmod_module_dependency_symbols_free_list(mod->dep_sym_list); @@ -1007,6 +1009,11 @@ static int mod_add_dependency(struct mod *mod, struct symbol *sym) } sym->owner->users++; + err = array_append_unique(&sym->owner->user, mod); + if (err < 0) + ERR("%s: failed to add %s as user of %s: %s\n", __func__, mod->modname, + sym->owner->modname, strerror(-err)); + SHOW("%s needs \"%s\": %s\n", mod->path, sym->name, sym->owner->path); return 0; } @@ -1099,6 +1106,7 @@ static int depmod_module_add(struct depmod *depmod, struct kmod_module *kmod) array_init(&mod->weakdep_values, 4); // fits 100% array_init(&mod->deps, 4); + array_init(&mod->user, 4); mod->path = strdup(kmod_module_get_path(kmod)); if (mod->path == NULL) { @@ -2779,6 +2787,10 @@ static void add_module_deps_from_deps(const char *name, const char *deps, continue; } dmod->users++; + err = array_append_unique(&dmod->user, mod); + if (err < 0) + ERR("%s: failed to add %s as user of %s: %s\n", __func__, + mod->modname, dmod->modname, strerror(-err)); DBG("%s: %s depends on \"%s\"\n", __func__, mod->modname, tok); } free(tmp); From 9e11a746919d0966390c6c7d377351ac402d7b83 Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Mon, 20 Sep 2021 15:00:08 +0200 Subject: [PATCH 07/25] depmod_modules_search_file(): factor out depmod_must_replace() The functionality to determine whether a module replaces another one is neede by the incremental code, too. Signed-off-by: Martin Wilck --- tools/depmod.c | 50 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/tools/depmod.c b/tools/depmod.c index 8617a2e0..4f664c70 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -1268,20 +1268,23 @@ static int depmod_module_is_higher_priority(const struct depmod *depmod, return newprio <= oldprio; } -static int depmod_modules_search_file(struct depmod *depmod, size_t baselen, - size_t namelen, const char *path) +enum { + DEPMOD_MUST_ADD, + DEPMOD_MUST_REPLACE, + DEPMOD_MUST_NOTHING, +}; + +static int depmod_must_replace(struct depmod *depmod, size_t baselen, size_t namelen, + const char *path, char *modname, size_t *modnamelen, + struct mod **oldmod) { - struct kmod_module *kmod; - struct mod *mod; const char *relpath; - char modname[PATH_MAX]; - size_t modnamelen; - int err; + struct mod *mod; if (!path_ends_with_kmod_ext(path + baselen, namelen)) - return 0; + return DEPMOD_MUST_NOTHING; - if (path_to_modname(path, modname, &modnamelen) == NULL) { + if (path_to_modname(path, modname, modnamelen) == NULL) { ERR("could not get modname from path %s\n", path); return -EINVAL; } @@ -1291,15 +1294,38 @@ static int depmod_modules_search_file(struct depmod *depmod, size_t baselen, mod = hash_find(depmod->modules_by_name, modname); if (mod == NULL) - goto add; + return DEPMOD_MUST_ADD; - if (depmod_module_is_higher_priority(depmod, mod, baselen, namelen, modnamelen, + if (depmod_module_is_higher_priority(depmod, mod, baselen, namelen, *modnamelen, path)) { DBG("Ignored lower priority: %s, higher: %s\n", path, mod->path); - return 0; + return DEPMOD_MUST_NOTHING; } DBG("Replace lower priority %s with new module %s\n", mod->relpath, relpath); + *oldmod = mod; + return DEPMOD_MUST_REPLACE; +} + +static int depmod_modules_search_file(struct depmod *depmod, size_t baselen, + size_t namelen, const char *path) +{ + struct kmod_module *kmod; + struct mod *mod; + char modname[PATH_MAX]; + size_t modnamelen; + int err; + + err = depmod_must_replace(depmod, baselen, namelen, path, modname, &modnamelen, + &mod); + + if (err == DEPMOD_MUST_NOTHING) + return 0; + if (err < 0) + return err; + if (err == DEPMOD_MUST_ADD) + goto add; + err = depmod_module_del(depmod, mod); if (err < 0) { ERR("could not del module %s: %s\n", mod->path, strerror(-err)); From 224919be0e41d88bcafde3542391e1ea04f14c5e Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Mon, 20 Sep 2021 15:12:21 +0200 Subject: [PATCH 08/25] depmod_load_modules(): factor out depmod_load_module() The functionality to load a single module is needed by the incremental code. Signed-off-by: Martin Wilck --- tools/depmod.c | 102 ++++++++++++++++++++++++++----------------------- 1 file changed, 55 insertions(+), 47 deletions(-) diff --git a/tools/depmod.c b/tools/depmod.c index 4f664c70..4a88d97b 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -1620,64 +1620,72 @@ static struct symbol *depmod_symbol_find(const struct depmod *depmod, const char return hash_find(depmod->symbols, name); } -static int depmod_load_modules(struct depmod *depmod) +static int depmod_load_module(struct depmod *depmod, struct mod *mod) { - struct mod **itr, **itr_end; + struct kmod_list *l, *list = NULL; + int err = kmod_module_get_symbols(mod->kmod, &list); - DBG("load symbols (%zu modules)\n", depmod->modules.count); + if (err < 0) { + if (err == -ENODATA) + DBG("ignoring %s: no symbols\n", mod->path); + else + ERR("failed to load symbols from %s: %s\n", mod->path, + strerror(-err)); + goto load_info; + } - itr = (struct mod **)depmod->modules.array; - itr_end = itr + depmod->modules.count; - for (; itr < itr_end; itr++) { - struct mod *mod = *itr; - struct kmod_list *l, *list = NULL; - int err = kmod_module_get_symbols(mod->kmod, &list); - if (err < 0) { - if (err == -ENODATA) - DBG("ignoring %s: no symbols\n", mod->path); - else - ERR("failed to load symbols from %s: %s\n", mod->path, - strerror(-err)); - goto load_info; - } - kmod_list_foreach(l, list) { - const char *name = kmod_module_symbol_get_symbol(l); - uint64_t crc = kmod_module_symbol_get_crc(l); - depmod_symbol_add(depmod, name, false, crc, mod); - } - kmod_module_symbols_free_list(list); + kmod_list_foreach(l, list) { + const char *name = kmod_module_symbol_get_symbol(l); + uint64_t crc = kmod_module_symbol_get_crc(l); + + depmod_symbol_add(depmod, name, false, crc, mod); + } + kmod_module_symbols_free_list(list); load_info: - kmod_module_get_info(mod->kmod, &mod->info_list); - kmod_list_foreach(l, mod->info_list) { - const char *key = kmod_module_info_get_key(l); + kmod_module_get_info(mod->kmod, &mod->info_list); + kmod_list_foreach(l, mod->info_list) { + const char *key = kmod_module_info_get_key(l); - if (streq(key, "alias")) { - const char *value = kmod_module_info_get_value(l); + if (streq(key, "alias")) { + const char *value = kmod_module_info_get_value(l); - if (array_append(&mod->alias_values, value) < 0) - return 0; - continue; - } - if (streq(key, "softdep")) { - const char *value = kmod_module_info_get_value(l); + if (array_append(&mod->alias_values, value) < 0) + return 0; + continue; + } + if (streq(key, "softdep")) { + const char *value = kmod_module_info_get_value(l); - if (array_append(&mod->softdep_values, value) < 0) - return 0; - continue; - } - if (streq(key, "weakdep")) { - const char *value = kmod_module_info_get_value(l); + if (array_append(&mod->softdep_values, value) < 0) + return 0; + continue; + } + if (streq(key, "weakdep")) { + const char *value = kmod_module_info_get_value(l); - if (array_append(&mod->weakdep_values, value) < 0) - return 0; - continue; - } + if (array_append(&mod->weakdep_values, value) < 0) + return 0; + continue; } - kmod_module_get_dependency_symbols(mod->kmod, &mod->dep_sym_list); - kmod_module_unref(mod->kmod); - mod->kmod = NULL; } + kmod_module_get_dependency_symbols(mod->kmod, &mod->dep_sym_list); + kmod_module_unref(mod->kmod); + mod->kmod = NULL; + + return 0; +} + +static int depmod_load_modules(struct depmod *depmod) +{ + struct mod **itr, **itr_end; + + DBG("load symbols (%zu modules)\n", depmod->modules.count); + + itr = (struct mod **)depmod->modules.array; + itr_end = itr + depmod->modules.count; + for (; itr < itr_end; itr++) + depmod_load_module(depmod, *itr); DBG("loaded symbols (%zu modules, %u symbols)\n", depmod->modules.count, hash_get_count(depmod->symbols)); From 260f99ebe9c8c98972ef470fb9dd016ef7ee4a9a Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Sat, 20 Nov 2021 21:21:47 +0100 Subject: [PATCH 09/25] depmod_module_is_higher_priority: check for identical paths If the same module (same path) occurs twice in the list of modules, depmod_module_is_higher_priority() must return 1 (it returns 1 for same prio). This can't happen during regular runs, but it is possible in incremental mode (a previously added module can be listed on the command line again). Signed-off-by: Martin Wilck --- tools/depmod.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tools/depmod.c b/tools/depmod.c index 4a88d97b..f21ee554 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -1199,7 +1199,7 @@ static bool depmod_is_path_starts_with(const char *path, size_t pathlen, static int depmod_module_is_higher_priority(const struct depmod *depmod, const struct mod *mod, size_t baselen, size_t namelen, size_t modnamelen, - const char *newpath) + const char *newpath, bool replace_same_path) { const struct cfg *cfg = depmod->cfg; const struct cfg_override *ov; @@ -1220,6 +1220,9 @@ static int depmod_module_is_higher_priority(const struct depmod *depmod, DBG("comparing priorities of %s and %s\n", oldpath, newpath); + if (streq(oldpath, newpath)) + return replace_same_path ? 0 : 1; + if (strncmp(newpath, cfg->dirname, cfg->dirnamelen) == 0) { relnewpath = newpath + cfg->dirnamelen + 1; relnewlen = newlen - (cfg->dirnamelen + 1); @@ -1276,7 +1279,7 @@ enum { static int depmod_must_replace(struct depmod *depmod, size_t baselen, size_t namelen, const char *path, char *modname, size_t *modnamelen, - struct mod **oldmod) + struct mod **oldmod, bool replace_same_path) { const char *relpath; struct mod *mod; @@ -1297,7 +1300,7 @@ static int depmod_must_replace(struct depmod *depmod, size_t baselen, size_t nam return DEPMOD_MUST_ADD; if (depmod_module_is_higher_priority(depmod, mod, baselen, namelen, *modnamelen, - path)) { + path, replace_same_path)) { DBG("Ignored lower priority: %s, higher: %s\n", path, mod->path); return DEPMOD_MUST_NOTHING; } @@ -1317,7 +1320,7 @@ static int depmod_modules_search_file(struct depmod *depmod, size_t baselen, int err; err = depmod_must_replace(depmod, baselen, namelen, path, modname, &modnamelen, - &mod); + &mod, false); if (err == DEPMOD_MUST_NOTHING) return 0; From 331391877933141f4751ebe6cf1a416300a326c3 Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Mon, 20 Sep 2021 15:16:03 +0200 Subject: [PATCH 10/25] depmod: remove symbols and dependencies in depmod_module_del() depmod_module_del() should also remove any references to the module being deleted in other data structures. Signed-off-by: Martin Wilck --- tools/depmod.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/tools/depmod.c b/tools/depmod.c index f21ee554..77cc55dc 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -1155,16 +1155,85 @@ static int depmod_module_add(struct depmod *depmod, struct kmod_module *kmod) return err; } +static void depmod_del_deps_of_module(struct mod *mod) +{ + size_t i, j; + + for (i = 0; i < mod->deps.count; i++) { + struct mod *dep = mod->deps.array[i]; + + for (j = 0; j < dep->user.count; j++) + if (dep->user.array[j] == mod) + break; + if (j < dep->user.count) { + INF("%s: removing %s as user from %s\n", __func__, mod->modname, + dep->modname); + array_remove_at(&dep->user, j); + dep->users--; + } + } + + for (i = 0; i < mod->user.count; i++) { + struct mod *user = mod->user.array[i]; + + for (j = 0; j < user->deps.count; j++) + if (user->deps.array[j] == mod) + break; + if (j < user->deps.count) { + INF("%s: removing %s as dep from %s\n", __func__, mod->modname, + user->modname); + array_remove_at(&user->deps, j); + } + } +} + +static void depmod_del_symbols_of_module(struct depmod *depmod, const struct mod *mod) +{ + struct array to_delete; + struct hash_iter iter; + const char *key; + const struct symbol *sym; + int err = 0; + size_t i; + + array_init(&to_delete, 8); + + hash_iter_init(depmod->symbols, &iter); + while (hash_iter_next(&iter, &key, (const void **)&sym)) { + int rc; + + if (mod != sym->owner) + continue; + rc = array_append(&to_delete, sym); + if (err == 0 && rc < 0) + err = rc; + } + if (err < 0) + ERR("%s: failed to mark some symbols for deletion\n", __func__); + + for (i = 0; i < to_delete.count; i++) { + sym = to_delete.array[i]; + DBG("%s: deleting symbol %s\n", __func__, sym->name); + if (hash_del(depmod->symbols, sym->name) < 0) + ERR("%s: failed to delete symbol %s\n", __func__, sym->name); + } + + array_free_array(&to_delete); +} + static int depmod_module_del(struct depmod *depmod, struct mod *mod) { DBG("del %p kmod=%p, path=%s\n", mod, mod->kmod, mod->path); + depmod_del_deps_of_module(mod); + depmod_del_symbols_of_module(depmod, mod); + if (mod->uncrelpath != NULL) hash_del(depmod->modules_by_uncrelpath, mod->uncrelpath); hash_del(depmod->modules_by_name, mod->modname); - mod_free(mod); + return 0; } From 4b4782cf1943765b0f80b76a22cc029b56d7a00b Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Fri, 17 Sep 2021 14:57:38 +0200 Subject: [PATCH 11/25] depmod: implement incremental module addition This patch implements the incremental addition of modules from the command line, using the previously added functionality. Signed-off-by: Martin Wilck --- tools/depmod.c | 209 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 203 insertions(+), 6 deletions(-) diff --git a/tools/depmod.c b/tools/depmod.c index 77cc55dc..113745b5 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -3158,11 +3158,208 @@ static int depmod_modules_read_mm(struct depmod *depmod) read_aliases(depmod); read_softdeps(depmod); - depmod_modules_build_array(depmod); return 0; } +/* + * Check if a module to be added replaces an existing one. + * If yes, add the dependent modules to the must_check list. + */ +static int depmod_check_incremental(struct depmod *depmod, const char *path, + struct hash *must_check) +{ + int rc, err; + char *abspath, *p; + size_t baselen, namelen, modnamelen, i; + char modname[PATH_MAX]; + struct mod *oldmod; + + abspath = module_abspath(path, strlen(path), depmod); + + /* strrchr can't return 0 here */ + p = strrchr(abspath, '/') + 1; + baselen = p - abspath; + namelen = strlen(p); + + rc = depmod_must_replace(depmod, baselen, namelen, abspath, modname, &modnamelen, + &oldmod, true); + free(abspath); + + if (rc < 0) { + ERR("%s: error in depmod_must_replace: %s", __func__, strerror(-rc)); + return rc; + } else if (rc != DEPMOD_MUST_REPLACE) + return rc; + + assert(oldmod != NULL); + INF("%s: %s will be replaced\n", __func__, modname); + for (i = 0; i < oldmod->user.count; i++) { + struct mod *user = oldmod->user.array[i]; + + err = hash_add(must_check, user->modname, user); + if (err < 0) + ERR("%s: error adding %s to must_check list\n", __func__, + user->modname); + else + INF("%s: added %s to check list\n", __func__, user->modname); + } + /* + * A previous dep check may have added oldmod to the must_check + * list. Remove it there, too. If any module is replaced later + * on on which oldmod would depend, this dependency won't be + * found any more because we purge it here. + */ + hash_del(must_check, oldmod->modname); + err = depmod_module_del(depmod, oldmod); + + return rc; +} + +static int depmod_incremental_add_user(struct depmod *depmod, struct mod *mod) +{ + int err; + struct kmod_module *kmod; + + err = kmod_module_new_from_path(depmod->ctx, mod->path, &kmod); + if (err < 0) { + ERR("%s: failed to create kmod_module for %s\n", __func__, mod->modname); + return err; + } + + err = kmod_module_get_dependency_symbols(kmod, &mod->dep_sym_list); + if (err < 0) + ERR("%s: failed to get dependency symbols\n", __func__); + + kmod_module_unref(kmod); + + err = depmod_load_module_dependencies(depmod, mod); + if (err < 0) + ERR("%s: failed to check dependencies for %s\n", __func__, mod->modname); + + return err; +} + +static int depmod_incremental_add_arg(struct depmod *depmod, const char *path, + struct hash *new_mods) +{ + char *abspath; + int err; + struct kmod_module *kmod; + struct mod *mod; + + abspath = module_abspath(path, strlen(path), depmod); + err = kmod_module_new_from_path(depmod->ctx, abspath, &kmod); + free(abspath); + if (err < 0) { + ERR("%s: failed to create kmod_module for %s\n", __func__, path); + return err; + } + + err = depmod_module_add(depmod, kmod); + if (err < 0) { + ERR("%s: failed to add %s: %s\n", __func__, path, strerror(-err)); + kmod_module_unref(kmod); + return err; + } + + mod = hash_find(depmod->modules_by_name, kmod_module_get_name(kmod)); + assert(mod != NULL && mod->kmod == kmod); + + err = depmod_load_module(depmod, mod); + if (err < 0) + ERR("%s: failed to load %s\n", __func__, path); + else { + INF("%s: loaded %s\n", __func__, path); + hash_add(new_mods, mod->modname, mod); + } + + return err; +} + +static int depmod_incremental(struct depmod *depmod, int argc, char *const argv[]) +{ + struct hash *must_check, *new_mods; + int err; + struct hash_iter iter; + struct mod *mod; + int i; + + /* + * Read current modules.dep.bin and modules.symbols.bin to + * build current dependency tree. This replaces the depmod_load() + * call which is used in the non-incremental code path. + */ + err = depmod_modules_read_mm(depmod); + if (err < 0) { + CRIT("could not read modules: %s\n", strerror(-err)); + return err; + } + + must_check = hash_new(32, NULL); + new_mods = hash_new(32, NULL); + if (must_check == NULL || new_mods == NULL) { + err = -ENOMEM; + goto out; + } + + /* + * Scan modules given on the command line. These may be outside the + * search directory, thus we need to do this even if -A was passed. + */ + for (i = 0; i < argc; i++) { + /* + * Figure out what to do. If a module by the same name already exists, + * we must either do nothing or replace the existing module and re-check + * other modules that depend on it. Otherwise, the module must be added. + */ + err = depmod_check_incremental(depmod, argv[i], must_check); + if (err < 0) { + CRIT("could not add module %s: %s\n", argv[i], strerror(-err)); + goto out; + } + if (err != DEPMOD_MUST_NOTHING) + err = depmod_incremental_add_arg(depmod, argv[i], new_mods); + } + + /* Double-check modules that depend on modules to be replaced */ + hash_iter_init(must_check, &iter); + while (hash_iter_next(&iter, NULL, (const void **)&mod)) { + err = depmod_incremental_add_user(depmod, mod); + if (err < 0) + goto out; + } + + /* Scan added modules for dependencies */ + hash_iter_init(new_mods, &iter); + while (hash_iter_next(&iter, NULL, (const void **)&mod)) { + err = depmod_load_module_dependencies(depmod, mod); + if (err < 0) + ERR("%s: failed to check dependencies for %s\n", __func__, + mod->modname); + } + + /* + * We have gathered information from the index and have taken care + * of added, deleted, and replaced modules and their dependencies. + * The remaining steps are similar to the non-incremental case. + */ + err = depmod_modules_build_array(depmod); + if (err < 0) { + CRIT("could not build module array: %s\n", strerror(-err)); + goto out; + } + depmod_modules_sort(depmod); + if (depmod_calculate_dependencies(depmod) < 0) + ERR("%s: error in depmod_calculate_dependencies()\n", __func__); +out: + if (must_check != NULL) + hash_free(must_check); + if (new_mods != NULL) + hash_free(new_mods); + return err; +} + static void depmod_add_fake_syms(struct depmod *depmod) { /* __this_module is magically inserted by kernel loader. */ @@ -3589,12 +3786,11 @@ static int do_depmod(int argc, char *argv[]) CRIT("could not load configuration files\n"); goto cmdline_modules_failed; } - err = depmod_modules_read_mm(&depmod); - if (err < 0) { - CRIT("could not read modules: %s\n", strerror(-err)); + err = depmod_incremental(&depmod, argc - optind, &argv[optind]); + if (err) goto cmdline_modules_failed; - } - goto done; + else + goto output; } else if (all) { err = cfg_load(&cfg, config_paths); if (err < 0) { @@ -3646,6 +3842,7 @@ static int do_depmod(int argc, char *argv[]) if (err < 0) goto cmdline_modules_failed; +output: err = depmod_output(&depmod, out); done: From d399eed2641e3eb73c0990a2f40d1f73aecf7a07 Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Sat, 20 Nov 2021 22:47:53 +0100 Subject: [PATCH 12/25] depmod: implement "--incremental --all" Add a new mode in which depmod searches the directory tree for modules that are not in the current dependency data base, and adds them with their dependencies, without re-calculating the dependencies of modules that had been in the data base previously. The existing -a/--all flag is abused for selecting this mode with "depmod -I -a". Signed-off-by: Martin Wilck --- tools/depmod.c | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/tools/depmod.c b/tools/depmod.c index 113745b5..bfc061c5 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -3277,7 +3277,8 @@ static int depmod_incremental_add_arg(struct depmod *depmod, const char *path, return err; } -static int depmod_incremental(struct depmod *depmod, int argc, char *const argv[]) +static int depmod_incremental(struct depmod *depmod, bool all, int argc, + char *const argv[]) { struct hash *must_check, *new_mods; int err; @@ -3303,6 +3304,39 @@ static int depmod_incremental(struct depmod *depmod, int argc, char *const argv[ goto out; } + if (all) { + /* + * Mark all modules as "visited" that we've seen so far, + * search the file system for new modules, and scan all modules + * that don't have the "visited" flag set. + */ + hash_iter_init(depmod->modules_by_name, &iter); + while (hash_iter_next(&iter, NULL, (const void **)&mod)) + mod->visited = true; + + err = depmod_modules_search(depmod); + if (err) { + CRIT("failed to search modules: %s\n", strerror(-err)); + goto out; + } + + hash_iter_init(depmod->modules_by_name, &iter); + while (hash_iter_next(&iter, NULL, (const void **)&mod)) { + if (!mod->visited) { + INF("load symbols for %s\n", mod->modname); + err = depmod_load_module(depmod, mod); + if (err < 0) + ERR("%s: failed to load %s\n", __func__, + mod->modname); + else { + INF("%s: loaded %s\n", __func__, mod->modname); + hash_add(new_mods, mod->modname, mod); + } + } else + mod->visited = false; + } + } + /* * Scan modules given on the command line. These may be outside the * search directory, thus we need to do this even if -A was passed. @@ -3786,7 +3820,7 @@ static int do_depmod(int argc, char *argv[]) CRIT("could not load configuration files\n"); goto cmdline_modules_failed; } - err = depmod_incremental(&depmod, argc - optind, &argv[optind]); + err = depmod_incremental(&depmod, all, argc - optind, &argv[optind]); if (err) goto cmdline_modules_failed; else From d82bcc04dfa1d29d3b21795e0b8b702450765bca Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Sun, 21 Nov 2021 23:21:47 +0100 Subject: [PATCH 13/25] depmod -I: support module removal As "depmod -I -a" is now able to search the tree for added modules, it would be nice to be able to handle module deletion, too. It turns out that this is actually quite easy in the existing framework. Instead of failing when module can't be opened, try to handle the situation gracefully by re-checking the modules that depend on the removed ones. Errors are only raised if a remaining module depends on functionality that had been provided by a deleted one. While this is most useful for automatically searching the module tree for additions and removals with "depmod -I -a", it can also be used with "depmod -I" with modules listed on the command line. Signed-off-by: Martin Wilck --- tools/depmod.c | 63 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/tools/depmod.c b/tools/depmod.c index bfc061c5..fdf479da 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -971,6 +971,7 @@ struct depmod { struct hash *modules_by_uncrelpath; struct hash *modules_by_name; struct hash *symbols; + struct hash *broken; }; static void mod_free(struct mod *mod) @@ -1010,7 +1011,7 @@ static int mod_add_dependency(struct mod *mod, struct symbol *sym) sym->owner->users++; err = array_append_unique(&sym->owner->user, mod); - if (err < 0) + if (err < 0 && err != -EEXIST) ERR("%s: failed to add %s as user of %s: %s\n", __func__, mod->modname, sym->owner->modname, strerror(-err)); @@ -1054,8 +1055,16 @@ static int depmod_init(struct depmod *depmod, struct cfg *cfg, struct kmod_ctx * goto symbols_failed; } + depmod->broken = hash_new(256, NULL); + if (depmod->symbols == NULL) { + err = -errno; + goto broken_failed; + } + return 0; +broken_failed: + hash_free(depmod->symbols); symbols_failed: hash_free(depmod->modules_by_name); modules_by_name_failed: @@ -1068,6 +1077,8 @@ static void depmod_shutdown(struct depmod *depmod) { size_t i; + hash_free(depmod->broken); + hash_free(depmod->symbols); hash_free(depmod->modules_by_uncrelpath); @@ -2816,7 +2827,10 @@ static void add_module_from_deps(const char *name, const char *deps, unsigned in path = module_abspath(deps, colon - deps, depmod); rc = kmod_module_new_from_path(depmod->ctx, path, &kmod); - if (rc < 0) { + if (rc == -ENOENT) { + INF("%s: module %s (%s) was removed\n", __func__, name, path); + goto out_free_path; + } else if (rc < 0) { ERR("%s: failed to create module %s: %s\n", __func__, path, strerror(-rc)); goto out_free_path; } @@ -2849,7 +2863,7 @@ static void add_module_deps_from_deps(const char *name, const char *deps, mod = hash_find(depmod->modules_by_name, name); if (!mod) { - ERR("%s: failed to find %s\n", __func__, name); + INF("%s: failed to find %s\n", __func__, name); return; } @@ -2882,8 +2896,10 @@ static void add_module_deps_from_deps(const char *name, const char *deps, dmod = hash_find(depmod->modules_by_uncrelpath, tok); if (!dmod) { - ERR("%s: dep %s not found\n", __func__, tok); - continue; + WRN("%s: dependency %s not found for %s\n", __func__, tok, + mod->modname); + hash_add_unique(depmod->broken, mod->modname, mod); + goto out; } err = array_append_unique(&mod->deps, dmod); @@ -2899,6 +2915,7 @@ static void add_module_deps_from_deps(const char *name, const char *deps, mod->modname, dmod->modname, strerror(-err)); DBG("%s: %s depends on \"%s\"\n", __func__, mod->modname, tok); } +out: free(tmp); } @@ -2926,7 +2943,7 @@ static void add_symbol_cb(const char *key, const char *val, unsigned int len, old = hash_find(depmod->symbols, key); if (old == NULL) { - ERR("%s: symbol \"%s\" not found\n", __func__, key); + INF("%s: symbol \"%s\" not found\n", __func__, key); return; } crc = strtoull(val, &ep, 16); @@ -2943,15 +2960,20 @@ static void add_symbol_cb(const char *key, const char *val, unsigned int len, return; } - sym = calloc(1, sizeof(struct symbol) + namelen); - if (!sym) - return; - mod = hash_find(depmod->modules_by_name, val); if (!mod) { - ERR("%s: module %s not found\n", __func__, val); + INF("%s: module %s not found\n", __func__, val); + err = hash_del(depmod->symbols, key); + if (err < 0 && err != -ENOENT) + ERR("%s: failed to delete %s: %s\n", __func__, key, + strerror(-err)); return; } + + sym = calloc(1, sizeof(struct symbol) + namelen); + if (!sym) + return; + sym->owner = mod; memcpy(sym->name, key, namelen); @@ -3305,6 +3327,25 @@ static int depmod_incremental(struct depmod *depmod, bool all, int argc, } if (all) { + const char *name; + + /* + * Check modules that might be broken because their dependencies + * were deleted from the file system. They have been added to + * depmod->broken in the depmod_modules_read_mm() call above. + * They aren't necessarily actually broken, because they may have + * been replaced - reread them to check. + */ + hash_iter_init(depmod->broken, &iter); + while (hash_iter_next(&iter, &name, (const void **)&mod)) { + INF("%s: %s has broken dependencies, re-loading\n", __func__, + name); + err = depmod_incremental_add_user(depmod, mod); + if (err < 0) + ERR("%s: failed to add dependencies for %s\n", __func__, + mod->modname); + } + /* * Mark all modules as "visited" that we've seen so far, * search the file system for new modules, and scan all modules From 176adc7bd472363462dad3bf463b73aa19aa9949 Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Thu, 28 Jul 2022 23:47:11 +0200 Subject: [PATCH 14/25] depmod: add option -x/--errexit Add the option -x/--errexit. If this option is given, depmod will exit with error code 1 if either unresolved symbols or (if crc checking is also enabled) symbol CRC mismatch is detected. Signed-off-by: Martin Wilck --- man/depmod.8.scd | 10 ++++++++-- tools/depmod.c | 16 ++++++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/man/depmod.8.scd b/man/depmod.8.scd index aebd3260..b3c4728c 100644 --- a/man/depmod.8.scd +++ b/man/depmod.8.scd @@ -7,10 +7,10 @@ depmod - Generate modules.dep and map files. # SYNOPSIS *depmod* [*-b* _basedir_] [*-m* _moduledir_] [*-o* _outdir_] [*-e*] [*-E* _Module.symvers_] -\ \ \ \ \ \ \ \[*-F* _System.map_] [*-n*] [*-v*] [*-A*] [*-P* _prefix_] [*-w*] [*-I*] [_version_] +\ \ \ \ \ \ \ \[*-F* _System.map_] [*-n*] [*-v*] [*-A*] [*-P* _prefix_] [*-w*] [*-x*] [*-I*] [_version_] *depmod* [*-e*] [*-E* _Module.symvers_] [*-F* _System.map_] [*-n*] [*-v*] [*-P* _prefix_] -\ \ \ \ \ \ \ \[*-w*] [*-I*] [_version_] [_filename_...] +\ \ \ \ \ \ \ \[*-w*] [*-x*] [*-I*] [_version_] [_filename_...] # DESCRIPTION @@ -162,6 +162,12 @@ depmod -b /tmp/build -m kernel-modules *-w* Warn on duplicate dependencies, aliases, symbol versions, etc. +*-x*, *--errexit* + Exit with an error status if any condition occurs that would create + a warning with *-e*, i.e. if some module requires an unknown symbol, + or if a symbol with a symbol version that doesn't match the version + provided by the kernel or other modules. + # COPYRIGHT This manual page originally Copyright 2002, Rusty Russell, IBM Corporation. diff --git a/tools/depmod.c b/tools/depmod.c index fdf479da..895da27b 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -51,7 +51,7 @@ static const char *const default_cfg_paths[] = { // clang-format on }; -static const char cmdopts_s[] = "aAIb:m:o:C:E:F:evnP:wVh"; +static const char cmdopts_s[] = "aAIb:m:o:C:E:F:evnP:wxVh"; static const struct option cmdopts[] = { { "all", no_argument, 0, 'a' }, { "quick", no_argument, 0, 'A' }, @@ -68,6 +68,7 @@ static const struct option cmdopts[] = { { "dry-run", no_argument, 0, 'n' }, { "symbol-prefix", required_argument, 0, 'P' }, { "warn", no_argument, 0, 'w' }, + { "errexit", no_argument, 0, 'x' }, { "version", no_argument, 0, 'V' }, { "help", no_argument, 0, 'h' }, {}, @@ -92,6 +93,7 @@ static void help(void) "\t-C, --config PATH Read configuration from PATH\n" "\t-v, --verbose Enable verbose mode\n" "\t-w, --warn Warn on duplicates\n" + "\t-x, --errexit exit with error status if unresolved symbols are detected\n" "\t-V, --version show version\n" "\t-h, --help show this help\n" "\n" @@ -972,6 +974,8 @@ struct depmod { struct hash *modules_by_name; struct hash *symbols; struct hash *broken; + bool undefined_symbols; + bool bad_crc; }; static void mod_free(struct mod *mod) @@ -1794,6 +1798,7 @@ static int depmod_load_module_dependencies(struct depmod *depmod, struct mod *mo if (sym == NULL) { DBG("%s needs (%c) unknown symbol %s\n", mod->path, bindtype, name); + depmod->undefined_symbols = true; if (cfg->print_unknown && !is_weak) WRN("%s needs unknown symbol %s\n", mod->path, name); continue; @@ -1802,6 +1807,7 @@ static int depmod_load_module_dependencies(struct depmod *depmod, struct mod *mo if (cfg->check_symvers && sym->crc != crc && !is_weak) { DBG("symbol %s (%#" PRIx64 ") module %s (%#" PRIx64 ")\n", sym->name, sym->crc, mod->path, crc); + depmod->bad_crc = true; if (cfg->print_unknown) WRN("%s disagrees about version of symbol %s\n", mod->path, name); @@ -3683,6 +3689,8 @@ static int do_depmod(int argc, char *argv[]) struct kmod_ctx *ctx = NULL; struct cfg cfg; struct depmod depmod; + bool errexit = false; + bool success; memset(&cfg, 0, sizeof(cfg)); memset(&depmod, 0, sizeof(depmod)); @@ -3762,6 +3770,9 @@ static int do_depmod(int argc, char *argv[]) case 'w': cfg.warn_dups = 1; break; + case 'x': + errexit = true; + break; case 'h': help(); return EXIT_SUCCESS; @@ -3921,9 +3932,10 @@ static int do_depmod(int argc, char *argv[]) err = depmod_output(&depmod, out); done: + success = err >= 0 && !(errexit && (depmod.undefined_symbols || depmod.bad_crc)); depmod_shutdown(&depmod); cfg_free(&cfg); - return err >= 0 ? EXIT_SUCCESS : EXIT_FAILURE; + return success ? EXIT_SUCCESS : EXIT_FAILURE; cmdline_modules_failed: depmod_shutdown(&depmod); From 589acdea5d801e8a71c2a8ad086630d53e9562d1 Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Fri, 14 Jan 2022 14:30:32 +0100 Subject: [PATCH 15/25] testsuite: add a test for generating dependencies with depmod Add a test using the currently existing modules mod-foo and mod-foo-{a,b,c}. mod-foo contains on all 3 other modules. Signed-off-by: Martin Wilck --- scripts/setup-rootfs.sh | 15 ++++++++ testsuite/module-playground/Kbuild | 9 +++++ .../lib/modules/4.4.4/correct-modules.dep | 4 ++ .../lib/modules/4.4.4/correct-modules.dep.bin | Bin 0 -> 244 bytes .../lib/modules/4.4.4/correct-modules.symbols | 4 ++ .../modules/4.4.4/correct-modules.symbols.bin | Bin 0 -> 141 bytes .../4.4.4/novers-correct-modules.symbols.bin | Bin 0 -> 141 bytes testsuite/test-depmod.c | 35 ++++++++++++++++++ 8 files changed, 67 insertions(+) create mode 100644 testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.dep create mode 100644 testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.symbols create mode 100644 testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/novers-correct-modules.symbols.bin diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh index 524defa2..95681a31 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -72,6 +72,10 @@ map=( ["test-depmod/search-order-override$MODULE_DIRECTORY/4.4.4/override/"]="mod-simple.ko" ["test-depmod/check-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-weakdep.ko"]="mod-weakdep.ko" ["test-depmod/check-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-simple.ko"]="mod-simple.ko" + ["test-depmod/test-dependencies$MODULE_DIRECTORY/4.4.4/kernel/fs/foo/"]="mod-foo-a.ko" + ["test-depmod/test-dependencies$MODULE_DIRECTORY/4.4.4/kernel/"]="mod-foo-c.ko" + ["test-depmod/test-dependencies$MODULE_DIRECTORY/4.4.4/kernel/lib/"]="mod-foo-b.ko" + ["test-depmod/test-dependencies$MODULE_DIRECTORY/4.4.4/kernel/fs/"]="mod-foo.ko" ["test-dependencies$MODULE_DIRECTORY/4.0.20-kmod/kernel/fs/foo/"]="mod-foo-b.ko" ["test-dependencies$MODULE_DIRECTORY/4.0.20-kmod/kernel/"]="mod-foo-c.ko" ["test-dependencies$MODULE_DIRECTORY/4.0.20-kmod/kernel/lib/"]="mod-foo-a.ko" @@ -197,4 +201,15 @@ for m in "${attach_pkcs7_array[@]}"; do cat "${MODULE_PLAYGROUND}/dummy.pkcs7" >>"${ROOTFS}/$m" done +# if CONFIG_MODVERSIONS is off, modules-symbols.bin is different. +# both the input (if present) and the correct output must be replaced. +. "${MODULE_PLAYGROUND}/modversions" +if [ "${CONFIG_MODVERSIONS}" != y ]; then + find "$ROOTFS" -name 'novers-*modules.symbols.bin' | \ + while read f; do + rm -fv "${f/novers-/}" + ln -sv "${f##*/}" "${f/novers-/}" + done +fi + touch testsuite/stamp-rootfs diff --git a/testsuite/module-playground/Kbuild b/testsuite/module-playground/Kbuild index b4f0f11e..d3d5f7a8 100644 --- a/testsuite/module-playground/Kbuild +++ b/testsuite/module-playground/Kbuild @@ -38,6 +38,15 @@ obj-m += mod-weakdep.o obj-m += mod-softdep-a.o obj-m += mod-softdep-b.o +always-y += modversions +$(src)/modversions: +ifdef CONFIG_MODVERSIONS + echo "CONFIG_MODVERSIONS=y" >$@ +else + echo "CONFIG_MODVERSIONS=n" >$@ +endif + +clean-files := $(src)/modversions else # only build ARCH-specific module diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.dep new file mode 100644 index 00000000..0729d01b --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.dep @@ -0,0 +1,4 @@ +kernel/lib/mod-foo-b.ko: +kernel/mod-foo-c.ko: +kernel/fs/foo/mod-foo-a.ko: +kernel/fs/mod-foo.ko: kernel/lib/mod-foo-b.ko kernel/fs/foo/mod-foo-a.ko kernel/mod-foo-c.ko diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..f58b06d386143434fea58bfb36005acf9e0421ef GIT binary patch literal 244 zcmdnM{w17&iGfjpfq^GC_W=WgP<~2$T7Eu5d^}L7g@J*A5r~g!6 zbb<1E+4)uqP|=*sB$%*n5>Nsr4pa?P371Mll7gC|n+z0VNKAHMV3-8N+kp5w&^nNn bOb9E{4Y2}BgViwLZ~$BZBUAyhbyf@jy~9P$ literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.symbols b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.symbols new file mode 100644 index 00000000..ddb6ab6b --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.symbols @@ -0,0 +1,4 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:print_fooA mod_foo_a +alias symbol:print_fooC mod_foo_c +alias symbol:print_fooB mod_foo_b diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..5d929ee3125e5e63a9aaf5e7796586e5d728d803 GIT binary patch literal 141 zcmdnM{w17&iGfjpfq|#EcmV^0P-SjXevVZ^QD$CAd|G}!gQK$p1A_q&`vY+v0|QVs z5a;HnfMnwn8U6!-Nvg4tp-G}KPzEf`0FzDvOQ)Ep7?>L+8o{I)VbaN9X+ty9)Wj4s GBL)DblPO^U literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/novers-correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/novers-correct-modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..4d1be9efa283acaed8688721ef63854aedef75c0 GIT binary patch literal 141 zcmdnM{w17&iGfjpfq|#EcmV^0P-SjXevVZ^QD$CAd|G}!gQK$p1A_q&`vY+v0|QVs i5a;HnfMnwn8U6!-0Tcjbz|ssb=_IVuj4 Date: Fri, 14 Jan 2022 22:14:19 +0100 Subject: [PATCH 16/25] testsuite: add tests for demonstrating dependency order changes This patch adds two more tests. Both add one module to the previous mod-foo test. The added module depends on mod-foo-b. Only the name of the added module differs: it's mod-bar in case 1 and mod-bah in the second case. Because of internals of depmod's sorting algorithm, mod-bar gets sorted before mod-foo, but mod-bah behind it. While the ordering of lines in modules.dep this isn't a big issue, it's quite surprising that this also affects the order of dependecies printed for mod-foo (compare "correct-modules.dep" for the two cases). The dependency list isn't "wrong" in either case, as mod-foo-{a,b,c} don't depend on each other. But the example shows that the ordering of mutually independent modules in modules.dep is hard to predict, making it very difficult to implement automatic verification (using simple "diff") for depmod's incremental mode. Signed-off-by: Martin Wilck --- scripts/setup-rootfs.sh | 10 +++ testsuite/module-playground/Kbuild | 2 + testsuite/module-playground/mod-bar.c | 19 +++++ .../lib/modules/4.4.4/correct-modules.dep | 5 ++ .../lib/modules/4.4.4/correct-modules.dep.bin | Bin 0 -> 323 bytes .../lib/modules/4.4.4/correct-modules.symbols | 4 + .../modules/4.4.4/correct-modules.symbols.bin | Bin 0 -> 141 bytes .../4.4.4/novers-correct-modules.symbols.bin | Bin 0 -> 141 bytes .../lib/modules/4.4.4/correct-modules.dep | 5 ++ .../lib/modules/4.4.4/correct-modules.dep.bin | Bin 0 -> 323 bytes .../lib/modules/4.4.4/correct-modules.symbols | 4 + .../modules/4.4.4/correct-modules.symbols.bin | Bin 0 -> 141 bytes .../4.4.4/novers-correct-modules.symbols.bin | Bin 0 -> 141 bytes testsuite/test-depmod.c | 72 ++++++++++++++++++ 14 files changed, 121 insertions(+) create mode 100644 testsuite/module-playground/mod-bar.c create mode 100644 testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.dep create mode 100644 testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.symbols create mode 100644 testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/novers-correct-modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.dep create mode 100644 testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.symbols create mode 100644 testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/novers-correct-modules.symbols.bin diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh index 95681a31..898d6fce 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -76,6 +76,16 @@ map=( ["test-depmod/test-dependencies$MODULE_DIRECTORY/4.4.4/kernel/"]="mod-foo-c.ko" ["test-depmod/test-dependencies$MODULE_DIRECTORY/4.4.4/kernel/lib/"]="mod-foo-b.ko" ["test-depmod/test-dependencies$MODULE_DIRECTORY/4.4.4/kernel/fs/"]="mod-foo.ko" + ["test-depmod/test-dependencies-1$MODULE_DIRECTORY/4.4.4/kernel/fs/foo/"]="mod-foo-a.ko" + ["test-depmod/test-dependencies-1$MODULE_DIRECTORY/4.4.4/kernel/"]="mod-foo-c.ko" + ["test-depmod/test-dependencies-1$MODULE_DIRECTORY/4.4.4/kernel/lib/"]="mod-foo-b.ko" + ["test-depmod/test-dependencies-1$MODULE_DIRECTORY/4.4.4/kernel/fs/mod-foo.ko"]="mod-foo.ko" + ["test-depmod/test-dependencies-1$MODULE_DIRECTORY/4.4.4/kernel/fs/mod-bar.ko"]="mod-bar.ko" + ["test-depmod/test-dependencies-2$MODULE_DIRECTORY/4.4.4/kernel/fs/foo/"]="mod-foo-a.ko" + ["test-depmod/test-dependencies-2$MODULE_DIRECTORY/4.4.4/kernel/"]="mod-foo-c.ko" + ["test-depmod/test-dependencies-2$MODULE_DIRECTORY/4.4.4/kernel/lib/"]="mod-foo-b.ko" + ["test-depmod/test-dependencies-2$MODULE_DIRECTORY/4.4.4/kernel/fs/mod-foo.ko"]="mod-foo.ko" + ["test-depmod/test-dependencies-2$MODULE_DIRECTORY/4.4.4/kernel/fs/mod-bah.ko"]="mod-bar.ko" ["test-dependencies$MODULE_DIRECTORY/4.0.20-kmod/kernel/fs/foo/"]="mod-foo-b.ko" ["test-dependencies$MODULE_DIRECTORY/4.0.20-kmod/kernel/"]="mod-foo-c.ko" ["test-dependencies$MODULE_DIRECTORY/4.0.20-kmod/kernel/lib/"]="mod-foo-a.ko" diff --git a/testsuite/module-playground/Kbuild b/testsuite/module-playground/Kbuild index d3d5f7a8..9ffbef9e 100644 --- a/testsuite/module-playground/Kbuild +++ b/testsuite/module-playground/Kbuild @@ -7,6 +7,8 @@ obj-m += mod-foo-a.o obj-m += mod-foo-b.o obj-m += mod-foo-c.o obj-m += mod-foo.o +# mod-bar depends on foo-b +obj-m += mod-bar.o # mod-loop: create loops in dependencies: # 1) mod-loop-a -> mod-loop-b -> mod-loop-c -> mod-loop-a diff --git a/testsuite/module-playground/mod-bar.c b/testsuite/module-playground/mod-bar.c new file mode 100644 index 00000000..24035805 --- /dev/null +++ b/testsuite/module-playground/mod-bar.c @@ -0,0 +1,19 @@ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include + +void print_fooB(void); + +static int __init bar_init(void) +{ + print_fooB(); + + return 0; +} + +module_init(bar_init); + +MODULE_AUTHOR("Lucas De Marchi "); +MODULE_LICENSE("LGPL"); diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.dep new file mode 100644 index 00000000..09438616 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.dep @@ -0,0 +1,5 @@ +kernel/lib/mod-foo-b.ko: +kernel/mod-foo-c.ko: +kernel/fs/foo/mod-foo-a.ko: +kernel/fs/mod-bar.ko: kernel/lib/mod-foo-b.ko +kernel/fs/mod-foo.ko: kernel/fs/foo/mod-foo-a.ko kernel/mod-foo-c.ko kernel/lib/mod-foo-b.ko diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..275ba0899e97ec7d0c6ac97f14eab89ac29ffacd GIT binary patch literal 323 zcmdnM{w17&iGfjpfq^GCcL4)~P<~20LsHrS1_m7lB=CTNAvLiGB)|y7%-N|$d8s-2 zX~p`v`6;?diA8$Z`Bn;0(VWaAuy9&_zHSmwf+0VjAwFJ#f#EV#I}56IpgLsjKtq8d za1#=NaxjxYmVr!7MiRrYEiu`Ff#IP810yRCt3j<~LRg7zxD`+d*jEfV+z(g42vvaW H3@ZizSol~` literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.symbols b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.symbols new file mode 100644 index 00000000..ddb6ab6b --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.symbols @@ -0,0 +1,4 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:print_fooA mod_foo_a +alias symbol:print_fooC mod_foo_c +alias symbol:print_fooB mod_foo_b diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..5d929ee3125e5e63a9aaf5e7796586e5d728d803 GIT binary patch literal 141 zcmdnM{w17&iGfjpfq|#EcmV^0P-SjXevVZ^QD$CAd|G}!gQK$p1A_q&`vY+v0|QVs z5a;HnfMnwn8U6!-Nvg4tp-G}KPzEf`0FzDvOQ)Ep7?>L+8o{I)VbaN9X+ty9)Wj4s GBL)DblPO^U literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/novers-correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/novers-correct-modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..4d1be9efa283acaed8688721ef63854aedef75c0 GIT binary patch literal 141 zcmdnM{w17&iGfjpfq|#EcmV^0P-SjXevVZ^QD$CAd|G}!gQK$p1A_q&`vY+v0|QVs i5a;HnfMnwn8U6!-0Tcjbz|ssb=_IVuj4L+8o{I)VbaN9X+ty9)Wj4s GBL)DblPO^U literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/novers-correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/novers-correct-modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..4d1be9efa283acaed8688721ef63854aedef75c0 GIT binary patch literal 141 zcmdnM{w17&iGfjpfq|#EcmV^0P-SjXevVZ^QD$CAd|G}!gQK$p1A_q&`vY+v0|QVs i5a;HnfMnwn8U6!-0Tcjbz|ssb=_IVuj4 Date: Mon, 17 Jan 2022 15:24:39 +0100 Subject: [PATCH 17/25] testsuite/module-playground: add script for non-trivial depmod example Add a python script that creates a non-trivial dependency tree of modules. The script works by creating simple modules that can both export and call functions with either "void f(void)" or "void f(int)" prototypes. The kernel build will resolve these dependencies and a dependency tree will be generated. By default, the script generates a set of modules that is is inspired by a real world example from the block and SCSI layer of the Linux kernel. Signed-off-by: Martin Wilck --- .gitignore | 3 + testsuite/module-playground/Kbuild | 6 +- testsuite/module-playground/Makefile | 1 + testsuite/module-playground/gen_mod.py | 181 +++++++++++++++++++++++++ 4 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 testsuite/module-playground/gen_mod.py diff --git a/.gitignore b/.gitignore index 55915135..3368b2c8 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,6 @@ .*.swp cscope.out tags +__pycache__ +testsuite/module-playground/ex-*.c +testsuite/module-playground/gen_mod.mak diff --git a/testsuite/module-playground/Kbuild b/testsuite/module-playground/Kbuild index 9ffbef9e..89b757d4 100644 --- a/testsuite/module-playground/Kbuild +++ b/testsuite/module-playground/Kbuild @@ -48,7 +48,11 @@ else echo "CONFIG_MODVERSIONS=n" >$@ endif -clean-files := $(src)/modversions +include $(src)/gen_mod.mak +$(src)/gen_mod.mak: + cd $(src) && python3 ./gen_mod.py + +clean-files := $(src)/gen_mod.mak $(src)/modversions else # only build ARCH-specific module diff --git a/testsuite/module-playground/Makefile b/testsuite/module-playground/Makefile index 191f7458..e28142bb 100644 --- a/testsuite/module-playground/Makefile +++ b/testsuite/module-playground/Makefile @@ -26,3 +26,4 @@ arch-modules: $(ARCH_SPECIFIC_MODULES) clean: $(MAKE) -C $(KDIR) M=$$PWD clean + rm -f gen_mod.mak diff --git a/testsuite/module-playground/gen_mod.py b/testsuite/module-playground/gen_mod.py new file mode 100644 index 00000000..1e1e20ec --- /dev/null +++ b/testsuite/module-playground/gen_mod.py @@ -0,0 +1,181 @@ +#! /usr/bin/python3 +# This script generates source code for fake kernel modules, +# with dependencies defined by functions exported and called. + +class Module: + # expansions in f-strings can't contain backslashes + _nl = "\n" + _nlt = "\n\t" + + # module file name prefix + _prefix = "ex" + + # Constructor + # name: module name + # provides: list of exported "functions" + # calls: list of called "functions" + def __init__(self, name, provides=[], calls=[], int_provides=[], int_calls=[]): + self._name = name + self._symname = self._name.replace("-", "_") + self._provides = provides + self._calls = calls + self._int_provides = int_provides + self._int_calls = int_calls + + # symbol names must be mangled to avoid clashes with the kernel + def mangled(self, name): + return name + "_mangled" + + # void f(void): declaration, body, call + def void_decl(self, name): + return f"void {self.mangled(name)}(void);" + + def void_body(self, name): + return f"""\ +void {self.mangled(name)}(void) +{{ + pr_warn("%s\\n", __func__); +}} +EXPORT_SYMBOL({self.mangled(name)});""" + + def void_call(self, name): + return f"{self.mangled(name)}();" + + # void f(int): declaration, body, call + def int_decl(self, name): + return f"void {self.mangled(name)}(int);" + + def int_body(self, name): + return f"""\ +void {self.mangled(name)}(int x) +{{ + pr_warn("%s: %d\\n", __func__, x); +}} +EXPORT_SYMBOL({self.mangled(name)});""" + + def int_call(self, name): + return f"{self.mangled(name)}(0);" + + # str() creates the C source code. + def __str__(self): + return f"""\ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include + +{self._nl.join(self.void_decl(x) for x in self._calls + self._provides)} +{self._nl.join(self.int_decl(x) for x in self._int_calls + self._int_provides)} +{self._nl.join(self.void_body(x) for x in self._provides)} +{self._nl.join(self.int_body(x) for x in self._int_provides)} + +static int __init {self._symname}_init(void) +{{ + {self._nlt.join(self.void_call(x) for x in self._calls)} + {self._nlt.join(self.int_call(x) for x in self._int_calls)} + return 0; +}} +module_init({self._symname}_init); + +MODULE_AUTHOR("Martin Wilck "); +MODULE_LICENSE("GPL"); +""" + + # write() writes the C source code to a suitably named C file + def write(self): + with open(f"{self._prefix}-{self._name}.c", "w") as out: + out.write(str(self)) + + +# The following example creates a set of modules inspired by some real-world +# block and SCSI modules. +if __name__ == "__main__": + import sys + + if len(sys.argv) == 2 and sys.argv[1] == "other": + q_mods = [ + Module("qla2xxx", + int_provides = ["qlt_stop_phase2"], + calls = ["fc_attach_transport", "nvme_fc_set_remoteport_devloss", + "scsi_remove_host"]), + Module("tcm_qla2xxx", + int_calls = [ "qlt_stop_phase2" ], + calls=["target_execute_cmd", + "scsi_host_get", "fc_vport_create"]) + ] + else: + q_mods = [ + Module("qla2xxx", + provides = ["qlt_stop_phase2"], + calls = ["fc_attach_transport", "nvme_fc_set_remoteport_devloss", + "scsi_remove_host"]), + Module("tcm_qla2xxx", + calls=["target_execute_cmd", "qlt_stop_phase2", + "scsi_host_get", "fc_vport_create"]) + ] + + mods = [ + Module("scsi_transport_fc", + provides = ["fc_attach_transport", "fc_vport_create"], + calls = ["scsi_target_block"]), + Module("scsi_mod", + provides = ["scsi_target_block", "scsi_host_get", + "scsi_dma_map", "scsi_mode_sense", + "scsi_is_sdev_device", "scsi_print_sense_hdr", + "__scsi_iterate_devices", "scsi_dh_attach", + "scsi_remove_host"]), + Module("nvme-fc", + provides = ["nvme_fc_set_remoteport_devloss"], + calls=["nvme_uninit_ctrl", "nvmf_fail_nonready_command"]), + Module("nvme-fabrics", + provides = ["nvmf_fail_nonready_command"], + calls=["nvme_complete_rq"]), + Module("nvme-core", + provides = ["nvme_complete_rq", "nvme_uninit_ctrl"], + calls=["t10_pi_type1_crc"]), + Module("t10-pi", + provides = ["t10_pi_type1_crc"]), + Module("scsi_dh_alua", + calls=["scsi_print_sense_hdr"]), + Module("target_core_mod", + provides = ["target_execute_cmd", "target_backend_unregister"], + calls=["config_group_init"]), + Module("target_core_iblock", + calls=["target_backend_unregister"]), + Module("configfs", + provides = ["config_group_init"]), + Module("mpt3sas", + calls=["sas_enable_tlr", "scsi_dma_map", "raid_class_attach"]), + Module("scsi_transport_sas", + provides = ["sas_enable_tlr", "scsi_is_sas_rphy"], + calls=["scsi_mode_sense"]), + Module("raid_class", + provides = ["raid_class_attach"], + calls=["scsi_is_sdev_device"]), + Module("sd_mod", + calls=["scsi_print_sense_hdr", "t10_pi_type1_crc"]), + Module("sr_mod", + calls=["scsi_mode_sense", "register_cdrom"]), + Module("cdrom", + provides = ["register_cdrom"]), + Module("ses", + calls=["__scsi_iterate_devices", "scsi_is_sas_rphy", + "enclosure_remove_device"]), + Module("enclosure", + provides = ["enclosure_remove_device"]), + Module("dm-multipath", + provides = ["dm_unregister_path_selector"], + calls=["dm_table_run_md_queue_async", "scsi_dh_attach"]), + Module("dm-service-time", + calls=["dm_unregister_path_selector"]), + Module("dm-mod", + provides = ["dm_table_run_md_queue_async"]), + ] + + for x in mods + q_mods: + x.write() + + with open("gen_mod.mak", "w") as out: + out.write("".join(f"obj-m += {x._prefix}-{x._name}.o\n" + for x in mods + q_mods)) From c6f313386a9502a5886afa28dc87ee169d335ced Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Tue, 18 Jan 2022 21:44:35 +0100 Subject: [PATCH 18/25] testsuite: add "big" depmod test using the module generation script Add a test using the script from the previous patch, with expected results. The generated modules need some basic symbols from vmlinux. Create code to generate the symvers file. This makes it possible to check symbol versions in the test suite and fail if they don't match, using the "-x" option. Signed-off-by: Martin Wilck --- .gitignore | 2 + scripts/setup-modules.sh | 2 +- scripts/setup-rootfs.sh | 23 +++++++++++ testsuite/module-playground/Makefile | 6 ++- .../lib/modules/5.3.18/correct-modules.dep | 22 +++++++++++ .../modules/5.3.18/correct-modules.dep.bin | Bin 0 -> 3082 bytes .../modules/5.3.18/correct-modules.symbols | 28 +++++++++++++ .../5.3.18/correct-modules.symbols.bin | Bin 0 -> 2175 bytes .../5.3.18/novers-correct-modules.symbols.bin | Bin 0 -> 2175 bytes testsuite/test-depmod.c | 37 ++++++++++++++++++ 10 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.symbols create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/novers-correct-modules.symbols.bin diff --git a/.gitignore b/.gitignore index 3368b2c8..e64c0715 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,5 @@ tags __pycache__ testsuite/module-playground/ex-*.c testsuite/module-playground/gen_mod.mak +testsuite/module-playground/symvers + diff --git a/scripts/setup-modules.sh b/scripts/setup-modules.sh index 62eee6f3..edb69e91 100755 --- a/scripts/setup-modules.sh +++ b/scripts/setup-modules.sh @@ -13,4 +13,4 @@ if test "$SRCDIR" != "$BUILDDIR"; then fi export MAKEFLAGS=${MAKEFLAGS-"-j$(nproc)"} -"${MAKE-make}" -C "$PWD/$MODULE_PLAYGROUND" modules +"${MAKE-make}" -C "$PWD/$MODULE_PLAYGROUND" diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh index 898d6fce..200e3b96 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -138,6 +138,29 @@ map=( ["test-multi-softdep$MODULE_DIRECTORY/4.4.4/kernel/mod-foo-c.ko"]="mod-foo-c.ko" ["test-multi-softdep$MODULE_DIRECTORY/4.4.4/kernel/mod-softdep-a.ko"]="mod-softdep-a.ko" ["test-multi-softdep$MODULE_DIRECTORY/4.4.4/kernel/mod-softdep-b.ko"]="mod-softdep-b.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/block/t10-pi.ko"]="ex-t10-pi.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/cdrom/cdrom.ko"]="ex-cdrom.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_mod.ko"]="ex-scsi_mod.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_fc.ko"]="ex-scsi_transport_fc.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_sas.ko"]="ex-scsi_transport_sas.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sd_mod.ko"]="ex-sd_mod.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sr_mod.ko"]="ex-sr_mod.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/ses.ko"]="ex-ses.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/device_handler/scsi_dh_alua.ko"]="ex-scsi_dh_alua.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/raid_class.ko"]="ex-raid_class.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/mpt3sas.ko"]="ex-mpt3sas.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/qla2xxx.ko"]="ex-qla2xxx.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko"]="ex-tcm_qla2xxx.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fc.ko"]="ex-nvme-fc.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fabrics.ko"]="ex-nvme-fabrics.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-core.ko"]="ex-nvme-core.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/target/target_core_mod.ko"]="ex-target_core_mod.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/misc/enclosure.ko"]="ex-enclosure.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-multipath.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-service-time.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-mod.ko"]="ex-dm-mod.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/fs/configfs/configfs.ko"]="ex-configfs.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/symvers"]="symvers" ) gzip_array=( diff --git a/testsuite/module-playground/Makefile b/testsuite/module-playground/Makefile index e28142bb..ac6f66ff 100644 --- a/testsuite/module-playground/Makefile +++ b/testsuite/module-playground/Makefile @@ -13,7 +13,7 @@ endif ARCH_SPECIFIC_MODULES := mod-simple-x86_64.ko mod-simple-i386.ko mod-simple-sparc64.ko -default: modules +default: modules symvers mod-simple-%.ko: mod-simple-%.c Makefile.arch $(eval arch=$(patsubst mod-simple-%.ko,%,$@)) @@ -22,8 +22,12 @@ mod-simple-%.ko: mod-simple-%.c Makefile.arch modules: $(MAKE) -C $(KDIR) M=$$PWD modules +symvers: + cp $(KDIR)/Module.symvers $@ + arch-modules: $(ARCH_SPECIFIC_MODULES) clean: $(MAKE) -C $(KDIR) M=$$PWD clean rm -f gen_mod.mak + rm -f symvers diff --git a/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep new file mode 100644 index 00000000..246e149c --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep @@ -0,0 +1,22 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/scsi/scsi_mod.ko kernel/drivers/md/dm-mod.ko +kernel/drivers/scsi/qla2xxx/qla2xxx.ko: kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/scsi/ses.ko: kernel/drivers/misc/enclosure.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/scsi_transport_sas.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/mpt3sas.ko: kernel/drivers/scsi/raid_class.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko: kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/scsi/qla2xxx/qla2xxx.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/scsi/scsi_mod.ko kernel/drivers/md/dm-mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/block/t10-pi.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..c15c8c39cbf53bc352e84027a3fdd02171f05f46 GIT binary patch literal 3082 zcmdT`J&)5s5S=8KKPI=Xcm*HiG z91-%bvrbtU%eg30UNKV!lG&a{rMk@21L+oDkCV1*F9&5?aKMOTCCx1pYcmc^uixv6%$E$P@6nMzJN*`HAg z-TTYsl2jpP9fMiApRY5Fo%eO*>h|5IWwemn3R9@x5-cwOjWWd7kF`uC<-7oky4GSG z)QPcH{;jS7OsrsVl)&(70=thW@?{#%`HT((TqQ7g(KZt?NfQQH{1`iKIClv_TYa-` zb=*shZ0t^X=!wk#cs6hIw&xngg+K4qg(uB(KRt!QAi$R>&~X#>rsp{4Eu%qN&8^0C zr4gmY*1lz>KMuACnz>thR9dzsd!sfk*UIQhy=(y&cGjvk z($cGIzFx~om}}Nq*S|8FIpuYCg5JJAAbtPWhWzgmckJIEJF|f9sj!c7-Hc+u*XP_* z4q0ARxNWu6MJMhThl)7J696S<6`- VN42ojYs!+{>ZIA`#QI04(Qg!0fE)k- literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.symbols b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.symbols new file mode 100644 index 00000000..c2a9a3f6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.symbols @@ -0,0 +1,28 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:scsi_target_block_mangled scsi_mod +alias symbol:scsi_remove_host_mangled scsi_mod +alias symbol:t10_pi_type1_crc_mangled t10_pi +alias symbol:scsi_is_sas_rphy_mangled scsi_transport_sas +alias symbol:scsi_dh_attach_mangled scsi_mod +alias symbol:nvme_fc_set_remoteport_devloss_mangled nvme_fc +alias symbol:target_backend_unregister_mangled target_core_mod +alias symbol:scsi_host_get_mangled scsi_mod +alias symbol:__scsi_iterate_devices_mangled scsi_mod +alias symbol:target_execute_cmd_mangled target_core_mod +alias symbol:sas_enable_tlr_mangled scsi_transport_sas +alias symbol:fc_attach_transport_mangled scsi_transport_fc +alias symbol:register_cdrom_mangled cdrom +alias symbol:fc_vport_create_mangled scsi_transport_fc +alias symbol:scsi_print_sense_hdr_mangled scsi_mod +alias symbol:scsi_dma_map_mangled scsi_mod +alias symbol:scsi_is_sdev_device_mangled scsi_mod +alias symbol:nvme_complete_rq_mangled nvme_core +alias symbol:dm_unregister_path_selector_mangled dm_service_time +alias symbol:raid_class_attach_mangled raid_class +alias symbol:enclosure_remove_device_mangled enclosure +alias symbol:scsi_mode_sense_mangled scsi_mod +alias symbol:qlt_stop_phase2_mangled qla2xxx +alias symbol:dm_table_run_md_queue_async_mangled dm_mod +alias symbol:nvmf_fail_nonready_command_mangled nvme_fabrics +alias symbol:nvme_uninit_ctrl_mangled nvme_core +alias symbol:config_group_init_mangled configfs diff --git a/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..f07cb998989543feac4d96725d6d2465ef3055da GIT binary patch literal 2175 zcmdT_%dQ+X5Uo4+i3krRAhDb^o4DWI`~ZtcEP+b@^ymhV*w9kTZg(BK>YS?b50}4v1v5CA1KhKA3vho^u9=#*>~e&2d6*J;q;F=oIRPt#qZooTkyi65e~V+ zbs^F6O4N%I)ebbH_pCRn8U?TENj=YxVwONt>tewdrdhSTs0%lReJpzmZF`u?MWU6A zpyJ?G9l)>T`$LhJ$jz$emEzYcTp<^BQ_JaASE}OU`H7!-Ius$)1{Z}T*Lf@4l3OfM zy2ebg?-ACb*+s@(QDN_muk%pGN) zgB?}>)QP%cg2eB%jRn)U9{wb%k6uX3&VmDM>_$CP_cn z3*@kmit?0HJId2pkKgkUBr0V}A=G_tN@vQyIZq3gVd(q7wJ1tnH2R9JO(BOAXSohU8YECUZe7#zb}20SQ{c&UDg2w8n_jLk&a))N1O#?)_TV<5^!=z% zT$X}D6+<>mguG|OXt5VR&LZYX*cXOWrlHC?Ea&_EYHzPYPe(puAS9jEcZn^Wy|f(b zzA{~TR8AL@w6kIeUh347GD(2?2`D#*^A8V$Isax0=Le0dgNuiw4bAy(PUF-4_+nXg zaQ^9NF^;tM^&NB^HmW3Nim@OCK@7B077lGG&qC^J3>xeBg0gMG*`amhW8kGyg5?&3 zB9DH$<=tz`O}pGox44VAglRfGL%{XE0Z);KhiAD`f$#!o6jEW-_NcrM?OB$1m>~mG z)RdP!V5yFDJp^GWL!YHS3|(=#qvfrXq@;hG#W4u8qc1NT`S|UKjG<0hq`(s$T>dx` z_t|omP~s9 literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/novers-correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/novers-correct-modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..5b5c759ee2a9146e8f926ea969431e562232cd08 GIT binary patch literal 2175 zcmdT_J&)5s5S`?b%OQ>r-GM}zn&v)A{s09MCD4sF>q%^#z3bauM~P@Dphs8xAAsnQ z+<@SZT#W=06*|UFtc%yO?oOg%rD)fidAl?3&CGrr{dx&~=#2q(t<3@UmdQlNPXJv3 zU}0nM_lF$dynvp|q4#Oyuhue${=0g!fUWOi*!nYu!Rs+>|3)iqgpng79AQB7NRq`w zs98)w3F`B2P#GmUfD0an>j7F#qZ!VO&Qgq2{Rdxx=>Oc@!vD50h|O2*n|hMk~9 z&ua?&Gj3CD*F;MMF)yHhucYc<4nFg_b3%sbj8Hb!rbX|AN|npMr?Tl=g^`9zVLd^w zg3c45DW}aDr^{Oe$#V72>+pE*QN6zD%-9z?Nn>K4%&G6zEj3RFr8b^MlJ#?yK#r=Y zI8Rx%R-X1Nyw8KGa#K1JU-v$oiYP{OXE4<*jpFrToFudOkX80zDVWUwMuzgV5@EXfC&+pgs zmoO<{__(&HXWo0&K}ScU63jsAv(RCyt-~2-o5xv)wM7deV2{3Scz0pZq~X#(;!5IZ zzHY!ivg2|c5Eq8Bt@7@$H<9AJtN>xq(zOG$>WX1W%k?M`rlfBYYk6`_#E~dq^tmSR zf1Gm|{W!!lLbpum2&HK~VEgW Date: Fri, 17 Sep 2021 09:05:42 +0200 Subject: [PATCH 19/25] depmod: deterministic module sort order in depmod_calculate_dependencies() TL;DR: This patch modifies the dependency sort algorithm such that the list of dependencies of any module is deterministically ordered, independent of the order in which modules were detected. This is important for verifying that incremental depmod and "ordinary" depmod lead to the same results. With the changes for dependency ordering, the expected test results change. Note that (as intended) the results for test-dependencies{,-1,-2} are now identical. Details: The main constraint enforced by the module sorting algorithm is that every module is sorted before all modules it depends upon. The list of dependencies for modules.dep is sorted using this ordering. This way, modprobe can simply walk the list of dependencies backward without encounterung undefined symbols. However, this is the only constraint the sorting algorithm enforces. In particular, no ordering is implied between mutually independent modules. Thus if module A depends on B and C, but B and C are independent, both A, B, C and A, C, B are valid orderings. The sort algorithm starts out with those modules on which no other module depends ("roots"). The algorithm walks over these "roots". For every root node N, it walks through the list of its dependencies M, and "forgets" the dependency of N on M, decrementing the number of "users" of M by 1. If N was the last "user" of M, M becomes a new "root" node, which is sorted after all root nodes found so far. The position in which this node is now inserted becomes its sort index (dep_sort_idx). This way it is ensured that the constraint above is always met. One peculiarity of the current algorithm is that the list of "root" nodes is walked backwards, while new nodes are being appended to the end. This works, but it's hard to follow and leads to some surprising results (for example, modules with dependencies A->B, C->D will be ordered A, B, D, C). The final ordering depends on the initial ordering of the modules, and the order of the list of dependencies of every module. The initial module order is determined by the module hash. This ordering is deterministic (the hash function is deterministic, and in every hash bucket, modules are sorted alphabetically), but it depends on the hash implementation and should rather not be relied upon. Also, the determinism is hard to understand because of the hash involved. A module's list of dependencies depends on the order the modules are scanned. This is deterministic for regular depmod (determined by the depth-first search in depmod_modules_search_dir()), but not for incremental depmod, where the order of modules listed on the command line is arbitrary. This patch modifies the algorithm by not incrementing dep_sort_idx for every node. Rather, dep_sort_idx is set to the node's "rank", which is defined as follows: Modules with no users have rank 1. The rank of an arbitrary module M is the maximum of the ranks of all modules depending on M, plus 1. By this definition, modules of rank N can only depend on modules of rank N+1 or higher. A prerequisite for implementing this change is that the list of "roots" is now scanned forward rather than backward. Modules are sorted by rank; this way the main ordering constraint (see above) remains fulfilled. Modules of equal rank are sorted alphabetically by module name, leading to a completely deterministic order for all modules. Example of previous behavior ("->" indicates "depends on"): A->(B, C); B->D; C->D; E->B input: A, B, C, D, E sorted: A, E, C, B, D deps of A: C, B, D input: E, A, B, C, D sorted: E, A, B, C, D deps of A: B, C, D Note that the list of dependencies of A depends on the input order. With this patch, ranks A: 0, E: 0, B: 1, C: 1, D: 2 sorted: A, E, B, C, D (independent of input order) deps of A: B, C, D Signed-off-by: Martin Wilck --- .../lib/modules/5.3.18/correct-modules.dep | 10 +++--- .../modules/5.3.18/correct-modules.dep.bin | Bin 3082 -> 3082 bytes .../lib/modules/4.4.4/correct-modules.dep | 2 +- .../lib/modules/4.4.4/correct-modules.dep.bin | Bin 323 -> 323 bytes .../lib/modules/4.4.4/correct-modules.dep | 2 +- .../lib/modules/4.4.4/correct-modules.dep.bin | Bin 323 -> 323 bytes .../lib/modules/4.4.4/correct-modules.dep | 2 +- .../lib/modules/4.4.4/correct-modules.dep.bin | Bin 244 -> 244 bytes tools/depmod.c | 30 +++++++++++------- 9 files changed, 27 insertions(+), 19 deletions(-) diff --git a/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep index 246e149c..b9666a0c 100644 --- a/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep +++ b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep @@ -1,5 +1,5 @@ -kernel/drivers/md/dm-multipath.ko: kernel/drivers/scsi/scsi_mod.ko kernel/drivers/md/dm-mod.ko -kernel/drivers/scsi/qla2xxx/qla2xxx.ko: kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/qla2xxx/qla2xxx.ko: kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko kernel/drivers/scsi/scsi_mod.ko: @@ -8,13 +8,13 @@ kernel/drivers/scsi/scsi_transport_sas.ko: kernel/drivers/scsi/scsi_mod.ko kernel/drivers/scsi/mpt3sas.ko: kernel/drivers/scsi/raid_class.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/md/dm-mod.ko: kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko -kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko: kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/scsi/qla2xxx/qla2xxx.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko: kernel/drivers/scsi/qla2xxx/qla2xxx.ko kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko kernel/drivers/misc/enclosure.ko: kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko -kernel/drivers/md/dm-service-time.ko: kernel/drivers/scsi/scsi_mod.ko kernel/drivers/md/dm-mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko -kernel/drivers/scsi/sd_mod.ko: kernel/block/t10-pi.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko kernel/drivers/cdrom/cdrom.ko: kernel/block/t10-pi.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep.bin index c15c8c39cbf53bc352e84027a3fdd02171f05f46..e59a3545d60a92b4217e32a54f0eea876b5e812c 100644 GIT binary patch delta 132 zcmeB@=#tpb#W-1kiD$A2i@@Xqtb&ubGkPNPH|sKWGfmFtR+)T&No4XF7S+kxERvI$ z6o5kflMgVoD~&O+LURGWi3G>f{qFB9r}C`6p|! wxKB1=5df+a++4#tk!i9IGe2CwmSYyvQAllP9oKHL(WH delta 18 acmX@ibeL(vdep_sort_idx - b->dep_sort_idx; + int cmp = a->dep_sort_idx - b->dep_sort_idx; + + if (cmp != 0) + return cmp; + + return strcmp(a->modname, b->modname); } static void depmod_sort_dependencies(struct depmod *depmod) @@ -2109,20 +2114,23 @@ static void depmod_report_cycles(struct depmod *depmod, uint16_t n_mods, uint16_ static int depmod_calculate_dependencies(struct depmod *depmod) { const struct mod **itrm; - uint16_t *users, *roots, *sorted; - uint16_t i, n_roots = 0, n_sorted = 0, n_mods = depmod->modules.count; + uint16_t *users, *roots, *rank; + uint16_t i, n_roots = 0, n_mods = depmod->modules.count; + uint16_t i_roots; int ret = 0; - users = malloc(sizeof(uint16_t) * n_mods * 3); + users = malloc(sizeof(uint16_t) * n_mods * 4); if (users == NULL) return -ENOMEM; roots = users + n_mods; - sorted = roots + n_mods; + rank = roots + n_mods; DBG("calculate dependencies and ordering (%hu modules)\n", n_mods); assert(depmod->modules.count < UINT16_MAX); + memset(rank, 0, sizeof(*rank) * n_mods); + /* populate modules users (how many modules uses it) */ itrm = (const struct mod **)depmod->modules.array; for (i = 0; i < n_mods; i++, itrm++) { @@ -2130,20 +2138,19 @@ static int depmod_calculate_dependencies(struct depmod *depmod) users[i] = m->users; if (users[i] == 0) { roots[n_roots] = i; + rank[n_roots] = 1; n_roots++; } } /* topological sort (outputs modules without users first) */ - while (n_roots > 0) { + for (i_roots = 0; i_roots < n_roots; i_roots++) { const struct mod **itr_dst, **itr_dst_end; struct mod *src; - uint16_t src_idx = roots[--n_roots]; + uint16_t src_idx = roots[i_roots]; src = depmod->modules.array[src_idx]; - src->dep_sort_idx = n_sorted; - sorted[n_sorted] = src_idx; - n_sorted++; + src->dep_sort_idx = rank[i_roots]; if (src->deps.count == 0) continue; @@ -2157,12 +2164,13 @@ static int depmod_calculate_dependencies(struct depmod *depmod) users[dst_idx]--; if (users[dst_idx] == 0) { roots[n_roots] = dst_idx; + rank[n_roots] = rank[i_roots] + 1; n_roots++; } } } - if (n_sorted < n_mods) { + if (n_roots < n_mods) { depmod_report_cycles(depmod, n_mods, users); ret = -EINVAL; goto exit; From 9db7df254854f6d643e6a4eb7c036213b941d3fb Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Thu, 14 Nov 2024 22:33:19 +0100 Subject: [PATCH 20/25] testsuite: add unit test for incremental module addition This test uses the same module set as "big-01". But it simulates an incremental addition. The test directory contains modules.dep and other output files from a "previous" depmod run, where some modules (scsi_transport_sas, qla2xxx and their dependencies) had been missing. The test then runs "depmod -I -a" over this directory with the "previously missing" modules now present. The final results should be equal to those of the big-01 test. Signed-off-by: Martin Wilck --- scripts/setup-rootfs.sh | 23 ++++++++++ .../lib/modules/5.3.18/correct-modules.dep | 22 ++++++++++ .../modules/5.3.18/correct-modules.dep.bin | Bin 0 -> 3082 bytes .../modules/5.3.18/correct-modules.symbols | 28 ++++++++++++ .../5.3.18/correct-modules.symbols.bin | Bin 0 -> 2175 bytes .../lib/modules/5.3.18/modules.alias | 1 + .../lib/modules/5.3.18/modules.alias.bin | Bin 0 -> 12 bytes .../lib/modules/5.3.18/modules.dep | 17 ++++++++ .../lib/modules/5.3.18/modules.dep.bin | Bin 0 -> 1980 bytes .../lib/modules/5.3.18/modules.devname | 0 .../lib/modules/5.3.18/modules.softdep | 1 + .../lib/modules/5.3.18/modules.symbols | 25 +++++++++++ .../lib/modules/5.3.18/modules.symbols.bin | Bin 0 -> 1976 bytes .../lib/modules/5.3.18/modules.weakdep | 1 + .../5.3.18/novers-correct-modules.symbols.bin | Bin 0 -> 2175 bytes .../modules/5.3.18/novers-modules.symbols.bin | Bin 0 -> 1976 bytes testsuite/test-depmod.c | 41 ++++++++++++++++++ 17 files changed, 159 insertions(+) create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.dep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.symbols create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.alias create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.dep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.devname create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.weakdep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/novers-correct-modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/novers-modules.symbols.bin diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh index 200e3b96..134fd435 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -161,6 +161,29 @@ map=( ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-mod.ko"]="ex-dm-mod.ko" ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/fs/configfs/configfs.ko"]="ex-configfs.ko" ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/symvers"]="symvers" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/block/t10-pi.ko"]="ex-t10-pi.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/cdrom/cdrom.ko"]="ex-cdrom.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_mod.ko"]="ex-scsi_mod.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_fc.ko"]="ex-scsi_transport_fc.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_sas.ko"]="ex-scsi_transport_sas.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sd_mod.ko"]="ex-sd_mod.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sr_mod.ko"]="ex-sr_mod.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/ses.ko"]="ex-ses.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/device_handler/scsi_dh_alua.ko"]="ex-scsi_dh_alua.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/raid_class.ko"]="ex-raid_class.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/mpt3sas.ko"]="ex-mpt3sas.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/qla2xxx.ko"]="ex-qla2xxx.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko"]="ex-tcm_qla2xxx.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fc.ko"]="ex-nvme-fc.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fabrics.ko"]="ex-nvme-fabrics.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-core.ko"]="ex-nvme-core.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/target/target_core_mod.ko"]="ex-target_core_mod.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/misc/enclosure.ko"]="ex-enclosure.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-multipath.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-service-time.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-mod.ko"]="ex-dm-mod.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/fs/configfs/configfs.ko"]="ex-configfs.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/symvers"]="symvers" ) gzip_array=( diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.dep new file mode 100644 index 00000000..b9666a0c --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.dep @@ -0,0 +1,22 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/qla2xxx/qla2xxx.ko: kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/scsi/ses.ko: kernel/drivers/misc/enclosure.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/scsi_transport_sas.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/mpt3sas.ko: kernel/drivers/scsi/raid_class.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko: kernel/drivers/scsi/qla2xxx/qla2xxx.ko kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..e59a3545d60a92b4217e32a54f0eea876b5e812c GIT binary patch literal 3082 zcmdT`y^hmB5S}EL{8i-35J2qI6pylUj*IdX)^ zzxEoFFyV7ny1b&h3^=hph05|W6KC8l4{NAx$l{7}j7eQ)XKp|p61tpANONWcb7MYB zm~f=St;iyWi^y|;_$l;`F^4!T=sioS_zpC=vD{)$5-x0f8W9PttG);mGPT9&cr**- zdvJ;5eu=z~p!fBH1*A+wZ#%Q^X6QP(`Zbs}sI=%3q;IUYI#1k`fc9BIXv*O2Z}BPt3+q4dKk>slq_ z$drt=^55thx*{NK1%s0mhF?y{wT<+?a+Q%X=Kn_nD4;Biy9y&wD2N?DSQSE*k{+TqbDTB)#dq-1CN@5u>@) z=uRuP_9LtM<6sBUyt}ot;#Hx<-Z1jg;x=jJYAWEeo%N0U9=72P@<_iV6uW9C)frcr z+_9zCW4>IEL?=y`BI|mb+b@^ymhV*w9kTZg(BK>YS?b50}4v1v5CA1KhKA3vho^u9=#*>~e&2d6*J;q;F=oIRPt#qZooTkyi65e~V+ zbs^F6O4N%I)ebbH_pCRn8U?TENj=YxVwONt>tewdrdhSTs0%lReJpzmZF`u?MWU6A zpyJ?G9l)>T`$LhJ$jz$emEzYcTp<^BQ_JaASE}OU`H7!-Ius$)1{Z}T*Lf@4l3OfM zy2ebg?-ACb*+s@(QDN_muk%pGN) zgB?}>)QP%cg2eB%jRn)U9{wb%k6uX3&VmDM>_$CP_cn z3*@kmit?0HJId2pkKgkUBr0V}A=G_tN@vQyIZq3gVd(q7wJ1tnH2R9JO(BOAXSohU8YECUZe7#zb}20SQ{c&UDg2w8n_jLk&a))N1O#?)_TV<5^!=z% zT$X}D6+<>mguG|OXt5VR&LZYX*cXOWrlHC?Ea&_EYHzPYPe(puAS9jEcZn^Wy|f(b zzA{~TR8AL@w6kIeUh347GD(2?2`D#*^A8V$Isax0=Le0dgNuiw4bAy(PUF-4_+nXg zaQ^9NF^;tM^&NB^HmW3Nim@OCK@7B077lGG&qC^J3>xeBg0gMG*`amhW8kGyg5?&3 zB9DH$<=tz`O}pGox44VAglRfGL%{XE0Z);KhiAD`f$#!o6jEW-_NcrM?OB$1m>~mG z)RdP!V5yFDJp^GWL!YHS3|(=#qvfrXq@;hG#W4u8qc1NT`S|UKjG<0hq`(s$T>dx` z_t|omP~s9 literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.alias b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.alias.bin b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.alias.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.dep new file mode 100644 index 00000000..7bc615f7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.dep @@ -0,0 +1,17 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..8ecbdad43a92e213a11f6574c762925e3bd543cc GIT binary patch literal 1980 zcmdT_O>)yP6n=Knq(J%EvvKzrw>zdQ7R=BSz=|=dBsZGaRz_076*xvV?3rN!OZNmU z*>eUCfSw(>uBtQvR%j-Q;`hDxeR}?+e4hS#3o%3qz!5ceezOMn*+87ajLw!J@I1-4j~kR0*8Yxl zU&83sg%Y&4MtpbWg0$#iac8-(2KQEc36>iT678U)doW#Va%6uei3pa{lIXq{Q%_v$ zDAmJ4(r%fKsx^%31`a-9yZ>}FFgdga24)%FrrpH^8%mBTY5k}0H>sZ=?mP>|2nMxcPIHmpni1UqfNiOo?2I2 ba+Bi)Htg;_ue*jIEbG2{^w1Yu{@UO-3&#Ed literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.devname b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.devname new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.softdep b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.softdep new file mode 100644 index 00000000..5554ccca --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.symbols b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.symbols new file mode 100644 index 00000000..2d6add06 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.symbols @@ -0,0 +1,25 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:scsi_target_block_mangled scsi_mod +alias symbol:scsi_remove_host_mangled scsi_mod +alias symbol:t10_pi_type1_crc_mangled t10_pi +alias symbol:scsi_dh_attach_mangled scsi_mod +alias symbol:nvme_fc_set_remoteport_devloss_mangled nvme_fc +alias symbol:target_backend_unregister_mangled target_core_mod +alias symbol:scsi_host_get_mangled scsi_mod +alias symbol:__scsi_iterate_devices_mangled scsi_mod +alias symbol:target_execute_cmd_mangled target_core_mod +alias symbol:fc_attach_transport_mangled scsi_transport_fc +alias symbol:register_cdrom_mangled cdrom +alias symbol:fc_vport_create_mangled scsi_transport_fc +alias symbol:scsi_print_sense_hdr_mangled scsi_mod +alias symbol:scsi_dma_map_mangled scsi_mod +alias symbol:scsi_is_sdev_device_mangled scsi_mod +alias symbol:nvme_complete_rq_mangled nvme_core +alias symbol:dm_unregister_path_selector_mangled dm_service_time +alias symbol:raid_class_attach_mangled raid_class +alias symbol:enclosure_remove_device_mangled enclosure +alias symbol:scsi_mode_sense_mangled scsi_mod +alias symbol:dm_table_run_md_queue_async_mangled dm_mod +alias symbol:nvmf_fail_nonready_command_mangled nvme_fabrics +alias symbol:nvme_uninit_ctrl_mangled nvme_core +alias symbol:config_group_init_mangled configfs diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..ecdd89e36793b013965b0825ba8e63f5565030f6 GIT binary patch literal 1976 zcmdT_y^a$x5T48Zfdm|)f$~}^yuaC{qoSjP((>BlWOe(Kvz>_RD50f5lz9Lo5KoYn zf)}8nyB7da0<)VeciHF;kZ7>9ve%x^{${@M_}%{3Coq7mLx5}6&H-+nlv!Qe2ksUC z7S1*Le>(>_UBH%`!`AzAOB=&E3|^d{JcR8JbJ%%!2z!iMX>*=CG{PZQILjqkUW#f| zplUz^`nFr6vR3eeTH<+r6tf}JmCi?eWa{aJ=T+|du$!{A(6)uCOboS>5tJO% zxZe|5f!s_hUMhY(#VK-OPb%5pYDbm4JAde>o(@F_mBCSNi8`MMH|7=#l&&^?>=nXV zG>vE6%)OKo!1eW!z3qgO6J?!k3A=oObTf+?{Uxw>@DW*X5)@;$)8dw05gmiCorZsS%44l86#bl76lg$YJXhKNyOiD7F|zspDu7>y;KY{ zrWgwn5X5`Z=e}-BN{3Wg7}VDB5$WCYblp1gG4K*8!E#I4u&P{_W715iKzISv3Mr#1 zyKyhp&tU1$!xR~qymBkRSZ&mobr6O!^jYG=vYdNBf7LCc+|-y~4@#88ELBp#Qr-GM}zn&v)A{s09MCD4sF>q%^#z3bauM~P@Dphs8xAAsnQ z+<@SZT#W=06*|UFtc%yO?oOg%rD)fidAl?3&CGrr{dx&~=#2q(t<3@UmdQlNPXJv3 zU}0nM_lF$dynvp|q4#Oyuhue${=0g!fUWOi*!nYu!Rs+>|3)iqgpng79AQB7NRq`w zs98)w3F`B2P#GmUfD0an>j7F#qZ!VO&Qgq2{Rdxx=>Oc@!vD50h|O2*n|hMk~9 z&ua?&Gj3CD*F;MMF)yHhucYc<4nFg_b3%sbj8Hb!rbX|AN|npMr?Tl=g^`9zVLd^w zg3c45DW}aDr^{Oe$#V72>+pE*QN6zD%-9z?Nn>K4%&G6zEj3RFr8b^MlJ#?yK#r=Y zI8Rx%R-X1Nyw8KGa#K1JU-v$oiYP{OXE4<*jpFrToFudOkX80zDVWUwMuzgV5@EXfC&+pgs zmoO<{__(&HXWo0&K}ScU63jsAv(RCyt-~2-o5xv)wM7deV2{3Scz0pZq~X#(;!5IZ zzHY!ivg2|c5Eq8Bt@7@$H<9AJtN>xq(zOG$>WX1W%k?M`rlfBYYk6`_#E~dq^tmSR zf1Gm|{W!!lLbpum2&HK~VEgW;%rZh(7}P1A7gP`m zzcw=7YLIH|oNpX0lxOOgi?Bpb8OdN>jJ?KKPp*htX7L01}R&S~?u zg#If8$#NwZje9(IuNhypXY4bp^Ng62JCA9dn3X1!)WG%<5ZMky|c9sRZ+oDv3iRf;kbOj~S~ zjYJta(O9&F+$Fh8o#k85zM41d*|vRkqah7r7`$myI2o33@-UiPHvhc#t{QXyW!L{& zY9{`^v1odp`+C5M1EoSR?>y#yz}EVJ3)VaG^nkTT&)Kl6Tt{MTN}N%~ckac3Gn_JE z2Uw<^`f>oYEho#$o8vqYuJU@8S$TFOVk$}){%lnFANviA?oTjR7}hyWQMyj$zZIsH yK|90iNWqM6+30cOHjiHlc}9Fui_4cG3jOu4jdE3Ex(~_=k_8tg$#2n>aDM Date: Thu, 14 Nov 2024 22:46:54 +0100 Subject: [PATCH 21/25] testsuite: add unit test for incremental module deletion This test also uses the module set from "big-01". It simulates deletion of some modules (again, scsi_transport_sas and qla2xxx plus their dependencies) and subsequent running of "depmod -I -a". The input directory contains the depmod results for the full module set. The results should be equal to the inputs of the big-01-incremental test. Signed-off-by: Martin Wilck --- scripts/setup-rootfs.sh | 18 +++++++++ .../lib/modules/5.3.18/correct-modules.dep | 17 ++++++++ .../modules/5.3.18/correct-modules.dep.bin | Bin 0 -> 1980 bytes .../modules/5.3.18/correct-modules.symbols | 25 ++++++++++++ .../5.3.18/correct-modules.symbols.bin | Bin 0 -> 1784 bytes .../lib/modules/5.3.18/modules.alias | 1 + .../lib/modules/5.3.18/modules.alias.bin | Bin 0 -> 12 bytes .../lib/modules/5.3.18/modules.dep | 22 ++++++++++ .../lib/modules/5.3.18/modules.dep.bin | Bin 0 -> 3082 bytes .../lib/modules/5.3.18/modules.devname | 0 .../lib/modules/5.3.18/modules.softdep | 1 + .../lib/modules/5.3.18/modules.symbols | 28 +++++++++++++ .../lib/modules/5.3.18/modules.symbols.bin | Bin 0 -> 1959 bytes .../lib/modules/5.3.18/modules.weakdep | 1 + .../5.3.18/novers-correct-modules.symbols.bin | Bin 0 -> 1976 bytes .../modules/5.3.18/novers-modules.symbols.bin | Bin 0 -> 2175 bytes testsuite/test-depmod.c | 38 ++++++++++++++++++ 17 files changed, 151 insertions(+) create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.dep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.alias create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.dep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.devname create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.weakdep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/novers-correct-modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/novers-modules.symbols.bin diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh index 134fd435..695dceff 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -184,6 +184,24 @@ map=( ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-mod.ko"]="ex-dm-mod.ko" ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/fs/configfs/configfs.ko"]="ex-configfs.ko" ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/symvers"]="symvers" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/block/t10-pi.ko"]="ex-t10-pi.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/cdrom/cdrom.ko"]="ex-cdrom.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_mod.ko"]="ex-scsi_mod.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_fc.ko"]="ex-scsi_transport_fc.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sd_mod.ko"]="ex-sd_mod.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sr_mod.ko"]="ex-sr_mod.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/device_handler/scsi_dh_alua.ko"]="ex-scsi_dh_alua.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/raid_class.ko"]="ex-raid_class.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fc.ko"]="ex-nvme-fc.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fabrics.ko"]="ex-nvme-fabrics.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-core.ko"]="ex-nvme-core.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/target/target_core_mod.ko"]="ex-target_core_mod.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/misc/enclosure.ko"]="ex-enclosure.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-multipath.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-service-time.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-mod.ko"]="ex-dm-mod.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/fs/configfs/configfs.ko"]="ex-configfs.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/symvers"]="symvers" ) gzip_array=( diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.dep new file mode 100644 index 00000000..7bc615f7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.dep @@ -0,0 +1,17 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..8ecbdad43a92e213a11f6574c762925e3bd543cc GIT binary patch literal 1980 zcmdT_O>)yP6n=Knq(J%EvvKzrw>zdQ7R=BSz=|=dBsZGaRz_076*xvV?3rN!OZNmU z*>eUCfSw(>uBtQvR%j-Q;`hDxeR}?+e4hS#3o%3qz!5ceezOMn*+87ajLw!J@I1-4j~kR0*8Yxl zU&83sg%Y&4MtpbWg0$#iac8-(2KQEc36>iT678U)doW#Va%6uei3pa{lIXq{Q%_v$ zDAmJ4(r%fKsx^%31`a-9yZ>}FFgdga24)%FrrpH^8%mBTY5k}0H>sZ=?mP>|2nMxcPIHmpni1UqfNiOo?2I2 ba+Bi)Htg;_ue*jIEbG2{^w1Yu{@UO-3&#Ed literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols new file mode 100644 index 00000000..c12dba99 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols @@ -0,0 +1,25 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:t10_pi_type1_crc t10_pi +alias symbol:nvmf_fail_nonready_command nvme_fabrics +alias symbol:scsi_dma_map scsi_mod +alias symbol:scsi_is_sdev_device scsi_mod +alias symbol:nvme_uninit_ctrl nvme_core +alias symbol:dm_table_run_md_queue_async dm_mod +alias symbol:nvme_fc_set_remoteport_devloss nvme_fc +alias symbol:scsi_remove_host scsi_mod +alias symbol:scsi_target_block scsi_mod +alias symbol:dm_unregister_path_selector dm_service_time +alias symbol:scsi_host_get scsi_mod +alias symbol:nvme_complete_rq nvme_core +alias symbol:fc_vport_create scsi_transport_fc +alias symbol:scsi_print_sense_hdr scsi_mod +alias symbol:target_backend_unregister target_core_mod +alias symbol:enclosure_remove_device enclosure +alias symbol:fc_attach_transport scsi_transport_fc +alias symbol:raid_class_attach raid_class +alias symbol:register_cdrom cdrom +alias symbol:scsi_mode_sense scsi_mod +alias symbol:target_execute_cmd target_core_mod +alias symbol:scsi_dh_attach scsi_mod +alias symbol:__scsi_iterate_devices scsi_mod +alias symbol:config_group_init configfs diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..308e699076f6e6a22f64e6aef45579c7c2a2559c GIT binary patch literal 1784 zcmdT_JC77c5U$&M0FsRn37K`Vqv?6<&Ja6BLP8>=)YDyaJ7ykx-MuUCFEDa|#6Q@K z3=traZpbgN$gt#qKR|A(XRb$g_y{bK(9&){>Z|IiuCHod-}v+xW^ix{@PoBGfVdWCgYJ8#>=@2Eji*#TaZLgk6bpha-& zJ-|Qg>pfXEgl64gtMPnIYeH$aoeCz7bc^A>B&Ilum4?pHS#8-xTuHY?OARU4o1k-( zbu1b0Il8)~(b+Ul^gBymAmkuShwQ5oVyd5`>ye?_H8g}yK~%aT0+&EF$bJ{N|UJM*RdZ zsntkLUC}(|Kaj+M{NaIN@cwPBQ8m(9ltZSx$VYd>$RHUKBl4u8oCq$+skG_a0RC~@ z`MS|_nWu|Pfv+^s?i7xG@vt!VaP*viZ^GWsy#G7w_i%i3JUh-V<|oUR5x)jRnEC9t zFPy$w!f92dWfoN+v6U;Y<^%fzqhwN2q@lMC&uF6ORaBLzs?6gYELzUyMd!HQBF*zW zE7KTyP0WPOPW-)UGc6Xm$f5<9x^p8CmwKx6t6;6;oRo-REbAqEd;RTmSrv1UNsxx4 z!LsSq)9aDhJW{17QxI|wCl5U6dmTGC*+#gk(QQ{GxNA%u_O=sVFfuq|GGrow;boxY zYB+fjLgw{5sh(1&aXoclFZ7hT<;K_awLUfMxy)jf#~J)iYR!#7wNnjVi!Zp&=Ouqo FJ_9K2yWju- literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.alias b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.alias.bin b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.alias.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.dep new file mode 100644 index 00000000..b9666a0c --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.dep @@ -0,0 +1,22 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/qla2xxx/qla2xxx.ko: kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/scsi/ses.ko: kernel/drivers/misc/enclosure.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/scsi_transport_sas.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/mpt3sas.ko: kernel/drivers/scsi/raid_class.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko: kernel/drivers/scsi/qla2xxx/qla2xxx.ko kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..e59a3545d60a92b4217e32a54f0eea876b5e812c GIT binary patch literal 3082 zcmdT`y^hmB5S}EL{8i-35J2qI6pylUj*IdX)^ zzxEoFFyV7ny1b&h3^=hph05|W6KC8l4{NAx$l{7}j7eQ)XKp|p61tpANONWcb7MYB zm~f=St;iyWi^y|;_$l;`F^4!T=sioS_zpC=vD{)$5-x0f8W9PttG);mGPT9&cr**- zdvJ;5eu=z~p!fBH1*A+wZ#%Q^X6QP(`Zbs}sI=%3q;IUYI#1k`fc9BIXv*O2Z}BPt3+q4dKk>slq_ z$drt=^55thx*{NK1%s0mhF?y{wT<+?a+Q%X=Kn_nD4;Biy9y&wD2N?DSQSE*k{+TqbDTB)#dq-1CN@5u>@) z=uRuP_9LtM<6sBUyt}ot;#Hx<-Z1jg;x=jJYAWEeo%N0U9=72P@<_iV6uW9C)frcr z+_9zCW4>IEL?=y`BI|mb?cK1&I1rkycq|V3? zf`GJt1=@U(_ydF>c&-{3+rvzNM1q4V+wXh#;qNbh`y3WlM)zD;Yl!ZFgIkc+o%w}Mv)O1_#qUU`?o<4H1N+DDffkKd5w)a;D{4du57Vldt z)f(*}Thn*L9KN^5XwTPJs>zcer#R12a9C6WaiW|>F5(ZcV_!?oP3JHWx>%jWXA+p8ol5; z_U2UPVL;Zk!5h=NIZts4X{ufWy4RihA z5&qA2FYma0JTRiNjEZS@;LxvkUcp0wNedZgVO9cdZwH;{I95hUmc>OBK&Ocdw>5LS9pj=r%|yIRVW?WJ zBL~E_p7V1I);h>Yi2$Z4v}Skj*Ph5SPed$14jc|F>P|hs9~mc0Rfr-2ArElzhXegz z*B&lETw-6L-Ss4R$juMJTUI#2)I>|JrdWh9Mg|IQ$jgtt%e;Rf)pKe!ZsrHW5nata kwNo_RXqw-bM8<*2f*5W{ZFr8UW*!;$;&UELNx|>mUl@V(HUIzs literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.weakdep b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.weakdep new file mode 100644 index 00000000..569696db --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.weakdep @@ -0,0 +1 @@ +# Weak dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/novers-correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/novers-correct-modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..040aed8a85d4629144f9ee52cc49ccf179375015 GIT binary patch literal 1976 zcmdT_v5pfl5S?st2}r;p8Yt6Jkw{c@RCJV3jvVhKv2Jbe+1`kBl+aQj%6tG4h%eZd zf*+uvyB`2i0<)W}F6&i9PNKom%3gb({bt^H{BiW-IV8{<1KjX_18`@pXEu8T7)k&S zdyW4;Yyd7w=!FgRKJ6`ah8sv;?@x}Q|9Jz0Cu0~+&`YmS1#%(~rnFL$JZfPU8Ko5{ z;jdpCX`8}tZj)UDYvyW!3ulWQl~Eyv-Ile*+_zyGArvLRcjo>;%rZh(7}P1A7gP`m zzcw=7YLIH|oNpX0lxOOgi?Bpb8OdN>jJ?KKPp*htX7L01}R&S~?u zg#If8$#NwZje9(IuNhypXY4bp^Ng62JCA9dn3X1!)WG%<5ZMky|c9sRZ+oDv3iRf;kbOj~S~ zjYJta(O9&F+$Fh8o#k85zM41d*|vRkqah7r7`$myI2o33@-UiPHvhc#t{QXyW!L{& zY9{`^v1odp`+C5M1EoSR?>y#yz}EVJ3)VaG^nkTT&)Kl6Tt{MTN}N%~ckac3Gn_JE z2Uw<^`f>oYEho#$o8vqYuJU@8S$TFOVk$}){%lnFANviA?oTjR7}hyWQMyj$zZIsH yK|90iNWqM6+30cOHjiHlc}9Fui_4cG3jOu4jdE3Ex(~_=k_8tg$#2n>aDMr-GM}zn&v)A{s09MCD4sF>q%^#z3bauM~P@Dphs8xAAsnQ z+<@SZT#W=06*|UFtc%yO?oOg%rD)fidAl?3&CGrr{dx&~=#2q(t<3@UmdQlNPXJv3 zU}0nM_lF$dynvp|q4#Oyuhue${=0g!fUWOi*!nYu!Rs+>|3)iqgpng79AQB7NRq`w zs98)w3F`B2P#GmUfD0an>j7F#qZ!VO&Qgq2{Rdxx=>Oc@!vD50h|O2*n|hMk~9 z&ua?&Gj3CD*F;MMF)yHhucYc<4nFg_b3%sbj8Hb!rbX|AN|npMr?Tl=g^`9zVLd^w zg3c45DW}aDr^{Oe$#V72>+pE*QN6zD%-9z?Nn>K4%&G6zEj3RFr8b^MlJ#?yK#r=Y zI8Rx%R-X1Nyw8KGa#K1JU-v$oiYP{OXE4<*jpFrToFudOkX80zDVWUwMuzgV5@EXfC&+pgs zmoO<{__(&HXWo0&K}ScU63jsAv(RCyt-~2-o5xv)wM7deV2{3Scz0pZq~X#(;!5IZ zzHY!ivg2|c5Eq8Bt@7@$H<9AJtN>xq(zOG$>WX1W%k?M`rlfBYYk6`_#E~dq^tmSR zf1Gm|{W!!lLbpum2&HK~VEgW Date: Fri, 15 Nov 2024 00:58:44 +0100 Subject: [PATCH 22/25] testsuite: create a second module playground This alternative playground will be used to build module sets with disagreeing symbol versions. This must be done in separate directories, otherwise the kernel build will mix up the dependencies because some symbols will be defined multiple times with different symbol version. Signed-off-by: Martin Wilck --- testsuite/module-playground/Makefile | 5 ++++- testsuite/module-playground/other/Kbuild | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 testsuite/module-playground/other/Kbuild diff --git a/testsuite/module-playground/Makefile b/testsuite/module-playground/Makefile index ac6f66ff..f98b3c3b 100644 --- a/testsuite/module-playground/Makefile +++ b/testsuite/module-playground/Makefile @@ -13,7 +13,7 @@ endif ARCH_SPECIFIC_MODULES := mod-simple-x86_64.ko mod-simple-i386.ko mod-simple-sparc64.ko -default: modules symvers +default: modules other_modules symvers mod-simple-%.ko: mod-simple-%.c Makefile.arch $(eval arch=$(patsubst mod-simple-%.ko,%,$@)) @@ -22,6 +22,9 @@ mod-simple-%.ko: mod-simple-%.c Makefile.arch modules: $(MAKE) -C $(KDIR) M=$$PWD modules +other_modules: + $(MAKE) -C $(KDIR) M=$$PWD/other modules + symvers: cp $(KDIR)/Module.symvers $@ diff --git a/testsuite/module-playground/other/Kbuild b/testsuite/module-playground/other/Kbuild new file mode 100644 index 00000000..92e237a3 --- /dev/null +++ b/testsuite/module-playground/other/Kbuild @@ -0,0 +1,8 @@ +ifneq ($(KMOD_TESTSUITE_ARCH_BUILD),1) + +include $(src)/gen_mod.mak +$(src)/gen_mod.mak: + cd $(src) && python3 ../gen_mod.py other + +clean-files := $(src)/gen_mod.mak +endif From 2078128d71ff7ee13cdd0828e54f79cdd24c1237 Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Fri, 15 Nov 2024 01:00:43 +0100 Subject: [PATCH 23/25] testsuite: add unit test for module replacement This test takes again the module set from "big-01" and replaces two modules such that a symbol version changes. "depmod -I -a" is expected to pick up this change. Signed-off-by: Martin Wilck --- scripts/setup-rootfs.sh | 23 ++++++++ .../modules/5.3.18/correct-modules.symbols | 48 ++++++++-------- .../5.3.18/correct-modules.symbols.bin | Bin 1784 -> 1976 bytes .../lib/modules/5.3.18/modules.symbols | 54 +++++++++--------- .../lib/modules/5.3.18/modules.symbols.bin | Bin 1959 -> 2175 bytes .../lib/modules/5.3.18/correct-modules.dep | 22 +++++++ .../modules/5.3.18/correct-modules.dep.bin | Bin 0 -> 3082 bytes .../modules/5.3.18/correct-modules.symbols | 28 +++++++++ .../5.3.18/correct-modules.symbols.bin | Bin 0 -> 2175 bytes .../lib/modules/5.3.18/modules.alias | 1 + .../lib/modules/5.3.18/modules.alias.bin | Bin 0 -> 12 bytes .../lib/modules/5.3.18/modules.dep | 22 +++++++ .../lib/modules/5.3.18/modules.dep.bin | Bin 0 -> 3082 bytes .../lib/modules/5.3.18/modules.devname | 0 .../lib/modules/5.3.18/modules.softdep | 1 + .../lib/modules/5.3.18/modules.symbols | 28 +++++++++ .../lib/modules/5.3.18/modules.symbols.bin | Bin 0 -> 2175 bytes .../lib/modules/5.3.18/modules.weakdep | 1 + .../5.3.18/novers-correct-modules.symbols.bin | Bin 0 -> 2175 bytes .../modules/5.3.18/novers-modules.symbols.bin | Bin 0 -> 2175 bytes testsuite/test-depmod.c | 43 ++++++++++++++ 21 files changed, 220 insertions(+), 51 deletions(-) create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.dep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.symbols create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.alias create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.dep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.devname create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.weakdep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/novers-correct-modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/novers-modules.symbols.bin diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh index 695dceff..98bb9ef3 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -202,6 +202,29 @@ map=( ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-mod.ko"]="ex-dm-mod.ko" ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/fs/configfs/configfs.ko"]="ex-configfs.ko" ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/symvers"]="symvers" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/block/t10-pi.ko"]="ex-t10-pi.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/cdrom/cdrom.ko"]="ex-cdrom.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_mod.ko"]="ex-scsi_mod.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_fc.ko"]="ex-scsi_transport_fc.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_sas.ko"]="ex-scsi_transport_sas.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sd_mod.ko"]="ex-sd_mod.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sr_mod.ko"]="ex-sr_mod.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/ses.ko"]="ex-ses.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/device_handler/scsi_dh_alua.ko"]="ex-scsi_dh_alua.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/raid_class.ko"]="ex-raid_class.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/mpt3sas.ko"]="ex-mpt3sas.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/qla2xxx.ko"]="other/ex-qla2xxx.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko"]="other/ex-tcm_qla2xxx.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fc.ko"]="ex-nvme-fc.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fabrics.ko"]="ex-nvme-fabrics.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-core.ko"]="ex-nvme-core.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/target/target_core_mod.ko"]="ex-target_core_mod.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/misc/enclosure.ko"]="ex-enclosure.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-multipath.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-service-time.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-mod.ko"]="ex-dm-mod.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/fs/configfs/configfs.ko"]="ex-configfs.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/symvers"]="symvers" ) gzip_array=( diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols index c12dba99..2d6add06 100644 --- a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols +++ b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols @@ -1,25 +1,25 @@ # Aliases for symbols, used by symbol_request(). -alias symbol:t10_pi_type1_crc t10_pi -alias symbol:nvmf_fail_nonready_command nvme_fabrics -alias symbol:scsi_dma_map scsi_mod -alias symbol:scsi_is_sdev_device scsi_mod -alias symbol:nvme_uninit_ctrl nvme_core -alias symbol:dm_table_run_md_queue_async dm_mod -alias symbol:nvme_fc_set_remoteport_devloss nvme_fc -alias symbol:scsi_remove_host scsi_mod -alias symbol:scsi_target_block scsi_mod -alias symbol:dm_unregister_path_selector dm_service_time -alias symbol:scsi_host_get scsi_mod -alias symbol:nvme_complete_rq nvme_core -alias symbol:fc_vport_create scsi_transport_fc -alias symbol:scsi_print_sense_hdr scsi_mod -alias symbol:target_backend_unregister target_core_mod -alias symbol:enclosure_remove_device enclosure -alias symbol:fc_attach_transport scsi_transport_fc -alias symbol:raid_class_attach raid_class -alias symbol:register_cdrom cdrom -alias symbol:scsi_mode_sense scsi_mod -alias symbol:target_execute_cmd target_core_mod -alias symbol:scsi_dh_attach scsi_mod -alias symbol:__scsi_iterate_devices scsi_mod -alias symbol:config_group_init configfs +alias symbol:scsi_target_block_mangled scsi_mod +alias symbol:scsi_remove_host_mangled scsi_mod +alias symbol:t10_pi_type1_crc_mangled t10_pi +alias symbol:scsi_dh_attach_mangled scsi_mod +alias symbol:nvme_fc_set_remoteport_devloss_mangled nvme_fc +alias symbol:target_backend_unregister_mangled target_core_mod +alias symbol:scsi_host_get_mangled scsi_mod +alias symbol:__scsi_iterate_devices_mangled scsi_mod +alias symbol:target_execute_cmd_mangled target_core_mod +alias symbol:fc_attach_transport_mangled scsi_transport_fc +alias symbol:register_cdrom_mangled cdrom +alias symbol:fc_vport_create_mangled scsi_transport_fc +alias symbol:scsi_print_sense_hdr_mangled scsi_mod +alias symbol:scsi_dma_map_mangled scsi_mod +alias symbol:scsi_is_sdev_device_mangled scsi_mod +alias symbol:nvme_complete_rq_mangled nvme_core +alias symbol:dm_unregister_path_selector_mangled dm_service_time +alias symbol:raid_class_attach_mangled raid_class +alias symbol:enclosure_remove_device_mangled enclosure +alias symbol:scsi_mode_sense_mangled scsi_mod +alias symbol:dm_table_run_md_queue_async_mangled dm_mod +alias symbol:nvmf_fail_nonready_command_mangled nvme_fabrics +alias symbol:nvme_uninit_ctrl_mangled nvme_core +alias symbol:config_group_init_mangled configfs diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols.bin index 308e699076f6e6a22f64e6aef45579c7c2a2559c..ecdd89e36793b013965b0825ba8e63f5565030f6 100644 GIT binary patch literal 1976 zcmdT_y^a$x5T48Zfdm|)f$~}^yuaC{qoSjP((>BlWOe(Kvz>_RD50f5lz9Lo5KoYn zf)}8nyB7da0<)VeciHF;kZ7>9ve%x^{${@M_}%{3Coq7mLx5}6&H-+nlv!Qe2ksUC z7S1*Le>(>_UBH%`!`AzAOB=&E3|^d{JcR8JbJ%%!2z!iMX>*=CG{PZQILjqkUW#f| zplUz^`nFr6vR3eeTH<+r6tf}JmCi?eWa{aJ=T+|du$!{A(6)uCOboS>5tJO% zxZe|5f!s_hUMhY(#VK-OPb%5pYDbm4JAde>o(@F_mBCSNi8`MMH|7=#l&&^?>=nXV zG>vE6%)OKo!1eW!z3qgO6J?!k3A=oObTf+?{Uxw>@DW*X5)@;$)8dw05gmiCorZsS%44l86#bl76lg$YJXhKNyOiD7F|zspDu7>y;KY{ zrWgwn5X5`Z=e}-BN{3Wg7}VDB5$WCYblp1gG4K*8!E#I4u&P{_W715iKzISv3Mr#1 zyKyhp&tU1$!xR~qymBkRSZ&mobr6O!^jYG=vYdNBf7LCc+|-y~4@#88ELBp#Q=)YDyaJ7ykx-MuUCFEDa|#6Q@K z3=traZpbgN$gt#qKR|A(XRb$g_y{bK(9&){>Z|IiuCHod-}v+xW^ix{@PoBGfVdWCgYJ8#>=@2Eji*#TaZLgk6bpha-& zJ-|Qg>pfXEgl64gtMPnIYeH$aoeCz7bc^A>B&Ilum4?pHS#8-xTuHY?OARU4o1k-( zbu1b0Il8)~(b+Ul^gBymAmkuShwQ5oVyd5`>ye?_H8g}yK~%aT0+&EF$bJ{N|UJM*RdZ zsntkLUC}(|Kaj+M{NaIN@cwPBQ8m(9ltZSx$VYd>$RHUKBl4u8oCq$+skG_a0RC~@ z`MS|_nWu|Pfv+^s?i7xG@vt!VaP*viZ^GWsy#G7w_i%i3JUh-V<|oUR5x)jRnEC9t zFPy$w!f92dWfoN+v6U;Y<^%fzqhwN2q@lMC&uF6ORaBLzs?6gYELzUyMd!HQBF*zW zE7KTyP0WPOPW-)UGc6Xm$f5<9x^p8CmwKx6t6;6;oRo-REbAqEd;RTmSrv1UNsxx4 z!LsSq)9aDhJW{17QxI|wCl5U6dmTGC*+#gk(QQ{GxNA%u_O=sVFfuq|GGrow;boxY zYB+fjLgw{5sh(1&aXoclFZ7hT<;K_awLUfMxy)jf#~J)iYR!#7wNnjVi!Zp&=Ouqo FJ_9K2yWju- diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.symbols b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.symbols index 8b841e82..c2a9a3f6 100644 --- a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.symbols +++ b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.symbols @@ -1,28 +1,28 @@ # Aliases for symbols, used by symbol_request(). -alias symbol:t10_pi_type1_crc t10_pi -alias symbol:nvmf_fail_nonready_command nvme_fabrics -alias symbol:scsi_dma_map scsi_mod -alias symbol:scsi_is_sdev_device scsi_mod -alias symbol:nvme_uninit_ctrl nvme_core -alias symbol:dm_table_run_md_queue_async dm_mod -alias symbol:nvme_fc_set_remoteport_devloss nvme_fc -alias symbol:scsi_remove_host scsi_mod -alias symbol:scsi_target_block scsi_mod -alias symbol:sas_enable_tlr scsi_transport_sas -alias symbol:dm_unregister_path_selector dm_service_time -alias symbol:scsi_host_get scsi_mod -alias symbol:nvme_complete_rq nvme_core -alias symbol:fc_vport_create scsi_transport_fc -alias symbol:scsi_print_sense_hdr scsi_mod -alias symbol:target_backend_unregister target_core_mod -alias symbol:enclosure_remove_device enclosure -alias symbol:fc_attach_transport scsi_transport_fc -alias symbol:scsi_is_sas_rphy scsi_transport_sas -alias symbol:raid_class_attach raid_class -alias symbol:register_cdrom cdrom -alias symbol:scsi_mode_sense scsi_mod -alias symbol:target_execute_cmd target_core_mod -alias symbol:scsi_dh_attach scsi_mod -alias symbol:qlt_stop_phase2 qla2xxx -alias symbol:__scsi_iterate_devices scsi_mod -alias symbol:config_group_init configfs +alias symbol:scsi_target_block_mangled scsi_mod +alias symbol:scsi_remove_host_mangled scsi_mod +alias symbol:t10_pi_type1_crc_mangled t10_pi +alias symbol:scsi_is_sas_rphy_mangled scsi_transport_sas +alias symbol:scsi_dh_attach_mangled scsi_mod +alias symbol:nvme_fc_set_remoteport_devloss_mangled nvme_fc +alias symbol:target_backend_unregister_mangled target_core_mod +alias symbol:scsi_host_get_mangled scsi_mod +alias symbol:__scsi_iterate_devices_mangled scsi_mod +alias symbol:target_execute_cmd_mangled target_core_mod +alias symbol:sas_enable_tlr_mangled scsi_transport_sas +alias symbol:fc_attach_transport_mangled scsi_transport_fc +alias symbol:register_cdrom_mangled cdrom +alias symbol:fc_vport_create_mangled scsi_transport_fc +alias symbol:scsi_print_sense_hdr_mangled scsi_mod +alias symbol:scsi_dma_map_mangled scsi_mod +alias symbol:scsi_is_sdev_device_mangled scsi_mod +alias symbol:nvme_complete_rq_mangled nvme_core +alias symbol:dm_unregister_path_selector_mangled dm_service_time +alias symbol:raid_class_attach_mangled raid_class +alias symbol:enclosure_remove_device_mangled enclosure +alias symbol:scsi_mode_sense_mangled scsi_mod +alias symbol:qlt_stop_phase2_mangled qla2xxx +alias symbol:dm_table_run_md_queue_async_mangled dm_mod +alias symbol:nvmf_fail_nonready_command_mangled nvme_fabrics +alias symbol:nvme_uninit_ctrl_mangled nvme_core +alias symbol:config_group_init_mangled configfs diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.symbols.bin index 55e6ca85aaa8767ad65f923019e5308c9ded32e6..f07cb998989543feac4d96725d6d2465ef3055da 100644 GIT binary patch literal 2175 zcmdT_%dQ+X5Uo4+i3krRAhDb^o4DWI`~ZtcEP+b@^ymhV*w9kTZg(BK>YS?b50}4v1v5CA1KhKA3vho^u9=#*>~e&2d6*J;q;F=oIRPt#qZooTkyi65e~V+ zbs^F6O4N%I)ebbH_pCRn8U?TENj=YxVwONt>tewdrdhSTs0%lReJpzmZF`u?MWU6A zpyJ?G9l)>T`$LhJ$jz$emEzYcTp<^BQ_JaASE}OU`H7!-Ius$)1{Z}T*Lf@4l3OfM zy2ebg?-ACb*+s@(QDN_muk%pGN) zgB?}>)QP%cg2eB%jRn)U9{wb%k6uX3&VmDM>_$CP_cn z3*@kmit?0HJId2pkKgkUBr0V}A=G_tN@vQyIZq3gVd(q7wJ1tnH2R9JO(BOAXSohU8YECUZe7#zb}20SQ{c&UDg2w8n_jLk&a))N1O#?)_TV<5^!=z% zT$X}D6+<>mguG|OXt5VR&LZYX*cXOWrlHC?Ea&_EYHzPYPe(puAS9jEcZn^Wy|f(b zzA{~TR8AL@w6kIeUh347GD(2?2`D#*^A8V$Isax0=Le0dgNuiw4bAy(PUF-4_+nXg zaQ^9NF^;tM^&NB^HmW3Nim@OCK@7B077lGG&qC^J3>xeBg0gMG*`amhW8kGyg5?&3 zB9DH$<=tz`O}pGox44VAglRfGL%{XE0Z);KhiAD`f$#!o6jEW-_NcrM?OB$1m>~mG z)RdP!V5yFDJp^GWL!YHS3|(=#qvfrXq@;hG#W4u8qc1NT`S|UKjG<0hq`(s$T>dx` z_t|omP~s9 literal 1959 zcmdT_IgcbY6n@ilf%XU%5F$Y%BEojvMZ_;aLP8?r$z{LlE^S>?cK1&I1rkycq|V3? zf`GJt1=@U(_ydF>c&-{3+rvzNM1q4V+wXh#;qNbh`y3WlM)zD;Yl!ZFgIkc+o%w}Mv)O1_#qUU`?o<4H1N+DDffkKd5w)a;D{4du57Vldt z)f(*}Thn*L9KN^5XwTPJs>zcer#R12a9C6WaiW|>F5(ZcV_!?oP3JHWx>%jWXA+p8ol5; z_U2UPVL;Zk!5h=NIZts4X{ufWy4RihA z5&qA2FYma0JTRiNjEZS@;LxvkUcp0wNedZgVO9cdZwH;{I95hUmc>OBK&Ocdw>5LS9pj=r%|yIRVW?WJ zBL~E_p7V1I);h>Yi2$Z4v}Skj*Ph5SPed$14jc|F>P|hs9~mc0Rfr-2ArElzhXegz z*B&lETw-6L-Ss4R$juMJTUI#2)I>|JrdWh9Mg|IQ$jgtt%e;Rf)pKe!ZsrHW5nata kwNo_RXqw-bM8<*2f*5W{ZFr8UW*!;$;&UELNx|>mUl@V(HUIzs diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.dep new file mode 100644 index 00000000..b9666a0c --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.dep @@ -0,0 +1,22 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/qla2xxx/qla2xxx.ko: kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/scsi/ses.ko: kernel/drivers/misc/enclosure.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/scsi_transport_sas.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/mpt3sas.ko: kernel/drivers/scsi/raid_class.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko: kernel/drivers/scsi/qla2xxx/qla2xxx.ko kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..e59a3545d60a92b4217e32a54f0eea876b5e812c GIT binary patch literal 3082 zcmdT`y^hmB5S}EL{8i-35J2qI6pylUj*IdX)^ zzxEoFFyV7ny1b&h3^=hph05|W6KC8l4{NAx$l{7}j7eQ)XKp|p61tpANONWcb7MYB zm~f=St;iyWi^y|;_$l;`F^4!T=sioS_zpC=vD{)$5-x0f8W9PttG);mGPT9&cr**- zdvJ;5eu=z~p!fBH1*A+wZ#%Q^X6QP(`Zbs}sI=%3q;IUYI#1k`fc9BIXv*O2Z}BPt3+q4dKk>slq_ z$drt=^55thx*{NK1%s0mhF?y{wT<+?a+Q%X=Kn_nD4;Biy9y&wD2N?DSQSE*k{+TqbDTB)#dq-1CN@5u>@) z=uRuP_9LtM<6sBUyt}ot;#Hx<-Z1jg;x=jJYAWEeo%N0U9=72P@<_iV6uW9C)frcr z+_9zCW4>IEL?=y`BI|mb+b@^ymhV*w9kTZg(BK>YS?b50}4v1v5CA1KhKA3vho^u9=#*>~e&2d6*J;q;F=oIRPt#qZooTkyi65e~V+ zbs^F6O4N%I)ebbH_pCRn8U?TENj=YxVwONt>tewdrdhSTs0%lReJpzmZF`u?MWU6A zpyJ?G9l)>T`$LhJ$jz$emEzYcTp<^BQ_JaASE}OU`H7!-Ius$)1{Z}T*Lf@4l3OfM zy2ebg?-ACb*+s@(QDN_muk%pGN) zgB?}>)QP%cg2eB%jRn)U9{wb%k6uX3&VmDM>_$CP_cn z3*@kmit?0HJId2pkKgkUBr0V}A=G_tN@vQyIZq3gVd(q7wJ1tnH2R9JO(BOAXSohU8YECUZe7#zb}20SQ{c&UDg2w8n_jM1<-S4;L0|`G4{j4m-;WB# zWhp3BF=WF;$a_YN7JKpIEMlI7ePKvt8mgSba=zcM_VzmTbmTJzLegn{m)OGDOUtqD zE7O%n<#aJgJ1d6ZrA|F5lLV-rfO2y<|L`!F^KZ6re$c2oxOh0)(46n)G(O#rFP2pY z=bw%i<49{?-$BP=qe^n77z7N{|PP+LQF%9;7`DtO#1); literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.alias b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.alias.bin b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.alias.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.dep new file mode 100644 index 00000000..b9666a0c --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.dep @@ -0,0 +1,22 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/qla2xxx/qla2xxx.ko: kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/scsi/ses.ko: kernel/drivers/misc/enclosure.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/scsi_transport_sas.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/mpt3sas.ko: kernel/drivers/scsi/raid_class.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko: kernel/drivers/scsi/qla2xxx/qla2xxx.ko kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..e59a3545d60a92b4217e32a54f0eea876b5e812c GIT binary patch literal 3082 zcmdT`y^hmB5S}EL{8i-35J2qI6pylUj*IdX)^ zzxEoFFyV7ny1b&h3^=hph05|W6KC8l4{NAx$l{7}j7eQ)XKp|p61tpANONWcb7MYB zm~f=St;iyWi^y|;_$l;`F^4!T=sioS_zpC=vD{)$5-x0f8W9PttG);mGPT9&cr**- zdvJ;5eu=z~p!fBH1*A+wZ#%Q^X6QP(`Zbs}sI=%3q;IUYI#1k`fc9BIXv*O2Z}BPt3+q4dKk>slq_ z$drt=^55thx*{NK1%s0mhF?y{wT<+?a+Q%X=Kn_nD4;Biy9y&wD2N?DSQSE*k{+TqbDTB)#dq-1CN@5u>@) z=uRuP_9LtM<6sBUyt}ot;#Hx<-Z1jg;x=jJYAWEeo%N0U9=72P@<_iV6uW9C)frcr z+_9zCW4>IEL?=y`BI|mb+b@^ymhV*w9kTZg(BK>YS?b50}4v1v5CA1KhKA3vho^u9=#*>~e&2d6*J;q;F=oIRPt#qZooTkyi65e~V+ zbs^F6O4N%I)ebbH_pCRn8U?TENj=YxVwONt>tewdrdhSTs0%lReJpzmZF`u?MWU6A zpyJ?G9l)>T`$LhJ$jz$emEzYcTp<^BQ_JaASE}OU`H7!-Ius$)1{Z}T*Lf@4l3OfM zy2ebg?-ACb*+s@(QDN_muk%pGN) zgB?}>)QP%cg2eB%jRn)U9{wb%k6uX3&VmDM>_$CP_cn z3*@kmit?0HJId2pkKgkUBr0V}A=G_tN@vQyIZq3gVd(q7wJ1tnH2R9JO(BOAXSohU8YECUZe7#zb}20SQ{c&UDg2w8n_jLk&a))N1O#?)_TV<5^!=z% zT$X}D6+<>mguG|OXt5VR&LZYX*cXOWrlHC?Ea&_EYHzPYPe(puAS9jEcZn^Wy|f(b zzA{~TR8AL@w6kIeUh347GD(2?2`D#*^A8V$Isax0=Le0dgNuiw4bAy(PUF-4_+nXg zaQ^9NF^;tM^&NB^HmW3Nim@OCK@7B077lGG&qC^J3>xeBg0gMG*`amhW8kGyg5?&3 zB9DH$<=tz`O}pGox44VAglRfGL%{XE0Z);KhiAD`f$#!o6jEW-_NcrM?OB$1m>~mG z)RdP!V5yFDJp^GWL!YHS3|(=#qvfrXq@;hG#W4u8qc1NT`S|UKjG<0hq`(s$T>dx` z_t|omP~s9 literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.weakdep b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.weakdep new file mode 100644 index 00000000..569696db --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.weakdep @@ -0,0 +1 @@ +# Weak dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/novers-correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/novers-correct-modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..5b5c759ee2a9146e8f926ea969431e562232cd08 GIT binary patch literal 2175 zcmdT_J&)5s5S`?b%OQ>r-GM}zn&v)A{s09MCD4sF>q%^#z3bauM~P@Dphs8xAAsnQ z+<@SZT#W=06*|UFtc%yO?oOg%rD)fidAl?3&CGrr{dx&~=#2q(t<3@UmdQlNPXJv3 zU}0nM_lF$dynvp|q4#Oyuhue${=0g!fUWOi*!nYu!Rs+>|3)iqgpng79AQB7NRq`w zs98)w3F`B2P#GmUfD0an>j7F#qZ!VO&Qgq2{Rdxx=>Oc@!vD50h|O2*n|hMk~9 z&ua?&Gj3CD*F;MMF)yHhucYc<4nFg_b3%sbj8Hb!rbX|AN|npMr?Tl=g^`9zVLd^w zg3c45DW}aDr^{Oe$#V72>+pE*QN6zD%-9z?Nn>K4%&G6zEj3RFr8b^MlJ#?yK#r=Y zI8Rx%R-X1Nyw8KGa#K1JU-v$oiYP{OXE4<*jpFrToFudOkX80zDVWUwMuzgV5@EXfC&+pgs zmoO<{__(&HXWo0&K}ScU63jsAv(RCyt-~2-o5xv)wM7deV2{3Scz0pZq~X#(;!5IZ zzHY!ivg2|c5Eq8Bt@7@$H<9AJtN>xq(zOG$>WX1W%k?M`rlfBYYk6`_#E~dq^tmSR zf1Gm|{W!!lLbpum2&HK~VEgWr-GM}zn&v)A{s09MCD4sF>q%^#z3bauM~P@Dphs8xAAsnQ z+<@SZT#W=06*|UFtc%yO?oOg%rD)fidAl?3&CGrr{dx&~=#2q(t<3@UmdQlNPXJv3 zU}0nM_lF$dynvp|q4#Oyuhue${=0g!fUWOi*!nYu!Rs+>|3)iqgpng79AQB7NRq`w zs98)w3F`B2P#GmUfD0an>j7F#qZ!VO&Qgq2{Rdxx=>Oc@!vD50h|O2*n|hMk~9 z&ua?&Gj3CD*F;MMF)yHhucYc<4nFg_b3%sbj8Hb!rbX|AN|npMr?Tl=g^`9zVLd^w zg3c45DW}aDr^{Oe$#V72>+pE*QN6zD%-9z?Nn>K4%&G6zEj3RFr8b^MlJ#?yK#r=Y zI8Rx%R-X1Nyw8KGa#K1JU-v$oiYP{OXE4<*jpFrToFudOkX80zDVWUwMuzgV5@EXfC&+pgs zmoO<{__(&HXWo0&K}ScU63jsAv(RCyt-~2-o5xv)wM7deV2{3Scz0pZq~X#(;!5IZ zzHY!ivg2|c5Eq8Bt@7@$H<9AJtN>xq(zOG$>WX1W%k?M`rlfBYYk6`_#E~dq^tmSR zf1Gm|{W!!lLbpum2&HK~VEgW Date: Fri, 15 Nov 2024 01:14:35 +0100 Subject: [PATCH 24/25] testsuite: add unit test for module overriding This test is like the "replace" test, but it uses depmods's built-in priority logic by copying the replacement modules into the "updates" subdirectory. "depmod -I -a" is expected to detect this change. Signed-off-by: Martin Wilck --- scripts/setup-rootfs.sh | 25 ++++++++++ .../lib/modules/5.3.18/correct-modules.dep | 22 +++++++++ .../modules/5.3.18/correct-modules.dep.bin | Bin 0 -> 3022 bytes .../modules/5.3.18/correct-modules.symbols | 28 +++++++++++ .../5.3.18/correct-modules.symbols.bin | Bin 0 -> 2175 bytes .../lib/modules/5.3.18/modules.alias | 1 + .../lib/modules/5.3.18/modules.alias.bin | Bin 0 -> 12 bytes .../lib/modules/5.3.18/modules.dep | 22 +++++++++ .../lib/modules/5.3.18/modules.dep.bin | Bin 0 -> 3082 bytes .../lib/modules/5.3.18/modules.devname | 0 .../lib/modules/5.3.18/modules.softdep | 1 + .../lib/modules/5.3.18/modules.symbols | 28 +++++++++++ .../lib/modules/5.3.18/modules.symbols.bin | Bin 0 -> 2175 bytes .../lib/modules/5.3.18/modules.weakdep | 1 + .../5.3.18/novers-correct-modules.symbols.bin | Bin 0 -> 2175 bytes .../modules/5.3.18/novers-modules.symbols.bin | Bin 0 -> 2175 bytes testsuite/test-depmod.c | 44 +++++++++++++++++- 17 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.dep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.symbols create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.alias create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.dep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.devname create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.weakdep create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/novers-correct-modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/novers-modules.symbols.bin diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh index 98bb9ef3..d3a31a22 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -225,6 +225,31 @@ map=( ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-mod.ko"]="ex-dm-mod.ko" ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/fs/configfs/configfs.ko"]="ex-configfs.ko" ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/symvers"]="symvers" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/block/t10-pi.ko"]="ex-t10-pi.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/cdrom/cdrom.ko"]="ex-cdrom.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_mod.ko"]="ex-scsi_mod.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_fc.ko"]="ex-scsi_transport_fc.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_sas.ko"]="ex-scsi_transport_sas.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sd_mod.ko"]="ex-sd_mod.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sr_mod.ko"]="ex-sr_mod.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/ses.ko"]="ex-ses.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/device_handler/scsi_dh_alua.ko"]="ex-scsi_dh_alua.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/raid_class.ko"]="ex-raid_class.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/mpt3sas.ko"]="ex-mpt3sas.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/qla2xxx.ko"]="ex-qla2xxx.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko"]="ex-tcm_qla2xxx.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/updates/qla2xxx.ko"]="other/ex-qla2xxx.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/updates/tcm_qla2xxx.ko"]="other/ex-tcm_qla2xxx.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fc.ko"]="ex-nvme-fc.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fabrics.ko"]="ex-nvme-fabrics.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-core.ko"]="ex-nvme-core.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/target/target_core_mod.ko"]="ex-target_core_mod.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/misc/enclosure.ko"]="ex-enclosure.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-multipath.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-service-time.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-mod.ko"]="ex-dm-mod.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/fs/configfs/configfs.ko"]="ex-configfs.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/symvers"]="symvers" ) gzip_array=( diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.dep new file mode 100644 index 00000000..361d1a9c --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.dep @@ -0,0 +1,22 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +updates/qla2xxx.ko: kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/scsi/ses.ko: kernel/drivers/misc/enclosure.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/scsi_transport_sas.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/mpt3sas.ko: kernel/drivers/scsi/raid_class.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +updates/tcm_qla2xxx.ko: updates/qla2xxx.ko kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..022bb53440778d5fa683e0a158a0b52ad34c1d8b GIT binary patch literal 3022 zcmdT`&5qMB5T3T%cDpQp3y2GcB5~nRvJ1C8afBCu3sUgf&Neh@g6&p)1RkRgzyXN^ z5)x8QJOei*9szOV0G=dHitDuH=Ypk8vYyZ1d@~-8`=^qTj&qX1JG^d4_psWGpcFiYrt8v7)g5k%m& zUUfysc;2+eWXd8gihjn5b*^n+3pc5H@t%tw@nwHJg{m1qAa#OnHA!!p*K1OWMvUfq zqdTkEwr^S83wt||7M*N6D~4^vUUBj=lNnQ>=J48CHg>y!tJc+Z@^fstYeHlDLNM&> z-s?>6*uGa|zUZSlHLfyjh#A zkIy+*KDM;gEMKy+tO&xq;#Hwn>!9IB8N`0s?v0QGa}6k3*>WN?UtbUQb~UOnzy=Y< eY)aAU=g!NcJ}h;)I)OG>b)VZ_YsP+b@^ymhV*w9kTZg(BK>YS?b50}4v1v5CA1KhKA3vho^u9=#*>~e&2d6*J;q;F=oIRPt#qZooTkyi65e~V+ zbs^F6O4N%I)ebbH_pCRn8U?TENj=YxVwONt>tewdrdhSTs0%lReJpzmZF`u?MWU6A zpyJ?G9l)>T`$LhJ$jz$emEzYcTp<^BQ_JaASE}OU`H7!-Ius$)1{Z}T*Lf@4l3OfM zy2ebg?-ACb*+s@(QDN_muk%pGN) zgB?}>)QP%cg2eB%jRn)U9{wb%k6uX3&VmDM>_$CP_cn z3*@kmit?0HJId2pkKgkUBr0V}A=G_tN@vQyIZq3gVd(q7wJ1tnH2R9JO(BOAXSohU8YECUZe7#zb}20SQ{c&UDg2w8n_jM1<-S4;L0|`G4{j4m-;WB# zWhp3BF=WF;$a_YN7JKpIEMlI7ePKvt8mgSba=zcM_VzmTbmTJzLegn{m)OGDOUtqD zE7O%n<#aJgJ1d6ZrA|F5lLV-rfO2y<|L`!F^KZ6re$c2oxOh0)(46n)G(O#rFP2pY z=bw%i<49{?-$BP=qe^n77z7N{|PP+LQF%9;7`DtO#1); literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.alias b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.alias.bin b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.alias.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.dep new file mode 100644 index 00000000..b9666a0c --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.dep @@ -0,0 +1,22 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/qla2xxx/qla2xxx.ko: kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/scsi/ses.ko: kernel/drivers/misc/enclosure.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/scsi_transport_sas.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/mpt3sas.ko: kernel/drivers/scsi/raid_class.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko: kernel/drivers/scsi/qla2xxx/qla2xxx.ko kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..e59a3545d60a92b4217e32a54f0eea876b5e812c GIT binary patch literal 3082 zcmdT`y^hmB5S}EL{8i-35J2qI6pylUj*IdX)^ zzxEoFFyV7ny1b&h3^=hph05|W6KC8l4{NAx$l{7}j7eQ)XKp|p61tpANONWcb7MYB zm~f=St;iyWi^y|;_$l;`F^4!T=sioS_zpC=vD{)$5-x0f8W9PttG);mGPT9&cr**- zdvJ;5eu=z~p!fBH1*A+wZ#%Q^X6QP(`Zbs}sI=%3q;IUYI#1k`fc9BIXv*O2Z}BPt3+q4dKk>slq_ z$drt=^55thx*{NK1%s0mhF?y{wT<+?a+Q%X=Kn_nD4;Biy9y&wD2N?DSQSE*k{+TqbDTB)#dq-1CN@5u>@) z=uRuP_9LtM<6sBUyt}ot;#Hx<-Z1jg;x=jJYAWEeo%N0U9=72P@<_iV6uW9C)frcr z+_9zCW4>IEL?=y`BI|mb+b@^ymhV*w9kTZg(BK>YS?b50}4v1v5CA1KhKA3vho^u9=#*>~e&2d6*J;q;F=oIRPt#qZooTkyi65e~V+ zbs^F6O4N%I)ebbH_pCRn8U?TENj=YxVwONt>tewdrdhSTs0%lReJpzmZF`u?MWU6A zpyJ?G9l)>T`$LhJ$jz$emEzYcTp<^BQ_JaASE}OU`H7!-Ius$)1{Z}T*Lf@4l3OfM zy2ebg?-ACb*+s@(QDN_muk%pGN) zgB?}>)QP%cg2eB%jRn)U9{wb%k6uX3&VmDM>_$CP_cn z3*@kmit?0HJId2pkKgkUBr0V}A=G_tN@vQyIZq3gVd(q7wJ1tnH2R9JO(BOAXSohU8YECUZe7#zb}20SQ{c&UDg2w8n_jLk&a))N1O#?)_TV<5^!=z% zT$X}D6+<>mguG|OXt5VR&LZYX*cXOWrlHC?Ea&_EYHzPYPe(puAS9jEcZn^Wy|f(b zzA{~TR8AL@w6kIeUh347GD(2?2`D#*^A8V$Isax0=Le0dgNuiw4bAy(PUF-4_+nXg zaQ^9NF^;tM^&NB^HmW3Nim@OCK@7B077lGG&qC^J3>xeBg0gMG*`amhW8kGyg5?&3 zB9DH$<=tz`O}pGox44VAglRfGL%{XE0Z);KhiAD`f$#!o6jEW-_NcrM?OB$1m>~mG z)RdP!V5yFDJp^GWL!YHS3|(=#qvfrXq@;hG#W4u8qc1NT`S|UKjG<0hq`(s$T>dx` z_t|omP~s9 literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.weakdep b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.weakdep new file mode 100644 index 00000000..569696db --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.weakdep @@ -0,0 +1 @@ +# Weak dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/novers-correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/novers-correct-modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..5b5c759ee2a9146e8f926ea969431e562232cd08 GIT binary patch literal 2175 zcmdT_J&)5s5S`?b%OQ>r-GM}zn&v)A{s09MCD4sF>q%^#z3bauM~P@Dphs8xAAsnQ z+<@SZT#W=06*|UFtc%yO?oOg%rD)fidAl?3&CGrr{dx&~=#2q(t<3@UmdQlNPXJv3 zU}0nM_lF$dynvp|q4#Oyuhue${=0g!fUWOi*!nYu!Rs+>|3)iqgpng79AQB7NRq`w zs98)w3F`B2P#GmUfD0an>j7F#qZ!VO&Qgq2{Rdxx=>Oc@!vD50h|O2*n|hMk~9 z&ua?&Gj3CD*F;MMF)yHhucYc<4nFg_b3%sbj8Hb!rbX|AN|npMr?Tl=g^`9zVLd^w zg3c45DW}aDr^{Oe$#V72>+pE*QN6zD%-9z?Nn>K4%&G6zEj3RFr8b^MlJ#?yK#r=Y zI8Rx%R-X1Nyw8KGa#K1JU-v$oiYP{OXE4<*jpFrToFudOkX80zDVWUwMuzgV5@EXfC&+pgs zmoO<{__(&HXWo0&K}ScU63jsAv(RCyt-~2-o5xv)wM7deV2{3Scz0pZq~X#(;!5IZ zzHY!ivg2|c5Eq8Bt@7@$H<9AJtN>xq(zOG$>WX1W%k?M`rlfBYYk6`_#E~dq^tmSR zf1Gm|{W!!lLbpum2&HK~VEgWr-GM}zn&v)A{s09MCD4sF>q%^#z3bauM~P@Dphs8xAAsnQ z+<@SZT#W=06*|UFtc%yO?oOg%rD)fidAl?3&CGrr{dx&~=#2q(t<3@UmdQlNPXJv3 zU}0nM_lF$dynvp|q4#Oyuhue${=0g!fUWOi*!nYu!Rs+>|3)iqgpng79AQB7NRq`w zs98)w3F`B2P#GmUfD0an>j7F#qZ!VO&Qgq2{Rdxx=>Oc@!vD50h|O2*n|hMk~9 z&ua?&Gj3CD*F;MMF)yHhucYc<4nFg_b3%sbj8Hb!rbX|AN|npMr?Tl=g^`9zVLd^w zg3c45DW}aDr^{Oe$#V72>+pE*QN6zD%-9z?Nn>K4%&G6zEj3RFr8b^MlJ#?yK#r=Y zI8Rx%R-X1Nyw8KGa#K1JU-v$oiYP{OXE4<*jpFrToFudOkX80zDVWUwMuzgV5@EXfC&+pgs zmoO<{__(&HXWo0&K}ScU63jsAv(RCyt-~2-o5xv)wM7deV2{3Scz0pZq~X#(;!5IZ zzHY!ivg2|c5Eq8Bt@7@$H<9AJtN>xq(zOG$>WX1W%k?M`rlfBYYk6`_#E~dq^tmSR zf1Gm|{W!!lLbpum2&HK~VEgW Date: Fri, 29 Jul 2022 22:46:37 +0200 Subject: [PATCH 25/25] testsuite: add generic test script for incremental depmod Add a test script to test incremental depmod on a real kernel, as an addition to the normal kmod CI. This script is meant to be run against the installed kernel on a test system. This test script compares the results (i.e. the modules.* files generated by depmod) of incremental depmod with a full depmod run. The expectation is that the results are always identical. The script takes a list of module basenames as arguments, the "test modules", like this: test-incremental.sh scsi_mod drm_display_helper 1. The script looks for a kernel module tree in the system it's running on and copies this tree to the working directory, and runs a full depmod there. 2. It copies the entire tree again, deletes the test modules and all modules depending on them, and runs full depmod once more. 3. It copies the tree created in 2., re-adds the previously deleted modules, and runs "depmod --incremental" with the added modules as arguments, and compares the results with those from step 1. 4. It copies the tree created in 2., re-adds the previously deleted modules, runs "depmod --incremental --all", and compares the results with those from step 1. 5. It copies the tree created in 2, runs "depmod --incremental --all", and compares the results with those from step 2. If any differences are found in step 3., 4., or 5., the script will report them. By default, all operations are done below a temporary directory under /tmp, so no changes are made to the system. The autodetected parameters should work on most systems. Otherwise, the script has various options to override them. Signed-off-by: Martin Wilck --- testsuite/test-incremental.sh | 305 ++++++++++++++++++++++++++++++++++ 1 file changed, 305 insertions(+) create mode 100755 testsuite/test-incremental.sh diff --git a/testsuite/test-incremental.sh b/testsuite/test-incremental.sh new file mode 100755 index 00000000..0b5c33c8 --- /dev/null +++ b/testsuite/test-incremental.sh @@ -0,0 +1,305 @@ +#! /bin/bash +export TIMEFORMAT="elapsed time: %2Rs (%2U user / %2S system)" +export LC_ALL=C + +set -e -E +trap 'echo $ME: error in $BASH_COMMAND >&2; exit 1' ERR + +CLEANUP=: +trap 'trap - ERR; eval "$CLEANUP"' 0 + +ME=${0##*/} +BASEDIR= +OUTPUTDIR= +KVER= +SYMVERS= +FILESYMS= +DEPMOD= +KEEP= +ERR=0 +: "${DEPMOD_OPTS:=}" + +usage() { + cat <&2 + return + } + kernel=${kernel%/*} + kernel=${kernel##*/} + echo "$ME: found kernel $kernel" >&2 + echo "$kernel" +} + +find_symvers() { + local symvers + + symvers=$(find_glob "$BASEDIR/boot/symvers-$1*") + [[ ! "$symvers" ]] || echo "$symvers" +} + +find_filesyms() { + local fsyms + + fsyms=$(find_glob "$BASEDIR/boot/System.map-$1*") + [[ ! "$fsyms" ]] || echo "$fsyms" +} + +[[ ! "$BASEDIR" ]] || BASEDIR=$(cd "$BASEDIR" && echo "$PWD") + +[[ "$DEPMOD" ]] || { + for _x in "${0%/*}/../depmod" "${0%/*}/../tools/depmod" \ + /usr/local/sbin/depmod /sbin/depmod /usr/sbin/depmod; do + [[ -f "$_x" && -x "$_x" ]] && { + DEPMOD=$_x + break + } + done +} + +[[ "$DEPMOD" && -f "$DEPMOD" && -x "$DEPMOD" ]] +echo "$ME: using DEPMOD=$DEPMOD" >&2 +if [[ "$OUTPUTDIR" ]]; then + [[ -d "$OUTPUTDIR" ]] || { + mkdir -p "$OUTPUTDIR" + # shellcheck disable=SC2016 + [[ "$KEEP" ]] || CLEANUP='rm -rf "$OUTPUTDIR";'"$CLEANUP" + } +else + OUTPUTDIR=$(mktemp -d "${TMPDIR:-/tmp}/$ME.XXXXXX") + [[ "$OUTPUTDIR" ]] + # shellcheck disable=SC2016 + [[ "$KEEP" ]] || CLEANUP='rm -rf "$OUTPUTDIR";'"$CLEANUP" +fi + +OUTPUTDIR=$(cd "$OUTPUTDIR" && echo "$PWD") + +[[ "$KVER" ]] || KVER=$(find_installed_kernel) +[[ "$KVER" && -d "$BASEDIR/lib/modules/$KVER" ]] + +[[ "$SYMVERS" ]] || SYMVERS=$(find_symvers "$KVER") +[[ "$FILESYMS" ]] || FILESYMS=$(find_filesyms "$KVER") + +[[ ("$SYMVERS" && -f "$SYMVERS") || ("$FILESYMS" && -f "$FILESYMS") ]] + +# depmod can't handle compressed symvers +case $SYMVERS in + *.gz) + gzip -dc "$SYMVERS" >"${TMPDIR:-/tmp}/symvers-$KVER" + SYMVERS="${TMPDIR:-/tmp}/symvers-$KVER" + # shellcheck disable=SC2016 + CLEANUP='rm -f "$SYMVERS";'"$CLEANUP" + ;; +esac + +[[ ! "$SYMVERS" ]] || FILESYMS= +echo "$ME: symbols resolved with ${SYMVERS:+-E "$SYMVERS"}${FILESYMS:+-F "$FILESYMS"}" >&2 + +[[ "${#MODULES[@]}" -gt 0 ]] || { + echo "$ME: reading modules from stdin ..." >&2 + mapfile -t MODULES < <(sed -E 's/\s+/\n/g') +} +[[ "${#MODULES[@]}" -gt 0 ]] + +find_module() { + local f + f=$(cd "$2" && find . -name "$1.ko*" -type f -print -quit) + echo "${f#./}" +} + +copy_results_to() { + rm -rf "${OUTPUTDIR:?}/$1" + mkdir -p "$OUTPUTDIR/$1" + cp -a "$WORKDIR/lib/modules/$KVER/modules".* "$OUTPUTDIR/$1" +} + +restore_results_from() { + cp -a "$OUTPUTDIR/$1/"* "$WORKDIR/lib/modules/$KVER/" +} + +delete_modules() { + pushd "$WORKDIR/lib/modules/$KVER" &>/dev/null + rm -f "${!EXTRAMODS[@]}" + popd &>/dev/null +} + +restore_deleted_modules() { + pushd "$CLONEDIR/lib/modules/$KVER" &>/dev/null + echo "${!EXTRAMODS[@]}" | sed -E 's/\s+/\n/g' | \ + cpio -p --link "$WORKDIR/lib/modules/$KVER" 2>/dev/null + popd &>/dev/null +} + +check_results_for() { + local ref + ref=${2:-reference} + if diff -ruq "$OUTPUTDIR/$ref" "$OUTPUTDIR/$1"; then + echo "$ME: $1: OK" >&2 + else + echo "$ME: depmod output for in $OUTPUTDIR/$1 differs from $OUTPUTDIR/$ref" >&2 + : $((ERR++)) + fi +} + +# MODPATHS holds the full module paths relative to the module directory, +# this is the same format as in modules.dep +# REGEX will be used to grep modules.dep for any of these paths occurring +# in the dependency list of some module (DEPENDS below). +MODPATHS=() +for x in "${!MODULES[@]}"; do + [[ "$x" ]] || continue + mp=$(find_module "${MODULES[$x]}" "$BASEDIR/lib/modules/$KVER") + if [[ "$mp" ]]; then + MODPATHS["$x"]=$mp + REGEX="$REGEX|${mp//./\\.}" + else + echo "$ME: module ${MODULES[$x]} not found" >&2 + fi +done +REGEX=${REGEX#|} + +# First, clone the module directory +CLONEDIR=$OUTPUTDIR/clone +[[ -f "$CLONEDIR/lib/modules/$KVER/modules.dep" ]] || { + rm -rf "$CLONEDIR/lib/modules" + mkdir -p "$CLONEDIR/lib/modules" + cp -r "$BASEDIR/lib/modules/$KVER" "$CLONEDIR/lib/modules" + + echo "$ME: running depmod over entire tree" + time "$DEPMOD" $DEPMOD_OPTS -b "$CLONEDIR" -e ${SYMVERS:+-E "$SYMVERS"} ${FILESYMS:+-F "$FILESYMS"} "$KVER" +} + +# With modules.dep in place, find all modules that depend on MODULES. +mapfile -t DEPENDS < <(sed -nE 's,:.*\<('"$REGEX"')\>.*$,,p' "$CLONEDIR/lib/modules/$KVER/modules.dep") + +# EXTRAMODS holds the paths for MODULES and all their dependencies +# use associative array to avoid duplicates +declare -A EXTRAMODS +for x in "${MODPATHS[@]}" "${DEPENDS[@]}"; do + EXTRAMODS["$x"]=1 +done + +# Copy clone work dir and save the depmod results in "reference" dir +WORKDIR=$OUTPUTDIR/work +rm -rf "$WORKDIR/lib/modules" +mkdir -p "$WORKDIR/lib/modules" +cp -rl "$CLONEDIR/lib/modules/$KVER" "$WORKDIR/lib/modules/$KVER" +copy_results_to reference + +# Delete EXTRAMODS, and run depmod again (pretend system state before adding EXTRAMODS) +# Save results in "orig" +delete_modules +echo "$ME: running full depmod after module removal" +time "$DEPMOD" $DEPMOD_OPTS -b "$WORKDIR" -e ${SYMVERS:+-E "$SYMVERS"} ${FILESYMS:+-F "$FILESYMS"} "$KVER" +copy_results_to orig + +# 1. Restore deleted modules, and run depmod --incremental +# Save results in "incremental", and compare to "reference" +restore_deleted_modules +echo "$ME: running depmod --incremental (${#EXTRAMODS[@]} modules added)" +time "$DEPMOD" $DEPMOD_OPTS -b "$WORKDIR" -I -e ${SYMVERS:+-E "$SYMVERS"} ${FILESYMS:+-F "$FILESYMS"} "$KVER" "${!EXTRAMODS[@]}" +copy_results_to incremental +check_results_for incremental + +# 2. Same thing, but with depmod --incremental --all +# Save results in "incremental-all", and compare to "reference" +restore_results_from orig +echo "$ME: running depmod --incremental --all" +time "$DEPMOD" $DEPMOD_OPTS -b "$WORKDIR" -I -a -e ${SYMVERS:+-E "$SYMVERS"} ${FILESYMS:+-F "$FILESYMS"} "$KVER" +copy_results_to incremental-all +check_results_for incremental-all + +# 3. Delete modules again, and test depmod --incremental --all for removal +# Save results in "deleted", and compare to "orig" +delete_modules +echo "$ME: running depmod --incremental --all after module removal" +# this will spit out lots of "module xyz not found" error messages +time "$DEPMOD" $DEPMOD_OPTS -b "$WORKDIR" -I -a -e ${SYMVERS:+-E "$SYMVERS"} ${FILESYMS:+-F "$FILESYMS"} "$KVER" 2>/dev/null +copy_results_to deleted +check_results_for deleted orig + +exit "$ERR"