[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