Commit 325eba05 authored by Masahiro Yamada's avatar Masahiro Yamada

modpost: traverse modules in order

Currently, modpost manages modules in a singly linked list; it adds
a new node to the head, and traverses the list from new to old.

It works, but the error messages are shown in the reverse order.

If you have a Makefile like this:

  obj-m += foo.o bar.o

then, modpost shows error messages in bar.o, foo.o, in this order.

Use a doubly linked list to keep the order in modules.order; use
list_add_tail() for the node addition and list_for_each_entry() for
the list traverse.

Now that the kernel's list macros have been imported to modpost, I will
use them actively going forward.
Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
parent 97aa4aef
...@@ -165,16 +165,17 @@ char *get_line(char **stringp) ...@@ -165,16 +165,17 @@ char *get_line(char **stringp)
} }
/* A list of all modules we processed */ /* A list of all modules we processed */
static struct module *modules; LIST_HEAD(modules);
static struct module *find_module(const char *modname) static struct module *find_module(const char *modname)
{ {
struct module *mod; struct module *mod;
for (mod = modules; mod; mod = mod->next) list_for_each_entry(mod, &modules, list) {
if (strcmp(mod->name, modname) == 0) if (strcmp(mod->name, modname) == 0)
break;
return mod; return mod;
}
return NULL;
} }
static struct module *new_module(const char *modname) static struct module *new_module(const char *modname)
...@@ -184,7 +185,6 @@ static struct module *new_module(const char *modname) ...@@ -184,7 +185,6 @@ static struct module *new_module(const char *modname)
mod = NOFAIL(malloc(sizeof(*mod) + strlen(modname) + 1)); mod = NOFAIL(malloc(sizeof(*mod) + strlen(modname) + 1));
memset(mod, 0, sizeof(*mod)); memset(mod, 0, sizeof(*mod));
/* add to list */
strcpy(mod->name, modname); strcpy(mod->name, modname);
mod->is_vmlinux = (strcmp(modname, "vmlinux") == 0); mod->is_vmlinux = (strcmp(modname, "vmlinux") == 0);
...@@ -195,8 +195,7 @@ static struct module *new_module(const char *modname) ...@@ -195,8 +195,7 @@ static struct module *new_module(const char *modname)
*/ */
mod->is_gpl_compatible = true; mod->is_gpl_compatible = true;
mod->next = modules; list_add_tail(&mod->list, &modules);
modules = mod;
return mod; return mod;
} }
...@@ -2477,7 +2476,7 @@ static void write_namespace_deps_files(const char *fname) ...@@ -2477,7 +2476,7 @@ static void write_namespace_deps_files(const char *fname)
struct namespace_list *ns; struct namespace_list *ns;
struct buffer ns_deps_buf = {}; struct buffer ns_deps_buf = {};
for (mod = modules; mod; mod = mod->next) { list_for_each_entry(mod, &modules, list) {
if (mod->from_dump || !mod->missing_namespaces) if (mod->from_dump || !mod->missing_namespaces)
continue; continue;
...@@ -2568,7 +2567,7 @@ int main(int argc, char **argv) ...@@ -2568,7 +2567,7 @@ int main(int argc, char **argv)
if (files_source) if (files_source)
read_symbols_from_files(files_source); read_symbols_from_files(files_source);
for (mod = modules; mod; mod = mod->next) { list_for_each_entry(mod, &modules, list) {
char fname[PATH_MAX]; char fname[PATH_MAX];
int ret; int ret;
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <unistd.h> #include <unistd.h>
#include <elf.h> #include <elf.h>
#include "list.h"
#include "elfconfig.h" #include "elfconfig.h"
/* On BSD-alike OSes elf.h defines these according to host's word size */ /* On BSD-alike OSes elf.h defines these according to host's word size */
...@@ -111,7 +112,7 @@ void ...@@ -111,7 +112,7 @@ void
buf_write(struct buffer *buf, const char *s, int len); buf_write(struct buffer *buf, const char *s, int len);
struct module { struct module {
struct module *next; struct list_head list;
bool is_gpl_compatible; bool is_gpl_compatible;
struct symbol *unres; struct symbol *unres;
bool from_dump; /* true if module was loaded from *.symvers */ bool from_dump; /* true if module was loaded from *.symvers */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment