[PATCH] efi_selftests: fix controllers repeated selftesting
Heinrich Schuchardt
xypron.glpk at gmx.de
Tue Jun 13 17:00:05 CEST 2023
On 6/13/23 15:23, Ilias Apalodimas wrote:
> Running the controller selftest more than one times fails with
>
> => setenv efi_selftest 'controllers' && bootefi selftest
> Testing EFI API implementation
> Selected test: 'controllers'
> Setting up 'controllers'
> Setting up 'controllers' succeeded
> Executing 'controllers'
> Executing 'controllers' succeeded
> Summary: 0 failures
>
> => bootefi selftest
> Testing EFI API implementation
> Selected test: 'controllers'
> Setting up 'controllers'
> lib/efi_selftest/efi_selftest_controllers.c(280):
> ERROR: InstallProtocolInterface failed
> lib/efi_selftest/efi_selftest.c(89):
> ERROR: Setting up 'controllers' failed
> Summary: 1 failures
>
> There are multiple reason for this. We don't uninstall the binding
> interface from the controller handle and we don't reset the handle
> pointers either. So let's uninstall all the protocols properly and
> reset the handles to NULL on setup().
>
> While at it add a forgotten check when uninstalling protocols from the
> handle_controller and make sure the number of child controllers is 0
>
> Signed-off-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
> ---
> lib/efi_selftest/efi_selftest_controllers.c | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/lib/efi_selftest/efi_selftest_controllers.c b/lib/efi_selftest/efi_selftest_controllers.c
> index d2bbd1c4f65b..07a17ed866a9 100644
> --- a/lib/efi_selftest/efi_selftest_controllers.c
> +++ b/lib/efi_selftest/efi_selftest_controllers.c
> @@ -271,6 +271,8 @@ static int setup(const efi_handle_t img_handle,
> efi_status_t ret;
>
> boottime = systable->boottime;
> + handle_controller = NULL;
> + handle_driver = NULL;
Other instances of the same problem could be in
lib/efi_selftest/efi_selftest_open_protocol.c
lib/efi_selftest/efi_selftest_loadimage.c
lib/efi_selftest/efi_selftest_manageprotocols.c
We should probably try for each test if it can be repeated.
>
> /* Create controller handle */
> ret = boottime->install_protocol_interface(
> @@ -402,8 +404,18 @@ static int execute(void)
> /* Check number of child controllers */
> ret = count_child_controllers(handle_controller, &guid_controller,
> &count);
> - if (ret == EFI_SUCCESS)
> + if (ret == EFI_SUCCESS || count != 0)
> efi_st_error("Uninstall failed\n");
> +
> + /* Uninstall binding protocol */
> + ret = boottime->uninstall_protocol_interface(handle_driver,
> + &guid_driver_binding_protocol,
> + &binding_interface);
> + if (ret != EFI_SUCCESS) {
> + efi_st_error("Failed to uninstall protocols\n");
> + return EFI_ST_FAILURE;
> + }
> +
Could this easily be moved to teardown()?
Best regards
Heinrich
> return EFI_ST_SUCCESS;
> }
>
More information about the U-Boot
mailing list