[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH-4.16 v2] xen/efi: Fix Grub2 boot on arm64
> On 9 Nov 2021, at 21:52, Stefano Stabellini <sstabellini@xxxxxxxxxx> wrote: > > On Tue, 9 Nov 2021, Jan Beulich wrote: >> On 09.11.2021 03:11, Stefano Stabellini wrote: >>> On Mon, 8 Nov 2021, Jan Beulich wrote: >>>> On 05.11.2021 16:33, Stefano Stabellini wrote: >>>>> My main concern is performance and resource utilization. With v3 of the >>>>> patch get_parent_handle will get called for every module to be loaded. >>>>> With dom0less, it could easily get called 10 times or more. Taking a >>>>> look at get_parent_handle, the Xen side doesn't seem small and I have >>>>> no idea how the EDK2 side looks. I am just worried that it would >>>>> actually have an impact on boot times (also depending on the bootloader >>>>> implementation). >>>> >>>> The biggest part of the function deals with determining the "residual" of >>>> the file name. That part looks to be of no interest at all to >>>> allocate_module_file() (whether that's actually correct I can't tell). I >>>> don't see why this couldn't be made conditional (e.g. by passing in NULL >>>> for "leaf"). >>> >>> I understand the idea of passing NULL instead of "leaf", but I tried >>> having a look and I can't tell what we would be able to skip in >>> get_parent_handle. >> >> My bad - I did overlook that dir_handle gets updated even past the >> initial loop. >> >>> Should we have a global variable to keep the dir_handle open during >>> dom0less module loading? >> >> If that's contained within Arm-specific code, I (obviously) don't mind. >> Otherwise I remain to be convinced. > > I think we can do something decent entirely within > xen/arch/arm/efi/efi-boot.h. > > Luca, see below as reference; it is untested and incomplete but should > explain the idea better than words. With the below, we only open/close > the handle once for the all dom0less modules. > > > diff --git a/xen/arch/arm/efi/efi-boot.h b/xen/arch/arm/efi/efi-boot.h > index 458cfbbed4..b5218d5228 100644 > --- a/xen/arch/arm/efi/efi-boot.h > +++ b/xen/arch/arm/efi/efi-boot.h > @@ -24,6 +24,7 @@ static struct file __initdata module_binary; > static module_name __initdata modules[MAX_UEFI_MODULES]; > static unsigned int __initdata modules_available = MAX_UEFI_MODULES; > static unsigned int __initdata modules_idx; > +static EFI_FILE_HANDLE __initdata dir_handle; > > #define ERROR_BINARY_FILE_NOT_FOUND (-1) > #define ERROR_ALLOC_MODULE_NO_SPACE (-1) > @@ -651,9 +652,7 @@ static int __init allocate_module_file(EFI_LOADED_IMAGE > *loaded_image, > const char *name, > unsigned int name_len) > { > - EFI_FILE_HANDLE dir_handle; > module_name *file_name; > - CHAR16 *fname; > union string module_name; > int ret; > > @@ -685,14 +684,9 @@ static int __init allocate_module_file(EFI_LOADED_IMAGE > *loaded_image, > strlcpy(file_name->name, name, name_len + 1); > file_name->name_len = name_len; > > - /* Get the file system interface. */ > - dir_handle = get_parent_handle(loaded_image, &fname); > - > /* Load the binary in memory */ > read_file(dir_handle, s2w(&module_name), &module_binary, NULL); > > - dir_handle->Close(dir_handle); > - > /* Save address and size */ > file_name->addr = module_binary.addr; > file_name->size = module_binary.size; > @@ -862,6 +856,7 @@ static int __init efi_check_dt_boot(EFI_LOADED_IMAGE > *loaded_image) > { > int chosen, node, addr_len, size_len; > unsigned int i = 0, modules_found = 0; > + CHAR16 *fname; > > /* Check for the chosen node in the current DTB */ > chosen = setup_chosen_node(fdt, &addr_len, &size_len); > @@ -871,6 +866,8 @@ static int __init efi_check_dt_boot(EFI_LOADED_IMAGE > *loaded_image) > return ERROR_DT_CHOSEN_NODE; > } > > + dir_handle = get_parent_handle(loaded_image, &fname); > + > /* Check for nodes compatible with xen,domain under the chosen node */ > for ( node = fdt_first_subnode(fdt, chosen); > node > 0; > @@ -902,6 +899,8 @@ static int __init efi_check_dt_boot(EFI_LOADED_IMAGE > *loaded_image) > efi_bs->FreePool(modules[i].name); > } > > + if ( dir_handle ) > + dir_handle->Close(dir_handle); > return modules_found; > } > Hi Stefano, I thought having the EFI_FILE_HANDLE global in efi-boot.h was a “no go”, but if it’s not then instead of calling get_parent_handle in efi_check_dt_boot (that is the main issue with EDK2+Grub2), we can do something like this: diff --git a/xen/arch/arm/efi/efi-boot.h b/xen/arch/arm/efi/efi-boot.h index 458cfbbed4..169bbfc215 100644 --- a/xen/arch/arm/efi/efi-boot.h +++ b/xen/arch/arm/efi/efi-boot.h @@ -24,6 +24,7 @@ static struct file __initdata module_binary; static module_name __initdata modules[MAX_UEFI_MODULES]; static unsigned int __initdata modules_available = MAX_UEFI_MODULES; static unsigned int __initdata modules_idx; +static EFI_FILE_HANDLE __initdata fs_dir_handle; #define ERROR_BINARY_FILE_NOT_FOUND (-1) #define ERROR_ALLOC_MODULE_NO_SPACE (-1) @@ -651,7 +652,6 @@ static int __init allocate_module_file(EFI_LOADED_IMAGE *loaded_image, const char *name, unsigned int name_len) { - EFI_FILE_HANDLE dir_handle; module_name *file_name; CHAR16 *fname; union string module_name; @@ -686,12 +686,11 @@ static int __init allocate_module_file(EFI_LOADED_IMAGE *loaded_image, file_name->name_len = name_len; /* Get the file system interface. */ - dir_handle = get_parent_handle(loaded_image, &fname); + if ( !fs_dir_handle ) + fs_dir_handle = get_parent_handle(loaded_image, &fname); /* Load the binary in memory */ - read_file(dir_handle, s2w(&module_name), &module_binary, NULL); - - dir_handle->Close(dir_handle); + read_file(fs_dir_handle, s2w(&module_name), &module_binary, NULL); /* Save address and size */ file_name->addr = module_binary.addr; @@ -895,6 +894,10 @@ static int __init efi_check_dt_boot(EFI_LOADED_IMAGE *loaded_image) modules_found += ret; } + /* allocate_module_file could have allocated the handle, if so, close it */ + if ( fs_dir_handle ) + fs_dir_handle->Close(fs_dir_handle); + /* Free boot modules file names if any */ for ( ; i < modules_idx; i++ ) { I’ve not tested these changes, but I’ve built them for arm/x86 and they build. What everyone think about that? Cheers, Luca
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |