protos/linux: Improve performance of module loading
diff --git a/common/protos/linux.c b/common/protos/linux.c
index 05398681..a059b401 100644
--- a/common/protos/linux.c
+++ b/common/protos/linux.c
@@ -387,18 +387,29 @@ noreturn void linux_load(char *config, char *cmdline) {
///////////////////////////////////////
size_t size_of_all_modules = 0;
+ size_t module_count;
+ for (module_count = 0; ; module_count++) {
+ char *module_path = config_get_value(config, module_count, "MODULE_PATH");
+ if (module_path == NULL)
+ break;
+ }
+
+ struct file_handle **modules = ext_mem_alloc(module_count * sizeof(struct file_handle *));
+
for (size_t i = 0; ; i++) {
char *module_path = config_get_value(config, i, "MODULE_PATH");
if (module_path == NULL)
break;
+ print("linux: Loading module `%#`...\n", module_path);
+
struct file_handle *module;
if ((module = uri_open(module_path)) == NULL)
panic(true, "linux: Failed to open module with path `%s`. Is the path correct?", module_path);
size_of_all_modules += module->size;
- fclose(module);
+ modules[i] = module;
}
uintptr_t modules_mem_base;
@@ -443,20 +454,15 @@ noreturn void linux_load(char *config, char *cmdline) {
if (module_path == NULL)
break;
- print("linux: Loading module `%#`...\n", module_path);
-
- struct file_handle *module;
+ fread(modules[i], (void *)_modules_mem_base, 0, modules[i]->size);
- if ((module = uri_open(module_path)) == NULL)
- panic(true, "linux: Could not open `%#`", module_path);
+ _modules_mem_base += modules[i]->size;
- fread(module, (void *)_modules_mem_base, 0, module->size);
-
- _modules_mem_base += module->size;
-
- fclose(module);
+ fclose(modules[i]);
}
+ pmm_free(modules, module_count * sizeof(struct file_handle *));
+
if (size_of_all_modules != 0) {
setup_header->ramdisk_image = (uint32_t)modules_mem_base;
#if defined (UEFI) && defined (__x86_64__)
