:: commit 80caf7111798245d8fca377c60576817301800d8

Mintsuki <mintsuki@protonmail.com> — 2025-05-07 00:48

parents: f3261b78d0

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__)
tab: 248 wrap: offon