[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH-4.16] arm/efi: Improve performance requesting filesystem handle
On Tue, 16 Nov 2021, Luca Fancellu wrote: > Currently, the code used to handle and possibly load from the filesystem > modules defined in the DT is allocating and closing the filesystem handle > for each module to be loaded. > > To improve the performance, the filesystem handle pointer is passed > through the call stack, requested when it's needed only once and closed > if it was allocated. > > Signed-off-by: Luca Fancellu <luca.fancellu@xxxxxxx> This is great, thanks Luca! Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > Justification for integration in 4.16: > Upside: Fixes a performance issue only on arm that would be really useful > for ARM users using the release, no functional changes. > Downside: It's affecting the EFI boot path (only on ARM). > Risk: Risk is low given the small changes. As mentioned on IRC to Ian, the reason I said I'd be happy to see it in 4.16 is that it is addressing the leftover open issue from the original patch which was committed a bit too quickly (if you recall you asked me if I thought it should be reverted). But now at this stage it is hard to disagree that it should go in when the window reopens. So I think we can queue it in the Xen on ARM temporary for-next branch. > Tested in this configurations: > - Bootloader loads modules and specify them as multiboot modules in DT: > * combination of Dom0, DomUs, Dom0 and DomUs > - DT specifies multiboot modules in DT using xen,uefi-binary property: > * combination of Dom0, DomUs, Dom0 and DomUs > - Bootloader loads a Dom0 module and appends it as multiboot module in DT, > other multiboot modules are listed for DomUs using xen,uefi-binary > - No multiboot modules in DT and no kernel entry in cfg file: > * proper error thrown > --- > xen/arch/arm/efi/efi-boot.h | 33 +++++++++++++++++++++------------ > 1 file changed, 21 insertions(+), 12 deletions(-) > > diff --git a/xen/arch/arm/efi/efi-boot.h b/xen/arch/arm/efi/efi-boot.h > index 458cfbbed4..c4ed412845 100644 > --- a/xen/arch/arm/efi/efi-boot.h > +++ b/xen/arch/arm/efi/efi-boot.h > @@ -45,14 +45,17 @@ void __flush_dcache_area(const void *vaddr, unsigned long > size); > static int get_module_file_index(const char *name, unsigned int name_len); > static void PrintMessage(const CHAR16 *s); > static int allocate_module_file(EFI_LOADED_IMAGE *loaded_image, > + EFI_FILE_HANDLE *dir_handle, > const char *name, > unsigned int name_len); > static int handle_module_node(EFI_LOADED_IMAGE *loaded_image, > + EFI_FILE_HANDLE *dir_handle, > int module_node_offset, > int reg_addr_cells, > int reg_size_cells, > bool is_domu_module); > static int handle_dom0less_domain_node(EFI_LOADED_IMAGE *loaded_image, > + EFI_FILE_HANDLE *dir_handle, > int domain_node); > static int efi_check_dt_boot(EFI_LOADED_IMAGE *loaded_image); > > @@ -648,10 +651,10 @@ static void __init PrintMessage(const CHAR16 *s) > * index of the file in the modules array or a negative number on error. > */ > static int __init allocate_module_file(EFI_LOADED_IMAGE *loaded_image, > + EFI_FILE_HANDLE *dir_handle, > const char *name, > unsigned int name_len) > { > - EFI_FILE_HANDLE dir_handle; > module_name *file_name; > CHAR16 *fname; > union string module_name; > @@ -686,12 +689,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 ( !*dir_handle ) > + *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(*dir_handle, s2w(&module_name), &module_binary, NULL); > > /* Save address and size */ > file_name->addr = module_binary.addr; > @@ -712,6 +714,7 @@ static int __init allocate_module_file(EFI_LOADED_IMAGE > *loaded_image, > * Returns 1 if module is multiboot,module, 0 if not, < 0 on error > */ > static int __init handle_module_node(EFI_LOADED_IMAGE *loaded_image, > + EFI_FILE_HANDLE *dir_handle, > int module_node_offset, > int reg_addr_cells, > int reg_size_cells, > @@ -744,8 +747,8 @@ static int __init handle_module_node(EFI_LOADED_IMAGE > *loaded_image, > file_idx = get_module_file_index(uefi_name_prop, uefi_name_len); > if ( file_idx < 0 ) > { > - file_idx = allocate_module_file(loaded_image, uefi_name_prop, > - uefi_name_len); > + file_idx = allocate_module_file(loaded_image, dir_handle, > + uefi_name_prop, uefi_name_len); > if ( file_idx < 0 ) > return file_idx; > } > @@ -812,6 +815,7 @@ static int __init handle_module_node(EFI_LOADED_IMAGE > *loaded_image, > * Returns number of multiboot,module found or negative number on error. > */ > static int __init handle_dom0less_domain_node(EFI_LOADED_IMAGE *loaded_image, > + EFI_FILE_HANDLE *dir_handle, > int domain_node) > { > int module_node, addr_cells, size_cells, len; > @@ -842,8 +846,8 @@ static int __init > handle_dom0less_domain_node(EFI_LOADED_IMAGE *loaded_image, > module_node > 0; > module_node = fdt_next_subnode(fdt, module_node) ) > { > - int ret = handle_module_node(loaded_image, module_node, addr_cells, > - size_cells, true); > + int ret = handle_module_node(loaded_image, dir_handle, module_node, > + addr_cells, size_cells, true); > if ( ret < 0 ) > return ret; > > @@ -862,6 +866,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; > + EFI_FILE_HANDLE dir_handle = NULL; > > /* Check for the chosen node in the current DTB */ > chosen = setup_chosen_node(fdt, &addr_len, &size_len); > @@ -881,20 +886,24 @@ static int __init efi_check_dt_boot(EFI_LOADED_IMAGE > *loaded_image) > if ( !fdt_node_check_compatible(fdt, node, "xen,domain") ) > { > /* Found a node with compatible xen,domain; handle this node. */ > - ret = handle_dom0less_domain_node(loaded_image, node); > + ret = handle_dom0less_domain_node(loaded_image, &dir_handle, > node); > if ( ret < 0 ) > return ERROR_DT_MODULE_DOMU; > } > else > { > - ret = handle_module_node(loaded_image, node, addr_len, size_len, > - false); > + ret = handle_module_node(loaded_image, &dir_handle, node, > addr_len, > + size_len, false); > if ( ret < 0 ) > return ERROR_DT_MODULE_DOM0; > } > modules_found += ret; > } > > + /* dir_handle can be allocated in allocate_module_file, free it if > exists */ > + if ( dir_handle ) > + dir_handle->Close(dir_handle); > + > /* Free boot modules file names if any */ > for ( ; i < modules_idx; i++ ) > { > -- > 2.17.1 >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |