commit 43732809b16af59e494a1055dd4dbe982122ca80 Author: Andriy Gapon Date: Wed Dec 19 23:27:46 2012 +0200 [wip][experiment] kernel linker: register kernel modules before preloaded modules... Also, skip adding sysinit and sysctl stuff from preloaded modules if module registration fails. This should result in much saner behavior if a module is present in both the kernel and a preloaded file. Perhaps, the original intent was to allow the preloaded files to override modules present in kernel, but that was extremly fragile because of double sysinit registration. diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c index b3ab4df..10008ab 100644 --- a/sys/kern/kern_linker.c +++ b/sys/kern/kern_linker.c @@ -365,6 +365,7 @@ linker_file_register_modules(linker_file_t lf) return (first_error); } +#if 0 static void linker_init_kernel_modules(void) { @@ -374,6 +375,7 @@ linker_init_kernel_modules(void) SYSINIT(linker_kernel, SI_SUB_KLD, SI_ORDER_ANY, linker_init_kernel_modules, 0); +#endif static int linker_load_file(const char *filename, linker_file_t *result) @@ -1599,7 +1601,11 @@ restart: printf("KLD file %s is missing dependencies\n", lf->filename); linker_file_unload(lf, LINKER_UNLOAD_FORCE); } - +#if 1 + error = linker_file_register_modules(linker_kernel_file); + if (error) + printf("linker_file_register_modules(linker_kernel_file) failed: %d\n", error); +#endif /* * We made it. Finish off the linking in the order we determined. */ @@ -1648,7 +1654,12 @@ restart: lf->filename); goto fail; } - linker_file_register_modules(lf); + error = linker_file_register_modules(lf); + if (error) { + printf("KLD file %s - failed to register modules: %d\n", + lf->filename, error); + goto fail; + } if (linker_file_lookup_set(lf, "sysinit_set", &si_start, &si_stop, NULL) == 0) sysinit_add(si_start, si_stop);